)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":11536,"name":"hongbin","email":"hongbin034@gmail.com","username":"hongbin"},"change_message_id":"ff5b127f0d20b2246541c58443b34408a15d0e0c","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Kien Nguyen \u003ckiennt65@viettel.com.vn\u003e"},{"line_number":5,"context_line":"CommitDate: 2018-10-07 12:17:41 +0700"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"[WIP] Add quotas and quota classes"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Change-Id: I6ecdb63e633f145614b1a0d57712352dace7acf2"},{"line_number":10,"context_line":"Implements: blueprint quota-support"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"3f79a3b5_26641fb3","line":7,"updated":"2018-10-09 02:53:30.000000000","message":"The quota API is introduced in api version 1.26 in server so we need to bump the api version to 1.26 in client as well: https://github.com/openstack/python-zunclient/blob/master/zunclient/api_versions.py#L34","commit_id":"95e4ccc9d5ccacb4853ff2a032f1d577a67b6f09"}],"zunclient/osc/v1/quota_classes.py":[{"author":{"_account_id":11536,"name":"hongbin","email":"hongbin034@gmail.com","username":"hongbin"},"change_message_id":"ec433eb9c0399362da15f0cbb84633e1d1eb3c6f","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":2,"context_line":"# not use this file except in compliance with the License. You may obtain"},{"line_number":3,"context_line":"# a copy of the License at"},{"line_number":4,"context_line":"#"}],"source_content_type":"text/x-python","patch_set":2,"id":"3f79a3b5_dae90ce4","line":1,"updated":"2018-10-02 02:49:24.000000000","message":"Keep in mind that we need to update the entry_point in order to make these commands available in OSC: https://github.com/openstack/python-zunclient/blob/master/setup.cfg#L32","commit_id":"a243dfe86dc7696b33fb1242efec13aec2c055bd"},{"author":{"_account_id":22406,"name":"Kien Nguyen","email":"kiennt2609@gmail.com","username":"kiennt"},"change_message_id":"6510285eea1331763875a9c5c9a69bde1b6eb66e","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":2,"context_line":"# not use this file except in compliance with the License. You may obtain"},{"line_number":3,"context_line":"# a copy of the License at"},{"line_number":4,"context_line":"#"}],"source_content_type":"text/x-python","patch_set":2,"id":"3f79a3b5_f805827a","line":1,"in_reply_to":"3f79a3b5_dae90ce4","updated":"2018-10-07 05:30:08.000000000","message":"Done, thank you :)","commit_id":"a243dfe86dc7696b33fb1242efec13aec2c055bd"},{"author":{"_account_id":11536,"name":"hongbin","email":"hongbin034@gmail.com","username":"hongbin"},"change_message_id":"ec433eb9c0399362da15f0cbb84633e1d1eb3c6f","unresolved":false,"context_lines":[{"line_number":25,"context_line":""},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"class UpdateQuotaClass(command.ShowOne):"},{"line_number":28,"context_line":"    \"\"\"Update quota per class\"\"\""},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"    log \u003d logging.getLogger(__name__ + \".UpdateQuotaClass\")"},{"line_number":31,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"3f79a3b5_da97cc45","line":28,"range":{"start_line":28,"start_character":7,"end_line":28,"end_character":29},"updated":"2018-10-02 02:49:24.000000000","message":"nit: I would rephrase it to \"Update the quotas for a quota class\"","commit_id":"a243dfe86dc7696b33fb1242efec13aec2c055bd"},{"author":{"_account_id":11536,"name":"hongbin","email":"hongbin034@gmail.com","username":"hongbin"},"change_message_id":"ec433eb9c0399362da15f0cbb84633e1d1eb3c6f","unresolved":false,"context_lines":[{"line_number":33,"context_line":"        parser \u003d super(UpdateQuotaClass, self).get_parser(prog_name)"},{"line_number":34,"context_line":"        parser.add_argument("},{"line_number":35,"context_line":"            \u0027--containers\u0027,"},{"line_number":36,"context_line":"            metavar\u003d\u0027\u003ccontainers\u003e\u0027, default\u003dNone,"},{"line_number":37,"context_line":"            help\u003d\u0027The number of containers allowed per project\u0027)"},{"line_number":38,"context_line":"        parser.add_argument("},{"line_number":39,"context_line":"            \u0027--memory\u0027,"}],"source_content_type":"text/x-python","patch_set":2,"id":"3f79a3b5_3aca806d","line":36,"range":{"start_line":36,"start_character":36,"end_line":36,"end_character":48},"updated":"2018-10-02 02:49:24.000000000","message":"nit: I guess the default is None so this can be removed. This applies to all below.","commit_id":"a243dfe86dc7696b33fb1242efec13aec2c055bd"},{"author":{"_account_id":11536,"name":"hongbin","email":"hongbin034@gmail.com","username":"hongbin"},"change_message_id":"ec433eb9c0399362da15f0cbb84633e1d1eb3c6f","unresolved":false,"context_lines":[{"line_number":71,"context_line":""},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"class GetQuotaClass(command.ShowOne):"},{"line_number":74,"context_line":"    \"\"\"Get quota per class\"\"\""},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"    log \u003d logging.getLogger(__name__ + \u0027.GetQuotaClass\u0027)"},{"line_number":77,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"3f79a3b5_9a871413","line":74,"range":{"start_line":74,"start_character":7,"end_line":74,"end_character":26},"updated":"2018-10-02 02:49:24.000000000","message":"nit: I would rephrase it to \"List the quotas for a quota class\"","commit_id":"a243dfe86dc7696b33fb1242efec13aec2c055bd"}],"zunclient/osc/v1/quotas.py":[{"author":{"_account_id":11536,"name":"hongbin","email":"hongbin034@gmail.com","username":"hongbin"},"change_message_id":"ec433eb9c0399362da15f0cbb84633e1d1eb3c6f","unresolved":false,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"class UpdateQuota(command.ShowOne):"},{"line_number":30,"context_line":"    \"\"\"Update quota of the project\"\"\""},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    log \u003d logging.getLogger(__name__ + \".UpdateQuota\")"},{"line_number":33,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"3f79a3b5_5a7dfc1b","line":30,"range":{"start_line":30,"start_character":14,"end_line":30,"end_character":19},"updated":"2018-10-02 02:49:24.000000000","message":"the quotas","commit_id":"a243dfe86dc7696b33fb1242efec13aec2c055bd"},{"author":{"_account_id":11536,"name":"hongbin","email":"hongbin034@gmail.com","username":"hongbin"},"change_message_id":"ec433eb9c0399362da15f0cbb84633e1d1eb3c6f","unresolved":false,"context_lines":[{"line_number":35,"context_line":"        parser \u003d super(UpdateQuota, self).get_parser(prog_name)"},{"line_number":36,"context_line":"        parser.add_argument("},{"line_number":37,"context_line":"            \u0027--containers\u0027,"},{"line_number":38,"context_line":"            metavar\u003d\u0027\u003ccontainers\u003e\u0027, default\u003dNone,"},{"line_number":39,"context_line":"            help\u003d\u0027The number of containers allowed per project\u0027)"},{"line_number":40,"context_line":"        parser.add_argument("},{"line_number":41,"context_line":"            \u0027--memory\u0027,"}],"source_content_type":"text/x-python","patch_set":2,"id":"3f79a3b5_1a7b0429","line":38,"range":{"start_line":38,"start_character":35,"end_line":38,"end_character":48},"updated":"2018-10-02 02:49:24.000000000","message":"ditto, this can be removed.","commit_id":"a243dfe86dc7696b33fb1242efec13aec2c055bd"},{"author":{"_account_id":11536,"name":"hongbin","email":"hongbin034@gmail.com","username":"hongbin"},"change_message_id":"ec433eb9c0399362da15f0cbb84633e1d1eb3c6f","unresolved":false,"context_lines":[{"line_number":51,"context_line":"            \u0027--disk\u0027,"},{"line_number":52,"context_line":"            metavar\u003d\u0027\u003cdisk\u003e\u0027, default\u003dNone,"},{"line_number":53,"context_line":"            help\u003d\u0027The number of gigabytes of container Disk \u0027"},{"line_number":54,"context_line":"                 \u0027allowed per project\u0027)"},{"line_number":55,"context_line":"        return parser"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"    def take_action(self, parsed_args):"}],"source_content_type":"text/x-python","patch_set":2,"id":"3f79a3b5_7a97983a","line":54,"updated":"2018-10-02 02:49:24.000000000","message":"I guess we need to have an argument for project/tenant? Otherwise, admin users won\u0027t be able to update quotas in other tenants.","commit_id":"a243dfe86dc7696b33fb1242efec13aec2c055bd"},{"author":{"_account_id":11536,"name":"hongbin","email":"hongbin034@gmail.com","username":"hongbin"},"change_message_id":"91261b7b4fb7411e0da3bea6aab11e25356a0892","unresolved":false,"context_lines":[{"line_number":51,"context_line":"            \u0027--disk\u0027,"},{"line_number":52,"context_line":"            metavar\u003d\u0027\u003cdisk\u003e\u0027, default\u003dNone,"},{"line_number":53,"context_line":"            help\u003d\u0027The number of gigabytes of container Disk \u0027"},{"line_number":54,"context_line":"                 \u0027allowed per project\u0027)"},{"line_number":55,"context_line":"        return parser"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"    def take_action(self, parsed_args):"}],"source_content_type":"text/x-python","patch_set":2,"id":"3f79a3b5_0e63581b","line":54,"in_reply_to":"3f79a3b5_38d21aff","updated":"2018-10-07 15:40:20.000000000","message":"I see.","commit_id":"a243dfe86dc7696b33fb1242efec13aec2c055bd"},{"author":{"_account_id":22406,"name":"Kien Nguyen","email":"kiennt2609@gmail.com","username":"kiennt"},"change_message_id":"6510285eea1331763875a9c5c9a69bde1b6eb66e","unresolved":false,"context_lines":[{"line_number":51,"context_line":"            \u0027--disk\u0027,"},{"line_number":52,"context_line":"            metavar\u003d\u0027\u003cdisk\u003e\u0027, default\u003dNone,"},{"line_number":53,"context_line":"            help\u003d\u0027The number of gigabytes of container Disk \u0027"},{"line_number":54,"context_line":"                 \u0027allowed per project\u0027)"},{"line_number":55,"context_line":"        return parser"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"    def take_action(self, parsed_args):"}],"source_content_type":"text/x-python","patch_set":2,"id":"3f79a3b5_38d21aff","line":54,"in_reply_to":"3f79a3b5_7a97983a","updated":"2018-10-07 05:30:08.000000000","message":"Zun Quota API will get project/tenant from context [1]. Therefore don\u0027t need to pass an project/tenant argurment here.\n\n[1] https://github.com/openstack/zun/blob/master/zun/api/controllers/v1/quotas.py#L50","commit_id":"a243dfe86dc7696b33fb1242efec13aec2c055bd"},{"author":{"_account_id":11536,"name":"hongbin","email":"hongbin034@gmail.com","username":"hongbin"},"change_message_id":"ec433eb9c0399362da15f0cbb84633e1d1eb3c6f","unresolved":false,"context_lines":[{"line_number":76,"context_line":"        parser.add_argument("},{"line_number":77,"context_line":"            \u0027--usages\u0027,"},{"line_number":78,"context_line":"            action\u003d\u0027store_true\u0027,"},{"line_number":79,"context_line":"            help\u003d\u0027Whether show quota usage statistic or not\u0027)"},{"line_number":80,"context_line":"        return parser"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"    def take_action(self, parsed_args):"}],"source_content_type":"text/x-python","patch_set":2,"id":"3f79a3b5_baba10bd","line":79,"updated":"2018-10-02 02:49:24.000000000","message":"Ditto: might need to add a \"project\" argument. This applies to all commands below.","commit_id":"a243dfe86dc7696b33fb1242efec13aec2c055bd"}],"zunclient/v1/quota_classes_shell.py":[{"author":{"_account_id":11536,"name":"hongbin","email":"hongbin034@gmail.com","username":"hongbin"},"change_message_id":"ec433eb9c0399362da15f0cbb84633e1d1eb3c6f","unresolved":false,"context_lines":[{"line_number":16,"context_line":"@utils.arg("},{"line_number":17,"context_line":"    \u0027--containers\u0027,"},{"line_number":18,"context_line":"    metavar\u003d\u0027\u003ccontainers\u003e\u0027,"},{"line_number":19,"context_line":"    type\u003dint, default\u003dNone,"},{"line_number":20,"context_line":"    help\u003d\u0027The number of containers allowed per project\u0027)"},{"line_number":21,"context_line":"@utils.arg("},{"line_number":22,"context_line":"    \u0027--cpu\u0027,"}],"source_content_type":"text/x-python","patch_set":2,"id":"3f79a3b5_badf700a","line":19,"range":{"start_line":19,"start_character":14,"end_line":19,"end_character":27},"updated":"2018-10-02 02:49:24.000000000","message":"Ditto: this can be removed.","commit_id":"a243dfe86dc7696b33fb1242efec13aec2c055bd"},{"author":{"_account_id":11536,"name":"hongbin","email":"hongbin034@gmail.com","username":"hongbin"},"change_message_id":"acecb28250ffdb1cd09a8e2e5643dd8ea0e29cb8","unresolved":false,"context_lines":[{"line_number":36,"context_line":"@utils.arg("},{"line_number":37,"context_line":"    \u0027quota_class_name\u0027,"},{"line_number":38,"context_line":"    metavar\u003d\u0027\u003cquota_class_name\u003e\u0027,"},{"line_number":39,"context_line":"    nargs\u003d\u0027+\u0027,"},{"line_number":40,"context_line":"    help\u003d\u0027The name of quota class\u0027)"},{"line_number":41,"context_line":"def do_quota_class_update(cs, args):"},{"line_number":42,"context_line":"    \"\"\"Print an updated quotas for a quota class\"\"\""}],"source_content_type":"text/x-python","patch_set":7,"id":"3f79a3b5_75d8377f","line":39,"range":{"start_line":39,"start_character":4,"end_line":39,"end_character":9},"updated":"2018-10-24 03:13:58.000000000","message":"I remove this otherwise args.quota_class_name will become a list, which is incorrect. The correct type is string.","commit_id":"1786c2de015c56e849d2495ad0010fa75dc89489"},{"author":{"_account_id":11536,"name":"hongbin","email":"hongbin034@gmail.com","username":"hongbin"},"change_message_id":"acecb28250ffdb1cd09a8e2e5643dd8ea0e29cb8","unresolved":false,"context_lines":[{"line_number":51,"context_line":"@utils.arg("},{"line_number":52,"context_line":"    \u0027quota_class_name\u0027,"},{"line_number":53,"context_line":"    metavar\u003d\u0027\u003cquota_class_name\u003e\u0027,"},{"line_number":54,"context_line":"    nargs\u003d\u0027+\u0027,"},{"line_number":55,"context_line":"    help\u003d\u0027The name of quota class\u0027)"},{"line_number":56,"context_line":"def do_quota_class_get(cs, args):"},{"line_number":57,"context_line":"    \"\"\"Print a quotas for a quota class\"\"\""}],"source_content_type":"text/x-python","patch_set":7,"id":"3f79a3b5_55865b61","line":54,"range":{"start_line":54,"start_character":4,"end_line":54,"end_character":9},"updated":"2018-10-24 03:13:58.000000000","message":"I removed this because it is impossible to get multiple quota_classes in one command.","commit_id":"1786c2de015c56e849d2495ad0010fa75dc89489"},{"author":{"_account_id":22406,"name":"Kien Nguyen","email":"kiennt2609@gmail.com","username":"kiennt"},"change_message_id":"d0615a970e95e3a106bf7f78ed4563724a675064","unresolved":false,"context_lines":[{"line_number":51,"context_line":"@utils.arg("},{"line_number":52,"context_line":"    \u0027quota_class_name\u0027,"},{"line_number":53,"context_line":"    metavar\u003d\u0027\u003cquota_class_name\u003e\u0027,"},{"line_number":54,"context_line":"    nargs\u003d\u0027+\u0027,"},{"line_number":55,"context_line":"    help\u003d\u0027The name of quota class\u0027)"},{"line_number":56,"context_line":"def do_quota_class_get(cs, args):"},{"line_number":57,"context_line":"    \"\"\"Print a quotas for a quota class\"\"\""}],"source_content_type":"text/x-python","patch_set":7,"id":"3f79a3b5_35787fc0","line":54,"range":{"start_line":54,"start_character":4,"end_line":54,"end_character":9},"in_reply_to":"3f79a3b5_55865b61","updated":"2018-10-24 04:37:29.000000000","message":"Thank you.","commit_id":"1786c2de015c56e849d2495ad0010fa75dc89489"}],"zunclient/v1/quotas_shell.py":[{"author":{"_account_id":11536,"name":"hongbin","email":"hongbin034@gmail.com","username":"hongbin"},"change_message_id":"ff5b127f0d20b2246541c58443b34408a15d0e0c","unresolved":false,"context_lines":[{"line_number":33,"context_line":"    metavar\u003d\u0027\u003cdisk\u003e\u0027,"},{"line_number":34,"context_line":"    type\u003dint,"},{"line_number":35,"context_line":"    help\u003d\u0027The number of gigabytes of container Disk allowed per project\u0027)"},{"line_number":36,"context_line":"def do_quota_update(cs, args):"},{"line_number":37,"context_line":"    utils.print_dict(cs.quotas.update(containers\u003dargs.containers,"},{"line_number":38,"context_line":"                                      memory\u003dargs.memory,"},{"line_number":39,"context_line":"                                      cpu\u003dargs.cpu,"}],"source_content_type":"text/x-python","patch_set":3,"id":"3f79a3b5_0617a3f0","line":36,"range":{"start_line":36,"start_character":4,"end_line":36,"end_character":19},"updated":"2018-10-09 02:53:30.000000000","message":"We need a doc string below each command (like this https://github.com/openstack/python-zunclient/blob/c04d457e08e75fd91202f811df1c68f5646d31be/zunclient/v1/availability_zones_shell.py#L19) so that the CLI can help the short description for each command.","commit_id":"95e4ccc9d5ccacb4853ff2a032f1d577a67b6f09"}]}
