)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"aca8916b19d3d9cb2b050d2c48d3e41518fcfac5","unresolved":true,"context_lines":[{"line_number":15,"context_line":"This seems a more sane value to respond with, given we don\u0027t count the"},{"line_number":16,"context_line":"usage for those values."},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"Future patches will look at proxying the quota update APIs to keystone."},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"blueprint unified-limits-nova"},{"line_number":21,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":9,"id":"1ba28220_e4cfc301","line":18,"updated":"2021-05-06 22:30:21.000000000","message":"Some random thoughts:\n\nI have been feeling unsure about proxying quota update APIs to keystone now, as I\u0027ve started working on tempest tests.\n\nI think the challenge with not proxying is that it looks like users can update quotas in horizon:\n\nhttps://docs.openstack.org/horizon/latest/admin/set-quotas.html\n\nand if we didn\u0027t proxy, we\u0027d have to coordinate and update horizon to call keystone instead. But horizon would also need to be able to discover whether nova is configured with unified limits in order to know what to do.\n\nMaybe that\u0027s why we arrived at going ahead to proxy to keystone for updates ... because updating things like horizon would be easier when unified limits is no longer a choice and it\u0027s the only way to do quotas in nova.","commit_id":"2a108861c22b99d284f42ca7e8923a0546d10c0b"}],"/PATCHSET_LEVEL":[{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"523f8cc5003b8e469d0c90312ae4f5d6b54158c3","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":31,"id":"41ae18a3_0987e315","updated":"2021-12-08 00:42:33.000000000","message":"recheck bug 1939108","commit_id":"72277616f6ea4d0ad4e35241445fe81ca223bca7"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"b2e7ef2771fd9123810044796c1b8b5365d8a13e","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":32,"id":"7c5d97a0_0797f685","updated":"2022-01-21 19:53:07.000000000","message":"recheck bug 1957941","commit_id":"127d317d79b3edb4524e14e2e1b6b8d5025d5c80"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"f4419f38d7f50a81f7163cab8c78459fefde6134","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":32,"id":"94617b6b_93df3c1d","updated":"2022-01-21 01:08:29.000000000","message":"recheck dep updated","commit_id":"127d317d79b3edb4524e14e2e1b6b8d5025d5c80"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"cade5307e75a70e1859ec16cb6301489b6597fce","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":32,"id":"af08c44b_7779019b","updated":"2022-01-21 22:09:18.000000000","message":"recheck libvirt.libvirtError: unable to connect to server at \u0027ubuntu-focal-rax-ord-0028120598:49152\u0027: Connection refused","commit_id":"127d317d79b3edb4524e14e2e1b6b8d5025d5c80"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"2b3c00823fd60193a4496afe409ca6a8f9e0d1db","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":37,"id":"7680c7d2_9143be34","updated":"2022-02-09 22:45:20.000000000","message":"recheck bug 1928922","commit_id":"a8370322e622ef5ec87288d6f4483f609ca7755a"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"ddba1f3b855b9d7e018e01f739b056f9f25bbdde","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":38,"id":"30592f37_da24a267","updated":"2022-02-23 17:02:33.000000000","message":"All good.","commit_id":"9a1983047fd7c52f502787e91f70e3620aed8336"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"d13354a93351a6578e2ab9634b9a024ae10f808c","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":38,"id":"088baa88_fd882e0f","updated":"2022-02-24 11:18:47.000000000","message":"Looks good","commit_id":"9a1983047fd7c52f502787e91f70e3620aed8336"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"f30fc1b7728cd0c8770ae4c1cdd1da8c994e85f7","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":39,"id":"010d0bc2_179c0bf7","updated":"2022-02-27 00:14:51.000000000","message":"recheck","commit_id":"22bc8419716b2ef7a41f8710e1c13fdc52d48bc1"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"4f233b3d93b0b8415a12576ea9ef684fa07e4f8a","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":39,"id":"3d3b3173_f900639a","updated":"2022-02-26 09:21:50.000000000","message":"recheck","commit_id":"22bc8419716b2ef7a41f8710e1c13fdc52d48bc1"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"27a3b8b09717db083e83253d2b86e97196c6bbab","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":39,"id":"c07a5e0b_a88b8b23","updated":"2022-02-24 22:07:52.000000000","message":"recheck","commit_id":"22bc8419716b2ef7a41f8710e1c13fdc52d48bc1"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"dcec2d868f1b337e3ae032321d622f9d75ff6439","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":39,"id":"e1a027ca_44181ce1","updated":"2022-02-25 12:53:43.000000000","message":"recheck","commit_id":"22bc8419716b2ef7a41f8710e1c13fdc52d48bc1"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"61ea889dd01dfb0be555073ad3312cff77348d38","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":39,"id":"14c1721d_f51f4fb7","updated":"2022-02-25 06:01:26.000000000","message":"recheck tempest.lib.exceptions.IdentityError: Got identity error Details: Unexpected status code 500","commit_id":"22bc8419716b2ef7a41f8710e1c13fdc52d48bc1"}],"nova/quota.py":[{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"c6af8e5bfffe674d1415e3b79f36d489767ac87a","unresolved":false,"context_lines":[{"line_number":817,"context_line":"            raise NotImplementedError(\"remains\")"},{"line_number":818,"context_line":""},{"line_number":819,"context_line":"        local_limits \u003d local_limit.get_local_limits()"},{"line_number":820,"context_line":"        keystone_limits \u003d keystone_limit.get_legacy_project_limits(project_id)"},{"line_number":821,"context_line":"        project_quotas \u003d {}"},{"line_number":822,"context_line":"        for resource in resources.values():"},{"line_number":823,"context_line":"            if resource.name in keystone_limits:"}],"source_content_type":"text/x-python","patch_set":6,"id":"df33271e_a5ee461f","line":820,"range":{"start_line":820,"start_character":41,"end_line":820,"end_character":66},"updated":"2020-04-08 22:48:45.000000000","message":"OK, so this is the new method that will return a limit of 0 for a project limit if the user has not set a project limit in keystone, and intends to only rely on the default (registered) limit.","commit_id":"9064f2ad01224aa840151231d3ef2b599d45f5fe"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"c6af8e5bfffe674d1415e3b79f36d489767ac87a","unresolved":false,"context_lines":[{"line_number":823,"context_line":"            if resource.name in keystone_limits:"},{"line_number":824,"context_line":"                limit \u003d keystone_limits[resource.name]"},{"line_number":825,"context_line":"            else:"},{"line_number":826,"context_line":"                limit \u003d local_limits.get(resource.name, -1)"},{"line_number":827,"context_line":"            project_quotas[resource.name] \u003d {\"limit\": limit}"},{"line_number":828,"context_line":""},{"line_number":829,"context_line":"        if usages:"}],"source_content_type":"text/x-python","patch_set":6,"id":"df33271e_251fd608","line":826,"updated":"2020-04-08 22:48:45.000000000","message":"Then this logic is saying, for all resources passed in, if the resource is in keystone_limits (which it will be, because in the case of limit._LimitNotFound we will get a limit of 0) then use the keystone limit, else use the local limit and if that isn\u0027t found, use unlimited -1.\n\nAFAICT, we will never hit the else branch here, right? We\u0027ll never not have a resource in keystone_limits because not found limits will be returned as 0 (see my comment on L820).\n\nSo we\u0027ll never fall back on the local_limits. I assume that\u0027s not intended? And if it\u0027s not intended, this is highlighting some missing test coverage that we need. :(","commit_id":"9064f2ad01224aa840151231d3ef2b599d45f5fe"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"0fde0eb5586590ee9382f2c3420ce3810165a6fa","unresolved":false,"context_lines":[{"line_number":823,"context_line":"            if resource.name in keystone_limits:"},{"line_number":824,"context_line":"                limit \u003d keystone_limits[resource.name]"},{"line_number":825,"context_line":"            else:"},{"line_number":826,"context_line":"                limit \u003d local_limits.get(resource.name, -1)"},{"line_number":827,"context_line":"            project_quotas[resource.name] \u003d {\"limit\": limit}"},{"line_number":828,"context_line":""},{"line_number":829,"context_line":"        if usages:"}],"source_content_type":"text/x-python","patch_set":6,"id":"ff570b3c_b50ade22","line":826,"in_reply_to":"df33271e_251fd608","updated":"2020-06-02 09:46:39.000000000","message":"So we do test this, for things like \"security_group_rules\", it returns \"-1. This is because the resources passed in include: keystone limits, local imits and deprecated limits.\n\nThis is super unclear, I will add some comments.","commit_id":"9064f2ad01224aa840151231d3ef2b599d45f5fe"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"c6af8e5bfffe674d1415e3b79f36d489767ac87a","unresolved":false,"context_lines":[{"line_number":831,"context_line":"            k_in_use \u003d keystone_limit.get_legacy_counts(context, project_id)"},{"line_number":832,"context_line":""},{"line_number":833,"context_line":"            for resource in resources.values():"},{"line_number":834,"context_line":"                usage_count \u003d -1"},{"line_number":835,"context_line":"                if resource.name in local_in_use:"},{"line_number":836,"context_line":"                    usage_count \u003d local_in_use[resource.name]"},{"line_number":837,"context_line":"                if resource.name in k_in_use:"}],"source_content_type":"text/x-python","patch_set":6,"id":"df33271e_25e4f60c","line":834,"range":{"start_line":834,"start_character":16,"end_line":834,"end_character":32},"updated":"2020-04-08 22:48:45.000000000","message":"Sorry, why would this default to -1 for usage? Should be 0 right?","commit_id":"9064f2ad01224aa840151231d3ef2b599d45f5fe"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"3de5d206b5297100ddbc29a501e4d64b288e6db3","unresolved":false,"context_lines":[{"line_number":831,"context_line":"            k_in_use \u003d keystone_limit.get_legacy_counts(context, project_id)"},{"line_number":832,"context_line":""},{"line_number":833,"context_line":"            for resource in resources.values():"},{"line_number":834,"context_line":"                usage_count \u003d -1"},{"line_number":835,"context_line":"                if resource.name in local_in_use:"},{"line_number":836,"context_line":"                    usage_count \u003d local_in_use[resource.name]"},{"line_number":837,"context_line":"                if resource.name in k_in_use:"}],"source_content_type":"text/x-python","patch_set":6,"id":"df33271e_85c6a267","line":834,"range":{"start_line":834,"start_character":16,"end_line":834,"end_character":32},"in_reply_to":"df33271e_25e4f60c","updated":"2020-04-08 22:49:41.000000000","message":"Also something that should be covered in test coverage (did I miss it?)","commit_id":"9064f2ad01224aa840151231d3ef2b599d45f5fe"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"0fde0eb5586590ee9382f2c3420ce3810165a6fa","unresolved":false,"context_lines":[{"line_number":831,"context_line":"            k_in_use \u003d keystone_limit.get_legacy_counts(context, project_id)"},{"line_number":832,"context_line":""},{"line_number":833,"context_line":"            for resource in resources.values():"},{"line_number":834,"context_line":"                usage_count \u003d -1"},{"line_number":835,"context_line":"                if resource.name in local_in_use:"},{"line_number":836,"context_line":"                    usage_count \u003d local_in_use[resource.name]"},{"line_number":837,"context_line":"                if resource.name in k_in_use:"}],"source_content_type":"text/x-python","patch_set":6,"id":"ff570b3c_c066aeed","line":834,"range":{"start_line":834,"start_character":16,"end_line":834,"end_character":32},"in_reply_to":"df33271e_85c6a267","updated":"2020-06-02 09:46:39.000000000","message":"Its in the tests, you see -1 for the security_group rules. This was to keep it the same as the no op driver.\n\nBut checking the tests, we should move that to the default for the db driver, given that is what most people who have quotas on want the API to stay the same to. Sounds more sensible, as you note.","commit_id":"9064f2ad01224aa840151231d3ef2b599d45f5fe"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"aca8916b19d3d9cb2b050d2c48d3e41518fcfac5","unresolved":true,"context_lines":[{"line_number":807,"context_line":"    def get_defaults(self, context, resources):"},{"line_number":808,"context_line":"        local_limits \u003d local_limit.get_local_limits()"},{"line_number":809,"context_line":"        # Note we get 0 if there is no registered limit,"},{"line_number":810,"context_line":"        # to mirror oslo_limit behaviour when there is no registered limit"},{"line_number":811,"context_line":"        keystone_limits \u003d keystone_limit.get_legacy_default_limits()"},{"line_number":812,"context_line":""},{"line_number":813,"context_line":"        # Default to unlimited, as per no-op for everything that isn\u0027t"}],"source_content_type":"text/x-python","patch_set":9,"id":"2cf1ff9c_6c3d46d7","line":810,"updated":"2021-05-06 22:30:21.000000000","message":"I observed this behavior when I tried running this patch series in nova-next without first setting a registered limit for DISK_GB:\n\n Details: {\u0027code\u0027: 403, \u0027message\u0027: \u0027Quota exceeded for class:DISK_GB: Requested 0, but already used 0 of 0 class:DISK_GB\u0027}\n\nI worry a little if the error is too unrelated to what\u0027s actually wrong, could be confusing for users.","commit_id":"2a108861c22b99d284f42ca7e8923a0546d10c0b"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"d0836dbcebf0333de0fbe622ddaf2abf2691835f","unresolved":false,"context_lines":[{"line_number":807,"context_line":"    def get_defaults(self, context, resources):"},{"line_number":808,"context_line":"        local_limits \u003d local_limit.get_local_limits()"},{"line_number":809,"context_line":"        # Note we get 0 if there is no registered limit,"},{"line_number":810,"context_line":"        # to mirror oslo_limit behaviour when there is no registered limit"},{"line_number":811,"context_line":"        keystone_limits \u003d keystone_limit.get_legacy_default_limits()"},{"line_number":812,"context_line":""},{"line_number":813,"context_line":"        # Default to unlimited, as per no-op for everything that isn\u0027t"}],"source_content_type":"text/x-python","patch_set":9,"id":"0cd987f3_9b82373a","line":810,"in_reply_to":"2cf1ff9c_6c3d46d7","updated":"2022-02-11 03:13:31.000000000","message":"Ack","commit_id":"2a108861c22b99d284f42ca7e8923a0546d10c0b"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"646a44c29a61555b83d58a0e23b387b77a691d8d","unresolved":true,"context_lines":[{"line_number":808,"context_line":"        local_limits \u003d local_limit.get_legacy_default_limits()"},{"line_number":809,"context_line":"        # Note we get 0 if there is no registered limit,"},{"line_number":810,"context_line":"        # to mirror oslo_limit behaviour when there is no registered limit"},{"line_number":811,"context_line":"        placement_limits \u003d placement_limit.get_legacy_default_limits()"},{"line_number":812,"context_line":"        quotas \u003d {}"},{"line_number":813,"context_line":"        for resource in resources.values():"},{"line_number":814,"context_line":"            if resource.name in placement_limits:"}],"source_content_type":"text/x-python","patch_set":13,"id":"3159d43d_4f190f49","line":811,"updated":"2021-08-29 03:36:37.000000000","message":"Note to reviewers: this change makes it so that cores/ram/instances default to a limit of 0 if they are not found in keystone. Prior to this line, cores/ram/instances were defaulting to -1 unlimited as they were not being pulled from keystone limits yet.","commit_id":"8ae48c2fa08504b226ac96c696c3574b59da9c59"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"d0836dbcebf0333de0fbe622ddaf2abf2691835f","unresolved":false,"context_lines":[{"line_number":808,"context_line":"        local_limits \u003d local_limit.get_legacy_default_limits()"},{"line_number":809,"context_line":"        # Note we get 0 if there is no registered limit,"},{"line_number":810,"context_line":"        # to mirror oslo_limit behaviour when there is no registered limit"},{"line_number":811,"context_line":"        placement_limits \u003d placement_limit.get_legacy_default_limits()"},{"line_number":812,"context_line":"        quotas \u003d {}"},{"line_number":813,"context_line":"        for resource in resources.values():"},{"line_number":814,"context_line":"            if resource.name in placement_limits:"}],"source_content_type":"text/x-python","patch_set":13,"id":"7e789a23_dba31c84","line":811,"in_reply_to":"3159d43d_4f190f49","updated":"2022-02-11 03:13:31.000000000","message":"Ack","commit_id":"8ae48c2fa08504b226ac96c696c3574b59da9c59"}],"nova/tests/unit/api/openstack/compute/test_limits.py":[{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"22fe510b4e68095a047b5f8bb0ff1a87c7e866c0","unresolved":false,"context_lines":[{"line_number":585,"context_line":"                    \u0027maxTotalKeypairs\u0027: 100,"},{"line_number":586,"context_line":"                    \u0027maxTotalRAMSize\u0027: 3,"},{"line_number":587,"context_line":"                    \u0027totalCoresUsed\u0027: 5,"},{"line_number":588,"context_line":"                    \u0027totalFloatingIpsUsed\u0027: -1,"},{"line_number":589,"context_line":"                    \u0027totalInstancesUsed\u0027: 4,"},{"line_number":590,"context_line":"                    \u0027totalRAMUsed\u0027: 6,"},{"line_number":591,"context_line":"                    \u0027totalSecurityGroupsUsed\u0027: -1,"}],"source_content_type":"text/x-python","patch_set":6,"id":"ff570b3c_206a0a80","line":588,"updated":"2020-06-02 09:56:03.000000000","message":"Also tested here I guess.","commit_id":"9064f2ad01224aa840151231d3ef2b599d45f5fe"}],"nova/tests/unit/test_quota.py":[{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"34b196affde6fcc6f00996d4f499e3839db13cba","unresolved":false,"context_lines":[{"line_number":2001,"context_line":"            \u0027metadata_items\u0027: {\u0027in_use\u0027: 0, \u0027limit\u0027: 128},"},{"line_number":2002,"context_line":"            \u0027ram\u0027: {\u0027in_use\u0027: 6, \u0027limit\u0027: 3},"},{"line_number":2003,"context_line":"            \u0027security_group_rules\u0027: {\u0027in_use\u0027: -1, \u0027limit\u0027: -1},"},{"line_number":2004,"context_line":"            \u0027security_groups\u0027: {\u0027in_use\u0027: -1, \u0027limit\u0027: -1},"},{"line_number":2005,"context_line":"            \u0027server_group_members\u0027: {\u0027in_use\u0027: 0, \u0027limit\u0027: 10},"},{"line_number":2006,"context_line":"            \u0027server_groups\u0027: {\u0027in_use\u0027: 9, \u0027limit\u0027: 12}"},{"line_number":2007,"context_line":"        }"}],"source_content_type":"text/x-python","patch_set":6,"id":"ff570b3c_c094ee8d","line":2004,"updated":"2020-06-02 09:52:01.000000000","message":"These are the test I mean.","commit_id":"9064f2ad01224aa840151231d3ef2b599d45f5fe"}]}
