)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":6162,"name":"Dan Nguyen","email":"dan.nguyens.mail@gmail.com","username":"daniel-a-nguyen"},"change_message_id":"cfec92f0aa1cc99bf83ed4924250d9c516d6c10c","unresolved":false,"context_lines":[{"line_number":22,"context_line":"TODOs:"},{"line_number":23,"context_line":"* Hook this up to the admin API"},{"line_number":24,"context_line":"* Do some end-to-end testing, and *perhaps* Tempest tests?"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"Change-Id: Ibbd6f47c370d8f10c08cba358574b55e3059dcd1"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"5a5ae5dd_2b027d0c","line":25,"updated":"2016-02-08 23:17:50.000000000","message":"Maybe reference this bug\n\nhttps://bugs.launchpad.net/keystone/+bug/1535878","commit_id":"9e9fade02f3b2d443282dc463a35a257f5536958"},{"author":{"_account_id":16708,"name":"Kendall Nelson","display_name":"Kendall (diablo_rojo)","email":"kennelson11@gmail.com","username":"kjnelson"},"change_message_id":"6b057693b70c2dcac30280f1ec6961ff172c3bcc","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Ryan McNair \u003crdmcnair@us.ibm.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2016-02-09 17:28:05 +0000"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Split out NestedQuotas into a separate driver"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Fixes the following issues with NestedQuotas:"},{"line_number":10,"context_line":"  * Requires conf setting change to use nested quota driver"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"3a57f1b5_d78f58ca","line":7,"range":{"start_line":7,"start_character":0,"end_line":7,"end_character":45},"updated":"2016-02-11 14:33:26.000000000","message":"Separating NestedQuotas out into a separate driver should have a DocImpact since it\u0027s not that way currently(that I know of) in the documentation. Also needs the tag cause the behavior of how its decided that NestedQuotas needs to be used is different than before.","commit_id":"2fd53b992f6646aca9f2816cefa52c3425c45843"},{"author":{"_account_id":8912,"name":"Ryan McNair","email":"rdmcnair@us.ibm.com","username":"rdmcnair"},"change_message_id":"4a8a1c1663073173792c690e6c1aea79163d1a96","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Ryan McNair \u003crdmcnair@us.ibm.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2016-02-09 17:28:05 +0000"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Split out NestedQuotas into a separate driver"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Fixes the following issues with NestedQuotas:"},{"line_number":10,"context_line":"  * Requires conf setting change to use nested quota driver"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"3a57f1b5_58bb94e5","line":7,"range":{"start_line":7,"start_character":0,"end_line":7,"end_character":45},"in_reply_to":"3a57f1b5_d78f58ca","updated":"2016-02-11 15:56:33.000000000","message":"Done","commit_id":"2fd53b992f6646aca9f2816cefa52c3425c45843"},{"author":{"_account_id":7198,"name":"Jay Bryant","email":"jungleboyj@electronicjungle.net","username":"jsbryant"},"change_message_id":"6b125a29173c67b89d4d338f8c777632f889fae8","unresolved":false,"context_lines":[{"line_number":17,"context_line":""},{"line_number":18,"context_line":"There will be follow-up patches with the following improvements:"},{"line_number":19,"context_line":"  * make -1 limits functional for child projects"},{"line_number":20,"context_line":"  * cache the Keystone project heirarchies to improve efficiency"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"Note: ideally validation of nested quotas would occur in the setup"},{"line_number":23,"context_line":"of the nested quota driver, but doing the validation requires a"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"3a57f1b5_3e734f17","line":20,"range":{"start_line":20,"start_character":4,"end_line":20,"end_character":64},"updated":"2016-02-11 02:06:40.000000000","message":"Need to make sure to have a bug open for this please.","commit_id":"2fd53b992f6646aca9f2816cefa52c3425c45843"},{"author":{"_account_id":7198,"name":"Jay Bryant","email":"jungleboyj@electronicjungle.net","username":"jsbryant"},"change_message_id":"6b125a29173c67b89d4d338f8c777632f889fae8","unresolved":false,"context_lines":[{"line_number":28,"context_line":""},{"line_number":29,"context_line":"Change-Id: Ibbd6f47c370d8f10c08cba358574b55e3059dcd1"},{"line_number":30,"context_line":"Closes-Bug: #1531502"},{"line_number":31,"context_line":"Partially-Bug: #1537189"},{"line_number":32,"context_line":"Related-Bug: #1535878"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"3a57f1b5_7e222703","line":31,"range":{"start_line":31,"start_character":0,"end_line":31,"end_character":9},"updated":"2016-02-11 02:06:40.000000000","message":"Partial-Bug","commit_id":"2fd53b992f6646aca9f2816cefa52c3425c45843"},{"author":{"_account_id":8912,"name":"Ryan McNair","email":"rdmcnair@us.ibm.com","username":"rdmcnair"},"change_message_id":"4a8a1c1663073173792c690e6c1aea79163d1a96","unresolved":false,"context_lines":[{"line_number":28,"context_line":""},{"line_number":29,"context_line":"Change-Id: Ibbd6f47c370d8f10c08cba358574b55e3059dcd1"},{"line_number":30,"context_line":"Closes-Bug: #1531502"},{"line_number":31,"context_line":"Partially-Bug: #1537189"},{"line_number":32,"context_line":"Related-Bug: #1535878"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"3a57f1b5_18b51ced","line":31,"range":{"start_line":31,"start_character":0,"end_line":31,"end_character":9},"in_reply_to":"3a57f1b5_7e222703","updated":"2016-02-11 15:56:33.000000000","message":"Done","commit_id":"2fd53b992f6646aca9f2816cefa52c3425c45843"}],"cinder/api/contrib/quotas.py":[{"author":{"_account_id":7198,"name":"Jay Bryant","email":"jungleboyj@electronicjungle.net","username":"jsbryant"},"change_message_id":"6b125a29173c67b89d4d338f8c777632f889fae8","unresolved":false,"context_lines":[{"line_number":415,"context_line":"                for key, value in project_quotas.items():"},{"line_number":416,"context_line":"                    project_hard_limit \u003d project_quotas[key][\u0027limit\u0027]"},{"line_number":417,"context_line":"                    parent_allocated \u003d parent_project_quotas[key][\u0027allocated\u0027]"},{"line_number":418,"context_line":"                    parent_allocated -\u003d project_hard_limit"},{"line_number":419,"context_line":"                    db.quota_allocated_update(context, parent_id, key,"},{"line_number":420,"context_line":"                                              parent_allocated)"},{"line_number":421,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a57f1b5_e1267ab9","line":418,"range":{"start_line":418,"start_character":40,"end_line":418,"end_character":58},"updated":"2016-02-11 02:06:40.000000000","message":"I am not following this.  The allocated amount of the parent is the amount allocated - the hard limit?  That seems like that is the amount remaining to allocate.","commit_id":"2fd53b992f6646aca9f2816cefa52c3425c45843"},{"author":{"_account_id":8912,"name":"Ryan McNair","email":"rdmcnair@us.ibm.com","username":"rdmcnair"},"change_message_id":"4a8a1c1663073173792c690e6c1aea79163d1a96","unresolved":false,"context_lines":[{"line_number":415,"context_line":"                for key, value in project_quotas.items():"},{"line_number":416,"context_line":"                    project_hard_limit \u003d project_quotas[key][\u0027limit\u0027]"},{"line_number":417,"context_line":"                    parent_allocated \u003d parent_project_quotas[key][\u0027allocated\u0027]"},{"line_number":418,"context_line":"                    parent_allocated -\u003d project_hard_limit"},{"line_number":419,"context_line":"                    db.quota_allocated_update(context, parent_id, key,"},{"line_number":420,"context_line":"                                              parent_allocated)"},{"line_number":421,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a57f1b5_02792d2f","line":418,"range":{"start_line":418,"start_character":40,"end_line":418,"end_character":58},"in_reply_to":"3a57f1b5_9786c063","updated":"2016-02-11 15:56:33.000000000","message":"The \"allocated\" quota for a project is the amount of quota that has been \"given\" to it\u0027s children.  This is part of the delete request, where if a child project is getting deleted, and quota that has been \"given\" to it should be restored to the parent.  That is why we have the -\u003d logic here.  Also, just a heads up none of the logic in this code block has changed, it\u0027s inside an if statement now so it\u0027s indented one more.","commit_id":"2fd53b992f6646aca9f2816cefa52c3425c45843"},{"author":{"_account_id":16708,"name":"Kendall Nelson","display_name":"Kendall (diablo_rojo)","email":"kennelson11@gmail.com","username":"kjnelson"},"change_message_id":"6b057693b70c2dcac30280f1ec6961ff172c3bcc","unresolved":false,"context_lines":[{"line_number":415,"context_line":"                for key, value in project_quotas.items():"},{"line_number":416,"context_line":"                    project_hard_limit \u003d project_quotas[key][\u0027limit\u0027]"},{"line_number":417,"context_line":"                    parent_allocated \u003d parent_project_quotas[key][\u0027allocated\u0027]"},{"line_number":418,"context_line":"                    parent_allocated -\u003d project_hard_limit"},{"line_number":419,"context_line":"                    db.quota_allocated_update(context, parent_id, key,"},{"line_number":420,"context_line":"                                              parent_allocated)"},{"line_number":421,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a57f1b5_9786c063","line":418,"range":{"start_line":418,"start_character":40,"end_line":418,"end_character":58},"in_reply_to":"3a57f1b5_e1267ab9","updated":"2016-02-11 14:33:26.000000000","message":"Maybe I\u0027m wrong, but shouldn\u0027t you be doing: project_hard_limit-\u003d parent_allocated ? I don\u0027t understand why you would subtract the project_hard_limit from the parent_allocated because I would think that could result in a negative number?","commit_id":"2fd53b992f6646aca9f2816cefa52c3425c45843"},{"author":{"_account_id":7198,"name":"Jay Bryant","email":"jungleboyj@electronicjungle.net","username":"jsbryant"},"change_message_id":"6b125a29173c67b89d4d338f8c777632f889fae8","unresolved":false,"context_lines":[{"line_number":424,"context_line":"            except exception.AdminRequired:"},{"line_number":425,"context_line":"                raise webob.exc.HTTPForbidden()"},{"line_number":426,"context_line":""},{"line_number":427,"context_line":"    def validate_setup_for_nested_quota_use(self, req):"},{"line_number":428,"context_line":"        ctxt \u003d req.environ[\u0027cinder.context\u0027]"},{"line_number":429,"context_line":"        params \u003d req.params"},{"line_number":430,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a57f1b5_214c926f","line":427,"updated":"2016-02-11 02:06:40.000000000","message":"We really need an explanation of what this function is doing please.","commit_id":"2fd53b992f6646aca9f2816cefa52c3425c45843"},{"author":{"_account_id":8912,"name":"Ryan McNair","email":"rdmcnair@us.ibm.com","username":"rdmcnair"},"change_message_id":"4a8a1c1663073173792c690e6c1aea79163d1a96","unresolved":false,"context_lines":[{"line_number":424,"context_line":"            except exception.AdminRequired:"},{"line_number":425,"context_line":"                raise webob.exc.HTTPForbidden()"},{"line_number":426,"context_line":""},{"line_number":427,"context_line":"    def validate_setup_for_nested_quota_use(self, req):"},{"line_number":428,"context_line":"        ctxt \u003d req.environ[\u0027cinder.context\u0027]"},{"line_number":429,"context_line":"        params \u003d req.params"},{"line_number":430,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a57f1b5_b8c4085f","line":427,"in_reply_to":"3a57f1b5_214c926f","updated":"2016-02-11 15:56:33.000000000","message":"Done","commit_id":"2fd53b992f6646aca9f2816cefa52c3425c45843"},{"author":{"_account_id":8866,"name":"Raildo Mascena de Sousa Filho","email":"rmascena@redhat.com","username":"raildo"},"change_message_id":"251904a5fdad77bb865e047871dc77c7ef618782","unresolved":false,"context_lines":[{"line_number":267,"context_line":"            raise webob.exc.HTTPBadRequest(explanation\u003dmsg)"},{"line_number":268,"context_line":""},{"line_number":269,"context_line":"        use_nested_quotas \u003d QUOTAS.using_nested_quotas()"},{"line_number":270,"context_line":"        if use_nested_quotas:"},{"line_number":271,"context_line":"            # Get the parent_id of the target project to verify whether we are"},{"line_number":272,"context_line":"            # dealing with hierarchical namespace or non-hierarchical namespace"},{"line_number":273,"context_line":"            target_project \u003d quota_utils.get_project_hierarchy("}],"source_content_type":"text/x-python","patch_set":6,"id":"3a57f1b5_e5e4d4ac","line":270,"updated":"2016-02-12 18:48:04.000000000","message":"you can just say:\n\nif QUOTAS.using_nested_quotas():","commit_id":"ab8d3b3c4a76038900ca987db5d9b41b51413944"},{"author":{"_account_id":8912,"name":"Ryan McNair","email":"rdmcnair@us.ibm.com","username":"rdmcnair"},"change_message_id":"376d08fa361df46631ff13607ec461cc90928450","unresolved":false,"context_lines":[{"line_number":267,"context_line":"            raise webob.exc.HTTPBadRequest(explanation\u003dmsg)"},{"line_number":268,"context_line":""},{"line_number":269,"context_line":"        use_nested_quotas \u003d QUOTAS.using_nested_quotas()"},{"line_number":270,"context_line":"        if use_nested_quotas:"},{"line_number":271,"context_line":"            # Get the parent_id of the target project to verify whether we are"},{"line_number":272,"context_line":"            # dealing with hierarchical namespace or non-hierarchical namespace"},{"line_number":273,"context_line":"            target_project \u003d quota_utils.get_project_hierarchy("}],"source_content_type":"text/x-python","patch_set":6,"id":"3a57f1b5_d953bc15","line":270,"in_reply_to":"3a57f1b5_e5e4d4ac","updated":"2016-02-12 21:19:30.000000000","message":"True, we were just using this value a few times later in this method, so I was just saving it off","commit_id":"ab8d3b3c4a76038900ca987db5d9b41b51413944"},{"author":{"_account_id":8866,"name":"Raildo Mascena de Sousa Filho","email":"rmascena@redhat.com","username":"raildo"},"change_message_id":"251904a5fdad77bb865e047871dc77c7ef618782","unresolved":false,"context_lines":[{"line_number":377,"context_line":"        except exception.NotAuthorized:"},{"line_number":378,"context_line":"            raise webob.exc.HTTPForbidden()"},{"line_number":379,"context_line":""},{"line_number":380,"context_line":"        if QUOTAS.using_nested_quotas():"},{"line_number":381,"context_line":"            # Get the parent_id of the target project to verify whether we are"},{"line_number":382,"context_line":"            # dealing with hierarchical namespace or non-hierarchical"},{"line_number":383,"context_line":"            # namespace."},{"line_number":384,"context_line":"            target_project \u003d quota_utils.get_project_hierarchy("},{"line_number":385,"context_line":"                context, id)"},{"line_number":386,"context_line":"            parent_id \u003d target_project.parent_id"},{"line_number":387,"context_line":"            # If the project which is being deleted has allocated part of its"},{"line_number":388,"context_line":"            # quota to its subprojects, then subprojects\u0027 quotas should be"},{"line_number":389,"context_line":"            # deleted first."},{"line_number":390,"context_line":"            for key, value in project_quotas.items():"},{"line_number":391,"context_line":"                if \u0027allocated\u0027 in project_quotas[key].keys():"},{"line_number":392,"context_line":"                    if project_quotas[key][\u0027allocated\u0027] !\u003d 0:"},{"line_number":393,"context_line":"                        msg \u003d _(\"About to delete child projects having \""},{"line_number":394,"context_line":"                                \"non-zero quota. This should not be performed\")"},{"line_number":395,"context_line":"                        raise webob.exc.HTTPBadRequest(explanation\u003dmsg)"},{"line_number":396,"context_line":""},{"line_number":397,"context_line":"            if parent_id:"},{"line_number":398,"context_line":"                # Get the children of the project which the token is scoped to"},{"line_number":399,"context_line":"                # in order to know if the target_project is in its hierarchy."},{"line_number":400,"context_line":"                context_project \u003d quota_utils.get_project_hierarchy("},{"line_number":401,"context_line":"                    context, context.project_id, subtree_as_ids\u003dTrue)"},{"line_number":402,"context_line":"                self._authorize_update_or_delete(context_project,"},{"line_number":403,"context_line":"                                                 target_project.id,"},{"line_number":404,"context_line":"                                                 parent_id)"},{"line_number":405,"context_line":"                parent_project_quotas \u003d QUOTAS.get_project_quotas("},{"line_number":406,"context_line":"                    context, parent_id)"},{"line_number":407,"context_line":""},{"line_number":408,"context_line":"                # Delete child quota first and later update parent\u0027s quota."},{"line_number":409,"context_line":"                try:"},{"line_number":410,"context_line":"                    db.quota_destroy_by_project(context, target_project.id)"},{"line_number":411,"context_line":"                except exception.AdminRequired:"},{"line_number":412,"context_line":"                    raise webob.exc.HTTPForbidden()"},{"line_number":413,"context_line":""},{"line_number":414,"context_line":"                # Update the allocated of the parent"},{"line_number":415,"context_line":"                for key, value in project_quotas.items():"},{"line_number":416,"context_line":"                    project_hard_limit \u003d project_quotas[key][\u0027limit\u0027]"},{"line_number":417,"context_line":"                    parent_allocated \u003d parent_project_quotas[key][\u0027allocated\u0027]"},{"line_number":418,"context_line":"                    parent_allocated -\u003d project_hard_limit"},{"line_number":419,"context_line":"                    db.quota_allocated_update(context, parent_id, key,"},{"line_number":420,"context_line":"                                              parent_allocated)"},{"line_number":421,"context_line":"        else:"},{"line_number":422,"context_line":"            try:"},{"line_number":423,"context_line":"                db.quota_destroy_by_project(context, id)"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a57f1b5_65e784ac","line":420,"range":{"start_line":380,"start_character":3,"end_line":420,"end_character":63},"updated":"2016-02-12 18:48:04.000000000","message":"This if case are huge, create a new method (or more than one) for this case.","commit_id":"ab8d3b3c4a76038900ca987db5d9b41b51413944"},{"author":{"_account_id":8912,"name":"Ryan McNair","email":"rdmcnair@us.ibm.com","username":"rdmcnair"},"change_message_id":"376d08fa361df46631ff13607ec461cc90928450","unresolved":false,"context_lines":[{"line_number":377,"context_line":"        except exception.NotAuthorized:"},{"line_number":378,"context_line":"            raise webob.exc.HTTPForbidden()"},{"line_number":379,"context_line":""},{"line_number":380,"context_line":"        if QUOTAS.using_nested_quotas():"},{"line_number":381,"context_line":"            # Get the parent_id of the target project to verify whether we are"},{"line_number":382,"context_line":"            # dealing with hierarchical namespace or non-hierarchical"},{"line_number":383,"context_line":"            # namespace."},{"line_number":384,"context_line":"            target_project \u003d quota_utils.get_project_hierarchy("},{"line_number":385,"context_line":"                context, id)"},{"line_number":386,"context_line":"            parent_id \u003d target_project.parent_id"},{"line_number":387,"context_line":"            # If the project which is being deleted has allocated part of its"},{"line_number":388,"context_line":"            # quota to its subprojects, then subprojects\u0027 quotas should be"},{"line_number":389,"context_line":"            # deleted first."},{"line_number":390,"context_line":"            for key, value in project_quotas.items():"},{"line_number":391,"context_line":"                if \u0027allocated\u0027 in project_quotas[key].keys():"},{"line_number":392,"context_line":"                    if project_quotas[key][\u0027allocated\u0027] !\u003d 0:"},{"line_number":393,"context_line":"                        msg \u003d _(\"About to delete child projects having \""},{"line_number":394,"context_line":"                                \"non-zero quota. This should not be performed\")"},{"line_number":395,"context_line":"                        raise webob.exc.HTTPBadRequest(explanation\u003dmsg)"},{"line_number":396,"context_line":""},{"line_number":397,"context_line":"            if parent_id:"},{"line_number":398,"context_line":"                # Get the children of the project which the token is scoped to"},{"line_number":399,"context_line":"                # in order to know if the target_project is in its hierarchy."},{"line_number":400,"context_line":"                context_project \u003d quota_utils.get_project_hierarchy("},{"line_number":401,"context_line":"                    context, context.project_id, subtree_as_ids\u003dTrue)"},{"line_number":402,"context_line":"                self._authorize_update_or_delete(context_project,"},{"line_number":403,"context_line":"                                                 target_project.id,"},{"line_number":404,"context_line":"                                                 parent_id)"},{"line_number":405,"context_line":"                parent_project_quotas \u003d QUOTAS.get_project_quotas("},{"line_number":406,"context_line":"                    context, parent_id)"},{"line_number":407,"context_line":""},{"line_number":408,"context_line":"                # Delete child quota first and later update parent\u0027s quota."},{"line_number":409,"context_line":"                try:"},{"line_number":410,"context_line":"                    db.quota_destroy_by_project(context, target_project.id)"},{"line_number":411,"context_line":"                except exception.AdminRequired:"},{"line_number":412,"context_line":"                    raise webob.exc.HTTPForbidden()"},{"line_number":413,"context_line":""},{"line_number":414,"context_line":"                # Update the allocated of the parent"},{"line_number":415,"context_line":"                for key, value in project_quotas.items():"},{"line_number":416,"context_line":"                    project_hard_limit \u003d project_quotas[key][\u0027limit\u0027]"},{"line_number":417,"context_line":"                    parent_allocated \u003d parent_project_quotas[key][\u0027allocated\u0027]"},{"line_number":418,"context_line":"                    parent_allocated -\u003d project_hard_limit"},{"line_number":419,"context_line":"                    db.quota_allocated_update(context, parent_id, key,"},{"line_number":420,"context_line":"                                              parent_allocated)"},{"line_number":421,"context_line":"        else:"},{"line_number":422,"context_line":"            try:"},{"line_number":423,"context_line":"                db.quota_destroy_by_project(context, id)"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a57f1b5_1946344f","line":420,"range":{"start_line":380,"start_character":3,"end_line":420,"end_character":63},"in_reply_to":"3a57f1b5_65e784ac","updated":"2016-02-12 21:19:30.000000000","message":"Good point, I will split this into one or more functions","commit_id":"ab8d3b3c4a76038900ca987db5d9b41b51413944"}],"cinder/exception.py":[{"author":{"_account_id":7198,"name":"Jay Bryant","email":"jungleboyj@electronicjungle.net","username":"jsbryant"},"change_message_id":"6b125a29173c67b89d4d338f8c777632f889fae8","unresolved":false,"context_lines":[{"line_number":377,"context_line":""},{"line_number":378,"context_line":""},{"line_number":379,"context_line":"class InvalidNestedQuotaSetup(CinderException):"},{"line_number":380,"context_line":"    message \u003d _(\"Project quotas are not setup validly for nested quotas: \""},{"line_number":381,"context_line":"                \"%(reason)s.\")"},{"line_number":382,"context_line":""},{"line_number":383,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"3a57f1b5_e1d0ba55","line":380,"range":{"start_line":380,"start_character":17,"end_line":380,"end_character":73},"updated":"2016-02-11 02:06:40.000000000","message":"This wording is rough.  Suggest:\n\n\"Project quotas are not properly setup for nested quotas: \"","commit_id":"2fd53b992f6646aca9f2816cefa52c3425c45843"},{"author":{"_account_id":8912,"name":"Ryan McNair","email":"rdmcnair@us.ibm.com","username":"rdmcnair"},"change_message_id":"4a8a1c1663073173792c690e6c1aea79163d1a96","unresolved":false,"context_lines":[{"line_number":377,"context_line":""},{"line_number":378,"context_line":""},{"line_number":379,"context_line":"class InvalidNestedQuotaSetup(CinderException):"},{"line_number":380,"context_line":"    message \u003d _(\"Project quotas are not setup validly for nested quotas: \""},{"line_number":381,"context_line":"                \"%(reason)s.\")"},{"line_number":382,"context_line":""},{"line_number":383,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"3a57f1b5_58a2b4af","line":380,"range":{"start_line":380,"start_character":17,"end_line":380,"end_character":73},"in_reply_to":"3a57f1b5_e1d0ba55","updated":"2016-02-11 15:56:33.000000000","message":"Done","commit_id":"2fd53b992f6646aca9f2816cefa52c3425c45843"}],"cinder/quota.py":[{"author":{"_account_id":7198,"name":"Jay Bryant","email":"jungleboyj@electronicjungle.net","username":"jsbryant"},"change_message_id":"6b125a29173c67b89d4d338f8c777632f889fae8","unresolved":false,"context_lines":[{"line_number":100,"context_line":"    def get_default(self, context, resource, parent_project_id\u003dNone):"},{"line_number":101,"context_line":"        \"\"\"Get a specific default quota for a resource."},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"        :param parent_project_id: The id of the current project\u0027s parent,"},{"line_number":104,"context_line":"                                  if any."},{"line_number":105,"context_line":"        \"\"\""},{"line_number":106,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"3a57f1b5_816ea694","side":"PARENT","line":103,"range":{"start_line":103,"start_character":7,"end_line":103,"end_character":73},"updated":"2016-02-11 02:06:40.000000000","message":"Is there a reason this was completely removed instead of just updated?","commit_id":"c9457d14522e47a992311ecad2beab569c67bf94"},{"author":{"_account_id":8912,"name":"Ryan McNair","email":"rdmcnair@us.ibm.com","username":"rdmcnair"},"change_message_id":"4a8a1c1663073173792c690e6c1aea79163d1a96","unresolved":false,"context_lines":[{"line_number":100,"context_line":"    def get_default(self, context, resource, parent_project_id\u003dNone):"},{"line_number":101,"context_line":"        \"\"\"Get a specific default quota for a resource."},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"        :param parent_project_id: The id of the current project\u0027s parent,"},{"line_number":104,"context_line":"                                  if any."},{"line_number":105,"context_line":"        \"\"\""},{"line_number":106,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"3a57f1b5_3dd56ab8","side":"PARENT","line":103,"range":{"start_line":103,"start_character":7,"end_line":103,"end_character":73},"in_reply_to":"3a57f1b5_816ea694","updated":"2016-02-11 15:56:33.000000000","message":"parent_project_id is no longer getting passed in because we were passing it in only half the time and it was causing issues calculating default values.  Instead we pushed the logic down further into the driver, and retrieve the parent of a project at the point we need it.","commit_id":"c9457d14522e47a992311ecad2beab569c67bf94"},{"author":{"_account_id":7198,"name":"Jay Bryant","email":"jungleboyj@electronicjungle.net","username":"jsbryant"},"change_message_id":"6b125a29173c67b89d4d338f8c777632f889fae8","unresolved":false,"context_lines":[{"line_number":543,"context_line":""},{"line_number":544,"context_line":"        if borked_allocated_quotas:"},{"line_number":545,"context_line":"            msg \u003d _(\"Invalid allocated quotas defined for the following \""},{"line_number":546,"context_line":"                    \"project quotas %s\") % borked_allocated_quotas"},{"line_number":547,"context_line":"            raise exception.InvalidNestedQuotaSetup(message\u003dmsg)"},{"line_number":548,"context_line":""},{"line_number":549,"context_line":"    def get_default(self, context, resource, project_id):"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a57f1b5_a1e722e3","line":546,"range":{"start_line":546,"start_character":29,"end_line":546,"end_character":35},"updated":"2016-02-11 02:06:40.000000000","message":"Suggest quotas:","commit_id":"2fd53b992f6646aca9f2816cefa52c3425c45843"},{"author":{"_account_id":8912,"name":"Ryan McNair","email":"rdmcnair@us.ibm.com","username":"rdmcnair"},"change_message_id":"4a8a1c1663073173792c690e6c1aea79163d1a96","unresolved":false,"context_lines":[{"line_number":543,"context_line":""},{"line_number":544,"context_line":"        if borked_allocated_quotas:"},{"line_number":545,"context_line":"            msg \u003d _(\"Invalid allocated quotas defined for the following \""},{"line_number":546,"context_line":"                    \"project quotas %s\") % borked_allocated_quotas"},{"line_number":547,"context_line":"            raise exception.InvalidNestedQuotaSetup(message\u003dmsg)"},{"line_number":548,"context_line":""},{"line_number":549,"context_line":"    def get_default(self, context, resource, project_id):"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a57f1b5_7893f04f","line":546,"range":{"start_line":546,"start_character":29,"end_line":546,"end_character":35},"in_reply_to":"3a57f1b5_a1e722e3","updated":"2016-02-11 15:56:33.000000000","message":"Done","commit_id":"2fd53b992f6646aca9f2816cefa52c3425c45843"},{"author":{"_account_id":8866,"name":"Raildo Mascena de Sousa Filho","email":"rmascena@redhat.com","username":"raildo"},"change_message_id":"251904a5fdad77bb865e047871dc77c7ef618782","unresolved":false,"context_lines":[{"line_number":459,"context_line":"            # Tuple of (current root node, subtree)"},{"line_number":460,"context_line":"            cur_project_id, project_subtree \u003d project_queue.popleft()"},{"line_number":461,"context_line":""},{"line_number":462,"context_line":"            if not project_subtree:"},{"line_number":463,"context_line":"                continue"},{"line_number":464,"context_line":""},{"line_number":465,"context_line":"            cur_project_quotas \u003d self.get_project_quotas("},{"line_number":466,"context_line":"                ctxt, resources, cur_project_id)"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a57f1b5_85eac072","line":463,"range":{"start_line":462,"start_character":0,"end_line":463,"end_character":24},"updated":"2016-02-12 18:48:04.000000000","message":"is this necessary?","commit_id":"ab8d3b3c4a76038900ca987db5d9b41b51413944"},{"author":{"_account_id":8912,"name":"Ryan McNair","email":"rdmcnair@us.ibm.com","username":"rdmcnair"},"change_message_id":"376d08fa361df46631ff13607ec461cc90928450","unresolved":false,"context_lines":[{"line_number":459,"context_line":"            # Tuple of (current root node, subtree)"},{"line_number":460,"context_line":"            cur_project_id, project_subtree \u003d project_queue.popleft()"},{"line_number":461,"context_line":""},{"line_number":462,"context_line":"            if not project_subtree:"},{"line_number":463,"context_line":"                continue"},{"line_number":464,"context_line":""},{"line_number":465,"context_line":"            cur_project_quotas \u003d self.get_project_quotas("},{"line_number":466,"context_line":"                ctxt, resources, cur_project_id)"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a57f1b5_79408807","line":463,"range":{"start_line":462,"start_character":0,"end_line":463,"end_character":24},"in_reply_to":"3a57f1b5_85eac072","updated":"2016-02-12 21:19:30.000000000","message":"This is needed, because otherwise we\u0027d try to grab the child projects of a leaf node, and project_subtree would be None.  I will leave a comment about that.  If you would prefer some code re-arrange instead of this continue, let me know and I\u0027ll work something up","commit_id":"ab8d3b3c4a76038900ca987db5d9b41b51413944"}],"cinder/quota_utils.py":[{"author":{"_account_id":7198,"name":"Jay Bryant","email":"jungleboyj@electronicjungle.net","username":"jsbryant"},"change_message_id":"6b125a29173c67b89d4d338f8c777632f889fae8","unresolved":false,"context_lines":[{"line_number":105,"context_line":"def get_project_hierarchy(context, project_id, subtree_as_ids\u003dFalse):"},{"line_number":106,"context_line":"    \"\"\"A Helper method to get the project hierarchy."},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"    Along with Hierachical Multitenancy in keystone API v3, projects can be"},{"line_number":109,"context_line":"    hierarchically organized. Therefore, we need to know the project"},{"line_number":110,"context_line":"    hierarchy, if any, in order to do nested quota operations properly."},{"line_number":111,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":5,"id":"3a57f1b5_7878f72b","line":108,"range":{"start_line":108,"start_character":15,"end_line":108,"end_character":26},"updated":"2016-02-11 02:06:40.000000000","message":"Hierarchical","commit_id":"2fd53b992f6646aca9f2816cefa52c3425c45843"},{"author":{"_account_id":8912,"name":"Ryan McNair","email":"rdmcnair@us.ibm.com","username":"rdmcnair"},"change_message_id":"4a8a1c1663073173792c690e6c1aea79163d1a96","unresolved":false,"context_lines":[{"line_number":105,"context_line":"def get_project_hierarchy(context, project_id, subtree_as_ids\u003dFalse):"},{"line_number":106,"context_line":"    \"\"\"A Helper method to get the project hierarchy."},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"    Along with Hierachical Multitenancy in keystone API v3, projects can be"},{"line_number":109,"context_line":"    hierarchically organized. Therefore, we need to know the project"},{"line_number":110,"context_line":"    hierarchy, if any, in order to do nested quota operations properly."},{"line_number":111,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":5,"id":"3a57f1b5_189afc63","line":108,"range":{"start_line":108,"start_character":15,"end_line":108,"end_character":26},"in_reply_to":"3a57f1b5_7878f72b","updated":"2016-02-11 15:56:33.000000000","message":"Done","commit_id":"2fd53b992f6646aca9f2816cefa52c3425c45843"},{"author":{"_account_id":8866,"name":"Raildo Mascena de Sousa Filho","email":"rmascena@redhat.com","username":"raildo"},"change_message_id":"251904a5fdad77bb865e047871dc77c7ef618782","unresolved":false,"context_lines":[{"line_number":17,"context_line":"from oslo_config import cfg"},{"line_number":18,"context_line":"from oslo_log import log as logging"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"from keystoneclient.auth.identity.generic import token"},{"line_number":21,"context_line":"from keystoneclient import client"},{"line_number":22,"context_line":"from keystoneclient import exceptions"},{"line_number":23,"context_line":"from keystoneclient import session"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"from cinder import exception"},{"line_number":26,"context_line":"from cinder.i18n import _, _LW"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a57f1b5_05f7b059","line":23,"range":{"start_line":20,"start_character":0,"end_line":23,"end_character":34},"updated":"2016-02-12 18:48:04.000000000","message":"We need change this for keystoneauth, I don\u0027t know if have to do this before/after this patch, but it\u0027s a good time to update it.","commit_id":"ab8d3b3c4a76038900ca987db5d9b41b51413944"},{"author":{"_account_id":8912,"name":"Ryan McNair","email":"rdmcnair@us.ibm.com","username":"rdmcnair"},"change_message_id":"376d08fa361df46631ff13607ec461cc90928450","unresolved":false,"context_lines":[{"line_number":17,"context_line":"from oslo_config import cfg"},{"line_number":18,"context_line":"from oslo_log import log as logging"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"from keystoneclient.auth.identity.generic import token"},{"line_number":21,"context_line":"from keystoneclient import client"},{"line_number":22,"context_line":"from keystoneclient import exceptions"},{"line_number":23,"context_line":"from keystoneclient import session"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"from cinder import exception"},{"line_number":26,"context_line":"from cinder.i18n import _, _LW"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a57f1b5_39769070","line":23,"range":{"start_line":20,"start_character":0,"end_line":23,"end_character":34},"in_reply_to":"3a57f1b5_05f7b059","updated":"2016-02-12 21:19:30.000000000","message":"Hey - what are the exact changes to be made?  I\u0027m not familiar with the change you\u0027re talking about.  I can  create a follow on patch, know we don\u0027t want this patch to grow much more.  It\u0027s pretty unwieldy as is (my fault) :/","commit_id":"ab8d3b3c4a76038900ca987db5d9b41b51413944"}],"cinder/tests/unit/api/contrib/test_quotas.py":[{"author":{"_account_id":7198,"name":"Jay Bryant","email":"jungleboyj@electronicjungle.net","username":"jsbryant"},"change_message_id":"6b125a29173c67b89d4d338f8c777632f889fae8","unresolved":false,"context_lines":[{"line_number":377,"context_line":"        |                 |"},{"line_number":378,"context_line":"        |     A    G   E  |"},{"line_number":379,"context_line":"        |    / \\       \\  |"},{"line_number":380,"context_line":"        |   B   C      F  |"},{"line_number":381,"context_line":"        |  /              |"},{"line_number":382,"context_line":"        | D               |"},{"line_number":383,"context_line":"        +-----------------+"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a57f1b5_18ab031f","line":380,"range":{"start_line":380,"start_character":23,"end_line":380,"end_character":24},"updated":"2016-02-11 02:06:40.000000000","message":"Is F supposed to be a child of E? Needs to be over one more space.","commit_id":"2fd53b992f6646aca9f2816cefa52c3425c45843"},{"author":{"_account_id":8912,"name":"Ryan McNair","email":"rdmcnair@us.ibm.com","username":"rdmcnair"},"change_message_id":"4a8a1c1663073173792c690e6c1aea79163d1a96","unresolved":false,"context_lines":[{"line_number":377,"context_line":"        |                 |"},{"line_number":378,"context_line":"        |     A    G   E  |"},{"line_number":379,"context_line":"        |    / \\       \\  |"},{"line_number":380,"context_line":"        |   B   C      F  |"},{"line_number":381,"context_line":"        |  /              |"},{"line_number":382,"context_line":"        | D               |"},{"line_number":383,"context_line":"        +-----------------+"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a57f1b5_98c58c3d","line":380,"range":{"start_line":380,"start_character":23,"end_line":380,"end_character":24},"in_reply_to":"3a57f1b5_18ab031f","updated":"2016-02-11 15:56:33.000000000","message":"Done","commit_id":"2fd53b992f6646aca9f2816cefa52c3425c45843"},{"author":{"_account_id":7198,"name":"Jay Bryant","email":"jungleboyj@electronicjungle.net","username":"jsbryant"},"change_message_id":"6b125a29173c67b89d4d338f8c777632f889fae8","unresolved":false,"context_lines":[{"line_number":387,"context_line":"        self.E \u003d self.FakeProject(id\u003duuid.uuid4().hex, parent_id\u003dNone)"},{"line_number":388,"context_line":"        self.F \u003d self.FakeProject(id\u003duuid.uuid4().hex, parent_id\u003dself.E.id)"},{"line_number":389,"context_line":"        self.G \u003d self.FakeProject(id\u003duuid.uuid4().hex, parent_id\u003dNone)"},{"line_number":390,"context_line":""},{"line_number":391,"context_line":"        self.E.subtree \u003d {self.F.id: self.F.subtree}"},{"line_number":392,"context_line":""},{"line_number":393,"context_line":"        self.project_by_id.update({self.E.id: self.E, self.F.id: self.F,"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a57f1b5_3854bf1f","line":390,"updated":"2016-02-11 02:06:40.000000000","message":"Are A, B, C and D determined by the test cases below?  If so, can you mention that in the comments above?  Thanks!  Otherwise, where are they being defined?","commit_id":"2fd53b992f6646aca9f2816cefa52c3425c45843"},{"author":{"_account_id":8912,"name":"Ryan McNair","email":"rdmcnair@us.ibm.com","username":"rdmcnair"},"change_message_id":"4a8a1c1663073173792c690e6c1aea79163d1a96","unresolved":false,"context_lines":[{"line_number":387,"context_line":"        self.E \u003d self.FakeProject(id\u003duuid.uuid4().hex, parent_id\u003dNone)"},{"line_number":388,"context_line":"        self.F \u003d self.FakeProject(id\u003duuid.uuid4().hex, parent_id\u003dself.E.id)"},{"line_number":389,"context_line":"        self.G \u003d self.FakeProject(id\u003duuid.uuid4().hex, parent_id\u003dNone)"},{"line_number":390,"context_line":""},{"line_number":391,"context_line":"        self.E.subtree \u003d {self.F.id: self.F.subtree}"},{"line_number":392,"context_line":""},{"line_number":393,"context_line":"        self.project_by_id.update({self.E.id: self.E, self.F.id: self.F,"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a57f1b5_98358cdb","line":390,"in_reply_to":"3a57f1b5_3854bf1f","updated":"2016-02-11 15:56:33.000000000","message":"This test class inherits from QuotaSetsControllerTestBase, which is where A, B, C, D  already get defined","commit_id":"2fd53b992f6646aca9f2816cefa52c3425c45843"},{"author":{"_account_id":7198,"name":"Jay Bryant","email":"jungleboyj@electronicjungle.net","username":"jsbryant"},"change_message_id":"6b125a29173c67b89d4d338f8c777632f889fae8","unresolved":false,"context_lines":[{"line_number":550,"context_line":"        self.assertDictMatch(expected, result)"},{"line_number":551,"context_line":""},{"line_number":552,"context_line":"    def test_subproject_show_in_hierarchy(self):"},{"line_number":553,"context_line":"        # An user scoped to a root project in an hierarchy can see its children"},{"line_number":554,"context_line":"        # quotas."},{"line_number":555,"context_line":"        self.req.environ[\u0027cinder.context\u0027].project_id \u003d self.A.id"},{"line_number":556,"context_line":"        result \u003d self.controller.show(self.req, self.D.id)"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a57f1b5_3319407a","line":553,"range":{"start_line":553,"start_character":10,"end_line":553,"end_character":12},"updated":"2016-02-11 02:06:40.000000000","message":"A","commit_id":"2fd53b992f6646aca9f2816cefa52c3425c45843"},{"author":{"_account_id":7198,"name":"Jay Bryant","email":"jungleboyj@electronicjungle.net","username":"jsbryant"},"change_message_id":"6b125a29173c67b89d4d338f8c777632f889fae8","unresolved":false,"context_lines":[{"line_number":550,"context_line":"        self.assertDictMatch(expected, result)"},{"line_number":551,"context_line":""},{"line_number":552,"context_line":"    def test_subproject_show_in_hierarchy(self):"},{"line_number":553,"context_line":"        # An user scoped to a root project in an hierarchy can see its children"},{"line_number":554,"context_line":"        # quotas."},{"line_number":555,"context_line":"        self.req.environ[\u0027cinder.context\u0027].project_id \u003d self.A.id"},{"line_number":556,"context_line":"        result \u003d self.controller.show(self.req, self.D.id)"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a57f1b5_b323f0a6","line":553,"range":{"start_line":553,"start_character":47,"end_line":553,"end_character":48},"updated":"2016-02-11 02:06:40.000000000","message":"A","commit_id":"2fd53b992f6646aca9f2816cefa52c3425c45843"},{"author":{"_account_id":8912,"name":"Ryan McNair","email":"rdmcnair@us.ibm.com","username":"rdmcnair"},"change_message_id":"4a8a1c1663073173792c690e6c1aea79163d1a96","unresolved":false,"context_lines":[{"line_number":550,"context_line":"        self.assertDictMatch(expected, result)"},{"line_number":551,"context_line":""},{"line_number":552,"context_line":"    def test_subproject_show_in_hierarchy(self):"},{"line_number":553,"context_line":"        # An user scoped to a root project in an hierarchy can see its children"},{"line_number":554,"context_line":"        # quotas."},{"line_number":555,"context_line":"        self.req.environ[\u0027cinder.context\u0027].project_id \u003d self.A.id"},{"line_number":556,"context_line":"        result \u003d self.controller.show(self.req, self.D.id)"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a57f1b5_5805d477","line":553,"range":{"start_line":553,"start_character":10,"end_line":553,"end_character":12},"in_reply_to":"3a57f1b5_3319407a","updated":"2016-02-11 15:56:33.000000000","message":"Done","commit_id":"2fd53b992f6646aca9f2816cefa52c3425c45843"},{"author":{"_account_id":7198,"name":"Jay Bryant","email":"jungleboyj@electronicjungle.net","username":"jsbryant"},"change_message_id":"6b125a29173c67b89d4d338f8c777632f889fae8","unresolved":false,"context_lines":[{"line_number":556,"context_line":"        result \u003d self.controller.show(self.req, self.D.id)"},{"line_number":557,"context_line":"        expected \u003d make_subproject_body(tenant_id\u003dself.D.id)"},{"line_number":558,"context_line":"        self.assertDictMatch(expected, result)"},{"line_number":559,"context_line":"        # An user scoped to a parent project can see its immediate children"},{"line_number":560,"context_line":"        # quotas."},{"line_number":561,"context_line":"        self.req.environ[\u0027cinder.context\u0027].project_id \u003d self.B.id"},{"line_number":562,"context_line":"        result \u003d self.controller.show(self.req, self.D.id)"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a57f1b5_d34d4c73","line":559,"range":{"start_line":559,"start_character":9,"end_line":559,"end_character":12},"updated":"2016-02-11 02:06:40.000000000","message":"A","commit_id":"2fd53b992f6646aca9f2816cefa52c3425c45843"},{"author":{"_account_id":8866,"name":"Raildo Mascena de Sousa Filho","email":"rmascena@redhat.com","username":"raildo"},"change_message_id":"251904a5fdad77bb865e047871dc77c7ef618782","unresolved":false,"context_lines":[{"line_number":59,"context_line":"            resources[\u0027snapshots_\u0027 + volume_type] \u003d -1"},{"line_number":60,"context_line":"            resources[\u0027volumes_\u0027 + volume_type] \u003d -1"},{"line_number":61,"context_line":"    elif per_volume_gigabytes \u003c 0:"},{"line_number":62,"context_line":"        resources[\u0027per_volume_gigabytes\u0027] \u003d 10000"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"    if tenant_id:"},{"line_number":65,"context_line":"        resources[\u0027id\u0027] \u003d tenant_id"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a57f1b5_c59bd816","line":62,"range":{"start_line":62,"start_character":0,"end_line":62,"end_character":49},"updated":"2016-02-12 18:48:04.000000000","message":"why 10000? sounds like a magic number","commit_id":"ab8d3b3c4a76038900ca987db5d9b41b51413944"},{"author":{"_account_id":8912,"name":"Ryan McNair","email":"rdmcnair@us.ibm.com","username":"rdmcnair"},"change_message_id":"376d08fa361df46631ff13607ec461cc90928450","unresolved":false,"context_lines":[{"line_number":59,"context_line":"            resources[\u0027snapshots_\u0027 + volume_type] \u003d -1"},{"line_number":60,"context_line":"            resources[\u0027volumes_\u0027 + volume_type] \u003d -1"},{"line_number":61,"context_line":"    elif per_volume_gigabytes \u003c 0:"},{"line_number":62,"context_line":"        resources[\u0027per_volume_gigabytes\u0027] \u003d 10000"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"    if tenant_id:"},{"line_number":65,"context_line":"        resources[\u0027id\u0027] \u003d tenant_id"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a57f1b5_3924505c","line":62,"range":{"start_line":62,"start_character":0,"end_line":62,"end_character":49},"in_reply_to":"3a57f1b5_c59bd816","updated":"2016-02-12 21:19:30.000000000","message":"Haha it basically is!  We just need something other than -1 if the quota is  a child project, because for this patchset we disallow -1.  I\u0027ll add a comment about that as well","commit_id":"ab8d3b3c4a76038900ca987db5d9b41b51413944"},{"author":{"_account_id":7198,"name":"Jay Bryant","email":"jungleboyj@electronicjungle.net","username":"jsbryant"},"change_message_id":"e2583268a8e8760c0b7fa62d6a208f4cfb616de0","unresolved":false,"context_lines":[{"line_number":63,"context_line":"        # allowing -1 limits for the time being, so hack this to some large"},{"line_number":64,"context_line":"        # enough value for the tests that it\u0027s essentially unlimited"},{"line_number":65,"context_line":"        # TODO(mc_nair): remove when -1 limits for child projects are allowed"},{"line_number":66,"context_line":"        resources[\u0027per_volume_gigabytes\u0027] \u003d 10000"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"    if tenant_id:"},{"line_number":69,"context_line":"        resources[\u0027id\u0027] \u003d tenant_id"}],"source_content_type":"text/x-python","patch_set":7,"id":"dae33548_900e3039","line":66,"updated":"2016-02-17 21:38:59.000000000","message":"Thank you for explaining this.","commit_id":"25b75a97d66c313cdc21ce1053a95da6198f2b42"}],"cinder/tests/unit/test_quota.py":[{"author":{"_account_id":7198,"name":"Jay Bryant","email":"jungleboyj@electronicjungle.net","username":"jsbryant"},"change_message_id":"6b125a29173c67b89d4d338f8c777632f889fae8","unresolved":false,"context_lines":[{"line_number":41,"context_line":"from keystonemiddleware import auth_token"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"CONF \u003d cfg.CONF"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"CONF \u003d cfg.CONF"},{"line_number":47,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"3a57f1b5_937cb473","line":44,"range":{"start_line":44,"start_character":6,"end_line":44,"end_character":7},"updated":"2016-02-11 02:06:40.000000000","message":"You have CONF defined twice here.","commit_id":"2fd53b992f6646aca9f2816cefa52c3425c45843"},{"author":{"_account_id":8912,"name":"Ryan McNair","email":"rdmcnair@us.ibm.com","username":"rdmcnair"},"change_message_id":"4a8a1c1663073173792c690e6c1aea79163d1a96","unresolved":false,"context_lines":[{"line_number":41,"context_line":"from keystonemiddleware import auth_token"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"CONF \u003d cfg.CONF"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"CONF \u003d cfg.CONF"},{"line_number":47,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"3a57f1b5_782f70f6","line":44,"range":{"start_line":44,"start_character":6,"end_line":44,"end_character":7},"in_reply_to":"3a57f1b5_937cb473","updated":"2016-02-11 15:56:33.000000000","message":"Good catch","commit_id":"2fd53b992f6646aca9f2816cefa52c3425c45843"}],"releasenotes/notes/split-out-nested-quota-driver-e9493f478d2b8be5.yaml":[{"author":{"_account_id":7198,"name":"Jay Bryant","email":"jungleboyj@electronicjungle.net","username":"jsbryant"},"change_message_id":"6b125a29173c67b89d4d338f8c777632f889fae8","unresolved":false,"context_lines":[{"line_number":7,"context_line":"  - Split nested quota support into a separate driver. In"},{"line_number":8,"context_line":"    order to use nested quotas, change the following config"},{"line_number":9,"context_line":"    ``quota_driver \u003d cinder.quota.NestedDbQuotaDriver`` after"},{"line_number":10,"context_line":"    running the following admin API "},{"line_number":11,"context_line":"    \"os-quota-sets/validate_setup_for_nested_quota_use\" command "},{"line_number":12,"context_line":"    to ensure the existing quota values make sense to nest."},{"line_number":13,"context_line":"upgrade:"}],"source_content_type":"text/x-yaml","patch_set":5,"id":"3a57f1b5_331620f2","line":10,"range":{"start_line":10,"start_character":35,"end_line":10,"end_character":36},"updated":"2016-02-11 02:06:40.000000000","message":"Please address whitespace at EOL.","commit_id":"2fd53b992f6646aca9f2816cefa52c3425c45843"},{"author":{"_account_id":8912,"name":"Ryan McNair","email":"rdmcnair@us.ibm.com","username":"rdmcnair"},"change_message_id":"4a8a1c1663073173792c690e6c1aea79163d1a96","unresolved":false,"context_lines":[{"line_number":7,"context_line":"  - Split nested quota support into a separate driver. In"},{"line_number":8,"context_line":"    order to use nested quotas, change the following config"},{"line_number":9,"context_line":"    ``quota_driver \u003d cinder.quota.NestedDbQuotaDriver`` after"},{"line_number":10,"context_line":"    running the following admin API "},{"line_number":11,"context_line":"    \"os-quota-sets/validate_setup_for_nested_quota_use\" command "},{"line_number":12,"context_line":"    to ensure the existing quota values make sense to nest."},{"line_number":13,"context_line":"upgrade:"}],"source_content_type":"text/x-yaml","patch_set":5,"id":"3a57f1b5_d8b1c490","line":10,"range":{"start_line":10,"start_character":35,"end_line":10,"end_character":36},"in_reply_to":"3a57f1b5_331620f2","updated":"2016-02-11 15:56:33.000000000","message":"Done","commit_id":"2fd53b992f6646aca9f2816cefa52c3425c45843"},{"author":{"_account_id":7198,"name":"Jay Bryant","email":"jungleboyj@electronicjungle.net","username":"jsbryant"},"change_message_id":"6b125a29173c67b89d4d338f8c777632f889fae8","unresolved":false,"context_lines":[{"line_number":8,"context_line":"    order to use nested quotas, change the following config"},{"line_number":9,"context_line":"    ``quota_driver \u003d cinder.quota.NestedDbQuotaDriver`` after"},{"line_number":10,"context_line":"    running the following admin API "},{"line_number":11,"context_line":"    \"os-quota-sets/validate_setup_for_nested_quota_use\" command "},{"line_number":12,"context_line":"    to ensure the existing quota values make sense to nest."},{"line_number":13,"context_line":"upgrade:"},{"line_number":14,"context_line":"  - Nested quotas will no longer be used by default, but can be"}],"source_content_type":"text/x-yaml","patch_set":5,"id":"3a57f1b5_33a9407c","line":11,"range":{"start_line":11,"start_character":3,"end_line":11,"end_character":55},"updated":"2016-02-11 02:06:40.000000000","message":"Where are these commands located?  I don\u0027t see them in the patch or this needs to be better explained.","commit_id":"2fd53b992f6646aca9f2816cefa52c3425c45843"},{"author":{"_account_id":8912,"name":"Ryan McNair","email":"rdmcnair@us.ibm.com","username":"rdmcnair"},"change_message_id":"4a8a1c1663073173792c690e6c1aea79163d1a96","unresolved":false,"context_lines":[{"line_number":8,"context_line":"    order to use nested quotas, change the following config"},{"line_number":9,"context_line":"    ``quota_driver \u003d cinder.quota.NestedDbQuotaDriver`` after"},{"line_number":10,"context_line":"    running the following admin API "},{"line_number":11,"context_line":"    \"os-quota-sets/validate_setup_for_nested_quota_use\" command "},{"line_number":12,"context_line":"    to ensure the existing quota values make sense to nest."},{"line_number":13,"context_line":"upgrade:"},{"line_number":14,"context_line":"  - Nested quotas will no longer be used by default, but can be"}],"source_content_type":"text/x-yaml","patch_set":5,"id":"3a57f1b5_d8e8e4e4","line":11,"range":{"start_line":11,"start_character":3,"end_line":11,"end_character":55},"in_reply_to":"3a57f1b5_33a9407c","updated":"2016-02-11 15:56:33.000000000","message":"The new command is defined in the patch in cinder/api/contrib/quotas.py","commit_id":"2fd53b992f6646aca9f2816cefa52c3425c45843"},{"author":{"_account_id":7198,"name":"Jay Bryant","email":"jungleboyj@electronicjungle.net","username":"jsbryant"},"change_message_id":"6b125a29173c67b89d4d338f8c777632f889fae8","unresolved":false,"context_lines":[{"line_number":20,"context_line":"    may be incorrect (bug 1537189); if default child limits were used,"},{"line_number":21,"context_line":"    the in-use values could be more than the default limit of \"0\""},{"line_number":22,"context_line":"    (bug 1531502). "},{"line_number":23,"context_line":"    In addition to fixing these issue, validation can be done to ensure"},{"line_number":24,"context_line":"    the DB values and existing quota are setup in a valid way for"},{"line_number":25,"context_line":"    nested quotas by calling the admin API"},{"line_number":26,"context_line":"    \"os-quota-sets/validate_setup_for_nested_quota_use\" as"}],"source_content_type":"text/x-yaml","patch_set":5,"id":"3a57f1b5_b3853008","line":23,"range":{"start_line":23,"start_character":33,"end_line":23,"end_character":37},"updated":"2016-02-11 02:06:40.000000000","message":"issues","commit_id":"2fd53b992f6646aca9f2816cefa52c3425c45843"},{"author":{"_account_id":8912,"name":"Ryan McNair","email":"rdmcnair@us.ibm.com","username":"rdmcnair"},"change_message_id":"4a8a1c1663073173792c690e6c1aea79163d1a96","unresolved":false,"context_lines":[{"line_number":20,"context_line":"    may be incorrect (bug 1537189); if default child limits were used,"},{"line_number":21,"context_line":"    the in-use values could be more than the default limit of \"0\""},{"line_number":22,"context_line":"    (bug 1531502). "},{"line_number":23,"context_line":"    In addition to fixing these issue, validation can be done to ensure"},{"line_number":24,"context_line":"    the DB values and existing quota are setup in a valid way for"},{"line_number":25,"context_line":"    nested quotas by calling the admin API"},{"line_number":26,"context_line":"    \"os-quota-sets/validate_setup_for_nested_quota_use\" as"}],"source_content_type":"text/x-yaml","patch_set":5,"id":"3a57f1b5_98ab4c1d","line":23,"range":{"start_line":23,"start_character":33,"end_line":23,"end_character":37},"in_reply_to":"3a57f1b5_b3853008","updated":"2016-02-11 15:56:33.000000000","message":"Done","commit_id":"2fd53b992f6646aca9f2816cefa52c3425c45843"},{"author":{"_account_id":7198,"name":"Jay Bryant","email":"jungleboyj@electronicjungle.net","username":"jsbryant"},"change_message_id":"6b125a29173c67b89d4d338f8c777632f889fae8","unresolved":false,"context_lines":[{"line_number":21,"context_line":"    the in-use values could be more than the default limit of \"0\""},{"line_number":22,"context_line":"    (bug 1531502). "},{"line_number":23,"context_line":"    In addition to fixing these issue, validation can be done to ensure"},{"line_number":24,"context_line":"    the DB values and existing quota are setup in a valid way for"},{"line_number":25,"context_line":"    nested quotas by calling the admin API"},{"line_number":26,"context_line":"    \"os-quota-sets/validate_setup_for_nested_quota_use\" as"},{"line_number":27,"context_line":"    the cloud admin.  The param \"fix_allocated_quotas\u003dTrue\" can be"}],"source_content_type":"text/x-yaml","patch_set":5,"id":"3a57f1b5_1377643b","line":24,"range":{"start_line":24,"start_character":31,"end_line":24,"end_character":36},"updated":"2016-02-11 02:06:40.000000000","message":"quotas","commit_id":"2fd53b992f6646aca9f2816cefa52c3425c45843"},{"author":{"_account_id":8912,"name":"Ryan McNair","email":"rdmcnair@us.ibm.com","username":"rdmcnair"},"change_message_id":"4a8a1c1663073173792c690e6c1aea79163d1a96","unresolved":false,"context_lines":[{"line_number":21,"context_line":"    the in-use values could be more than the default limit of \"0\""},{"line_number":22,"context_line":"    (bug 1531502). "},{"line_number":23,"context_line":"    In addition to fixing these issue, validation can be done to ensure"},{"line_number":24,"context_line":"    the DB values and existing quota are setup in a valid way for"},{"line_number":25,"context_line":"    nested quotas by calling the admin API"},{"line_number":26,"context_line":"    \"os-quota-sets/validate_setup_for_nested_quota_use\" as"},{"line_number":27,"context_line":"    the cloud admin.  The param \"fix_allocated_quotas\u003dTrue\" can be"}],"source_content_type":"text/x-yaml","patch_set":5,"id":"3a57f1b5_5864f420","line":24,"range":{"start_line":24,"start_character":31,"end_line":24,"end_character":36},"in_reply_to":"3a57f1b5_1377643b","updated":"2016-02-11 15:56:33.000000000","message":"Done","commit_id":"2fd53b992f6646aca9f2816cefa52c3425c45843"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"85542497b83479ae642723000b986c6b8ce58cc6","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"prelude: \u003e"},{"line_number":3,"context_line":"    Nested quotas are not on by default but can be"},{"line_number":4,"context_line":"    configured by setting the following in cinder.conf"},{"line_number":5,"context_line":"    ``quota_driver \u003d cinder.quota.NestedDbQuotaDriver``"},{"line_number":6,"context_line":"features:"}],"source_content_type":"text/x-yaml","patch_set":7,"id":"dae33548_3d429868","line":3,"updated":"2016-02-17 22:12:42.000000000","message":"When the release notes get compiled, the prelude section gets combined with any other prelude sections from other release notes and becomes the overview section for the entire release. This is good information here, but I don\u0027t think we want that to be our release overview. Please remove this section.","commit_id":"25b75a97d66c313cdc21ce1053a95da6198f2b42"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"85542497b83479ae642723000b986c6b8ce58cc6","unresolved":false,"context_lines":[{"line_number":14,"context_line":"  - Nested quotas will no longer be used by default, but can be"},{"line_number":15,"context_line":"    configured by setting"},{"line_number":16,"context_line":"    ``quota_driver \u003d cinder.quota.NestedDbQuotaDriver``."},{"line_number":17,"context_line":"    If the previous release of nested quotas was used, some of the"},{"line_number":18,"context_line":"    quota values in the DB may be incorrectly set. Specifically, if"},{"line_number":19,"context_line":"    child limits of \"-1\" were used previously, the allocated DB values"},{"line_number":20,"context_line":"    may be incorrect (bug 1537189); if default child limits were used,"}],"source_content_type":"text/x-yaml","patch_set":7,"id":"dae33548_7d2700ca","line":17,"updated":"2016-02-17 22:12:42.000000000","message":"Please remove from here down. This will be good information to have in the config-ref, but this is a little too much to have for the release notes.","commit_id":"25b75a97d66c313cdc21ce1053a95da6198f2b42"}]}
