)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"f226d81260e3762b88bc328abcabe4e5b21442ac","unresolved":true,"context_lines":[{"line_number":14,"context_line":"``UnifiedLimitsDriver`` and quota for any resource not in"},{"line_number":15,"context_line":"``[quota]unified_limits_required_resources`` will be considered as"},{"line_number":16,"context_line":"unlimited. The list can be set to an empty list if desired."},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"Change-Id: Icb08fadbdbf9c1bf354c3091f05edce80ebf68c3"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":11,"id":"e5da8f20_fa3b604b","line":17,"updated":"2024-11-04 19:16:37.000000000","message":"Related to blueprint unified-limits-nova-unset-limits","commit_id":"90a5455c340dd81d9dbd297b0c1dc0e3f38f9814"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"033a4c5e1ebea86197818fc22c6e5a9915052495","unresolved":false,"context_lines":[{"line_number":14,"context_line":"``UnifiedLimitsDriver`` and quota for any resource not in"},{"line_number":15,"context_line":"``[quota]unified_limits_required_resources`` will be considered as"},{"line_number":16,"context_line":"unlimited. The list can be set to an empty list if desired."},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"Change-Id: Icb08fadbdbf9c1bf354c3091f05edce80ebf68c3"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":11,"id":"493396ba_202f3783","line":17,"in_reply_to":"e5da8f20_fa3b604b","updated":"2024-11-20 16:07:55.000000000","message":"Done","commit_id":"90a5455c340dd81d9dbd297b0c1dc0e3f38f9814"}],"/PATCHSET_LEVEL":[{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"0d603003c9c7d708b3ea119a9c68c6f3d6aa00a8","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":10,"id":"b2346b05_269c4d5e","updated":"2024-10-28 23:40:18.000000000","message":"Going to change this to a `[quota]unified_limits_required_resources` list config option","commit_id":"0138b7e4083a33e9bed2c8c00c126fa79d5eee4a"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"ddc26907b8749a289c98d459a0259ae66f9e0bac","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":10,"id":"bc223e25_96b96cd6","updated":"2024-10-22 15:39:40.000000000","message":"I like this approach, although I think we should protect against SERVERS and MEMORY_MB being a protection here... sounds like we want a FIXME in here instead.","commit_id":"0138b7e4083a33e9bed2c8c00c126fa79d5eee4a"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"ced2ea040bae00ca1315df1f7a697d8946897e63","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":10,"id":"6a59c1f5_937828fb","updated":"2024-08-22 23:16:13.000000000","message":"recheck guest kernel panic [    9.184803] ---[ end Kernel panic - not syncing: Attempted to kill init! exitcode\u003d0x00001000 ]---","commit_id":"0138b7e4083a33e9bed2c8c00c126fa79d5eee4a"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"8aa91b4c225fea762b806b5197184611c963c9b9","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":16,"id":"3c2977f5_37dec8b2","updated":"2024-11-20 11:47:39.000000000","message":"+1 while dan is reviewing\nsome questions inline but overall im ok with this.","commit_id":"3f0e9f1a39bb4cb621fd9772c8b5f02f8796d41b"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"dad1d53bc82b0d049b9817c81670f2064a4d7106","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":17,"id":"28af8dbb_b7cc8d4c","updated":"2024-11-21 21:55:06.000000000","message":"i wont get to this today unfortunetly but ill review tomorrow","commit_id":"c275dfccb9c8da76e9825fde1e1701afa62e7537"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"6eb7f7adbf81a5df855b5db9ecfb33fd6dd404a5","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":17,"id":"c5b4f79f_4eb65d12","updated":"2024-11-21 18:59:34.000000000","message":"recheck NoValidHost and urllib3.exceptions.ReadTimeoutError: HTTPSConnectionPool(host\u003d\u0027200.225.47.58\u0027, port\u003d443): Read timed out. (read timeout\u003d90)","commit_id":"c275dfccb9c8da76e9825fde1e1701afa62e7537"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"19c2373b866f1be1f07a30bd2152dd70260565ad","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":17,"id":"3c4a5a0a_a8382c15","updated":"2024-11-21 16:17:47.000000000","message":"recheck [    6.636451] ---[ end Kernel panic - not syncing: Attempted to kill init! exitcode\u003d0x00001000 ]---","commit_id":"c275dfccb9c8da76e9825fde1e1701afa62e7537"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"b02ecdf145d0a259e4a72161a7f9dfdbdf0c310c","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":19,"id":"3e849e22_41e4ed67","updated":"2024-11-22 19:50:02.000000000","message":"Aside from the bug (I think) I\u0027m good now, thanks.","commit_id":"01553e93e487e343b16d90ec564e591a955fd250"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"dd19e8c4d614882bdff84ff4ae6daf3bffe17192","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":20,"id":"0886e851_d24bd705","updated":"2024-11-22 20:54:14.000000000","message":"Nice, thanks.","commit_id":"9d05b6d141eaef997784c7a4a46360f83346029b"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"b1a37f1f39ed0955cd7b52bd060be713c2645811","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":21,"id":"3811dc5b_491c0fca","updated":"2024-11-25 18:00:01.000000000","message":"i left some nits/comments inline but nothign worth adressing directly.\n\nwe coudl have a followup but im happy to proceed with this as is","commit_id":"fd5b6929053ca6065e90054422f4b23b166c7df1"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"7697b0fc7bdc2a827b6d859e2c87a6cd8619ce23","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":21,"id":"63b563b1_beafdaaa","updated":"2024-11-23 01:59:21.000000000","message":"recheck unrelated openstack.tests.functional.block_storage.v3.test_backup.TestBackup failed","commit_id":"fd5b6929053ca6065e90054422f4b23b166c7df1"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"becccdedaf76983b84d69853e6d395d44bc93655","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":21,"id":"b84f470b_c0520d3c","in_reply_to":"63b563b1_beafdaaa","updated":"2024-11-23 02:01:31.000000000","message":"Nov 22 22:25:05.270844 np0039144779 cinder-scheduler[86826]: ERROR cinder.scheduler.manager [None req-5bca75eb-5fe3-48f4-9bb2-0711a0403314 demo None] Service not found for creating backup.: cinder.exception.ServiceNotFound: Service cinder-backup could not be found.","commit_id":"fd5b6929053ca6065e90054422f4b23b166c7df1"}],"doc/source/admin/unified-limits.rst":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"ae2ef90a4d8844e0df7f487bbccfdfc2575b7b75","unresolved":true,"context_lines":[{"line_number":409,"context_line":"can be set to an empty list if desired."},{"line_number":410,"context_line":""},{"line_number":411,"context_line":"The option should be configured for the :program:`nova-api` and"},{"line_number":412,"context_line":":program:`nova-conductor` services."},{"line_number":413,"context_line":""},{"line_number":414,"context_line":"Example configuration value:"},{"line_number":415,"context_line":""}],"source_content_type":"text/x-rst","patch_set":13,"id":"59d2393b_1aa9cf0d","line":412,"updated":"2024-11-12 18:58:18.000000000","message":"the API makes sense, in what case is this needed for the conductor?\n\nis it like resizing where the compute needs the pci alias for a a specific instance action?","commit_id":"3af3c584894685a97a682655c21f1a287e1705ed"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"8aa91b4c225fea762b806b5197184611c963c9b9","unresolved":false,"context_lines":[{"line_number":409,"context_line":"can be set to an empty list if desired."},{"line_number":410,"context_line":""},{"line_number":411,"context_line":"The option should be configured for the :program:`nova-api` and"},{"line_number":412,"context_line":":program:`nova-conductor` services."},{"line_number":413,"context_line":""},{"line_number":414,"context_line":"Example configuration value:"},{"line_number":415,"context_line":""}],"source_content_type":"text/x-rst","patch_set":13,"id":"df6153b5_c7411a47","line":412,"in_reply_to":"575a558c_cfb6fd28","updated":"2024-11-20 11:47:39.000000000","message":"Acknowledged","commit_id":"3af3c584894685a97a682655c21f1a287e1705ed"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"5cf796ac5daaede6946e8a05262dbb610226df39","unresolved":true,"context_lines":[{"line_number":409,"context_line":"can be set to an empty list if desired."},{"line_number":410,"context_line":""},{"line_number":411,"context_line":"The option should be configured for the :program:`nova-api` and"},{"line_number":412,"context_line":":program:`nova-conductor` services."},{"line_number":413,"context_line":""},{"line_number":414,"context_line":"Example configuration value:"},{"line_number":415,"context_line":""}],"source_content_type":"text/x-rst","patch_set":13,"id":"575a558c_cfb6fd28","line":412,"in_reply_to":"59d2393b_1aa9cf0d","updated":"2024-11-13 00:08:56.000000000","message":"In conductor is where the quota \"recheck\" happens after resources have been allocated. (Quota recheck is however configurable).","commit_id":"3af3c584894685a97a682655c21f1a287e1705ed"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"e019470300b7109ed50826772a54d9a1b95051cf","unresolved":true,"context_lines":[{"line_number":403,"context_line":"The :oslo.config:option:`quota.unified_limits_resource_strategy` and"},{"line_number":404,"context_line":":oslo.config:option:`quota.unified_limits_resource_list` configuration options"},{"line_number":405,"context_line":"are available for operators to specify which cloud resources they will either"},{"line_number":406,"context_line":"require or ignore to have registered limits set in Keystone. The default is"},{"line_number":407,"context_line":"strategy is ``require`` and the default resource list contains the ``servers``"},{"line_number":408,"context_line":"resource."},{"line_number":409,"context_line":""}],"source_content_type":"text/x-rst","patch_set":17,"id":"1e57b834_efaea052","line":406,"range":{"start_line":406,"start_character":11,"end_line":406,"end_character":25},"updated":"2024-11-21 21:28:45.000000000","message":"\"ignore to have\" is a little weird to read. Even just \"require or not require\" would be better I think, but perhaps just \"require to have registered...\" would be enough.","commit_id":"c275dfccb9c8da76e9825fde1e1701afa62e7537"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"e019470300b7109ed50826772a54d9a1b95051cf","unresolved":true,"context_lines":[{"line_number":403,"context_line":"The :oslo.config:option:`quota.unified_limits_resource_strategy` and"},{"line_number":404,"context_line":":oslo.config:option:`quota.unified_limits_resource_list` configuration options"},{"line_number":405,"context_line":"are available for operators to specify which cloud resources they will either"},{"line_number":406,"context_line":"require or ignore to have registered limits set in Keystone. The default is"},{"line_number":407,"context_line":"strategy is ``require`` and the default resource list contains the ``servers``"},{"line_number":408,"context_line":"resource."},{"line_number":409,"context_line":""}],"source_content_type":"text/x-rst","patch_set":17,"id":"beff4505_cc3741ce","line":406,"range":{"start_line":406,"start_character":65,"end_line":406,"end_character":75},"updated":"2024-11-21 21:28:45.000000000","message":"s/default is strategy/default strategy/","commit_id":"c275dfccb9c8da76e9825fde1e1701afa62e7537"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"545ceb0ab618bccdf28497d13a8abca4796bdc0f","unresolved":false,"context_lines":[{"line_number":403,"context_line":"The :oslo.config:option:`quota.unified_limits_resource_strategy` and"},{"line_number":404,"context_line":":oslo.config:option:`quota.unified_limits_resource_list` configuration options"},{"line_number":405,"context_line":"are available for operators to specify which cloud resources they will either"},{"line_number":406,"context_line":"require or ignore to have registered limits set in Keystone. The default is"},{"line_number":407,"context_line":"strategy is ``require`` and the default resource list contains the ``servers``"},{"line_number":408,"context_line":"resource."},{"line_number":409,"context_line":""}],"source_content_type":"text/x-rst","patch_set":17,"id":"4bfe4bf9_757111f4","line":406,"range":{"start_line":406,"start_character":11,"end_line":406,"end_character":25},"in_reply_to":"1e57b834_efaea052","updated":"2024-11-22 02:19:37.000000000","message":"Done","commit_id":"c275dfccb9c8da76e9825fde1e1701afa62e7537"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"545ceb0ab618bccdf28497d13a8abca4796bdc0f","unresolved":false,"context_lines":[{"line_number":403,"context_line":"The :oslo.config:option:`quota.unified_limits_resource_strategy` and"},{"line_number":404,"context_line":":oslo.config:option:`quota.unified_limits_resource_list` configuration options"},{"line_number":405,"context_line":"are available for operators to specify which cloud resources they will either"},{"line_number":406,"context_line":"require or ignore to have registered limits set in Keystone. The default is"},{"line_number":407,"context_line":"strategy is ``require`` and the default resource list contains the ``servers``"},{"line_number":408,"context_line":"resource."},{"line_number":409,"context_line":""}],"source_content_type":"text/x-rst","patch_set":17,"id":"ed397d9d_6a9195a1","line":406,"range":{"start_line":406,"start_character":65,"end_line":406,"end_character":75},"in_reply_to":"beff4505_cc3741ce","updated":"2024-11-22 02:19:37.000000000","message":"Done","commit_id":"c275dfccb9c8da76e9825fde1e1701afa62e7537"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"e019470300b7109ed50826772a54d9a1b95051cf","unresolved":true,"context_lines":[{"line_number":410,"context_line":"When ``unified_limits_resource_strategy \u003d require``, if a resource in"},{"line_number":411,"context_line":"``unified_limits_resource_list`` is requested and has no registered limit set,"},{"line_number":412,"context_line":"the quota limit for that resource will be considered to be 0 and all requests"},{"line_number":413,"context_line":"to allocate that resource will be rejected for being over quota."},{"line_number":414,"context_line":""},{"line_number":415,"context_line":"When ``unified_limits_resource_strategy \u003d ignore``, if a resource in"},{"line_number":416,"context_line":"``unified_limits_resource_list`` is requested and has no registered limit set,"}],"source_content_type":"text/x-rst","patch_set":17,"id":"0816a1f1_d6c7a7b2","line":413,"updated":"2024-11-21 21:28:45.000000000","message":"\"...and any not in the list will be considered unlimited\" for clarity I think.","commit_id":"c275dfccb9c8da76e9825fde1e1701afa62e7537"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"545ceb0ab618bccdf28497d13a8abca4796bdc0f","unresolved":false,"context_lines":[{"line_number":410,"context_line":"When ``unified_limits_resource_strategy \u003d require``, if a resource in"},{"line_number":411,"context_line":"``unified_limits_resource_list`` is requested and has no registered limit set,"},{"line_number":412,"context_line":"the quota limit for that resource will be considered to be 0 and all requests"},{"line_number":413,"context_line":"to allocate that resource will be rejected for being over quota."},{"line_number":414,"context_line":""},{"line_number":415,"context_line":"When ``unified_limits_resource_strategy \u003d ignore``, if a resource in"},{"line_number":416,"context_line":"``unified_limits_resource_list`` is requested and has no registered limit set,"}],"source_content_type":"text/x-rst","patch_set":17,"id":"ec8a39a9_efa3b1c8","line":413,"in_reply_to":"0816a1f1_d6c7a7b2","updated":"2024-11-22 02:19:37.000000000","message":"Done","commit_id":"c275dfccb9c8da76e9825fde1e1701afa62e7537"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"e019470300b7109ed50826772a54d9a1b95051cf","unresolved":true,"context_lines":[{"line_number":415,"context_line":"When ``unified_limits_resource_strategy \u003d ignore``, if a resource in"},{"line_number":416,"context_line":"``unified_limits_resource_list`` is requested and has no registered limit set,"},{"line_number":417,"context_line":"the quota limit for that resource will be considered to be unlimited and all"},{"line_number":418,"context_line":"requests to allocate that resource will be accepted."},{"line_number":419,"context_line":""},{"line_number":420,"context_line":"The options should be configured for the :program:`nova-api` and"},{"line_number":421,"context_line":":program:`nova-conductor` services. The :program:`nova-conductor` service"}],"source_content_type":"text/x-rst","patch_set":17,"id":"eb46db96_2e10bc04","line":418,"updated":"2024-11-21 21:28:45.000000000","message":"...and (the opposite of above)","commit_id":"c275dfccb9c8da76e9825fde1e1701afa62e7537"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"545ceb0ab618bccdf28497d13a8abca4796bdc0f","unresolved":false,"context_lines":[{"line_number":415,"context_line":"When ``unified_limits_resource_strategy \u003d ignore``, if a resource in"},{"line_number":416,"context_line":"``unified_limits_resource_list`` is requested and has no registered limit set,"},{"line_number":417,"context_line":"the quota limit for that resource will be considered to be unlimited and all"},{"line_number":418,"context_line":"requests to allocate that resource will be accepted."},{"line_number":419,"context_line":""},{"line_number":420,"context_line":"The options should be configured for the :program:`nova-api` and"},{"line_number":421,"context_line":":program:`nova-conductor` services. The :program:`nova-conductor` service"}],"source_content_type":"text/x-rst","patch_set":17,"id":"1375b90b_803b458a","line":418,"in_reply_to":"eb46db96_2e10bc04","updated":"2024-11-22 02:19:37.000000000","message":"Done","commit_id":"c275dfccb9c8da76e9825fde1e1701afa62e7537"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"e019470300b7109ed50826772a54d9a1b95051cf","unresolved":true,"context_lines":[{"line_number":420,"context_line":"The options should be configured for the :program:`nova-api` and"},{"line_number":421,"context_line":":program:`nova-conductor` services. The :program:`nova-conductor` service"},{"line_number":422,"context_line":"performs quota enforcement when :oslo.config:option:`quota.recheck_quota` is"},{"line_number":423,"context_line":"``True`` (the default)."},{"line_number":424,"context_line":""},{"line_number":425,"context_line":"The ``unified_limits_resource_list`` list can also be set to an empty list."},{"line_number":426,"context_line":""}],"source_content_type":"text/x-rst","patch_set":17,"id":"b9b5324e_a0f69249","line":423,"updated":"2024-11-21 21:28:45.000000000","message":"Hmm, we never check this from compute? You may be right, I\u0027m just surprised.","commit_id":"c275dfccb9c8da76e9825fde1e1701afa62e7537"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"b1a37f1f39ed0955cd7b52bd060be713c2645811","unresolved":false,"context_lines":[{"line_number":420,"context_line":"The options should be configured for the :program:`nova-api` and"},{"line_number":421,"context_line":":program:`nova-conductor` services. The :program:`nova-conductor` service"},{"line_number":422,"context_line":"performs quota enforcement when :oslo.config:option:`quota.recheck_quota` is"},{"line_number":423,"context_line":"``True`` (the default)."},{"line_number":424,"context_line":""},{"line_number":425,"context_line":"The ``unified_limits_resource_list`` list can also be set to an empty list."},{"line_number":426,"context_line":""}],"source_content_type":"text/x-rst","patch_set":17,"id":"fe8407e1_3ba7974c","line":423,"in_reply_to":"8593727f_ba8cdeb1","updated":"2024-11-25 18:00:01.000000000","message":"Acknowledged","commit_id":"c275dfccb9c8da76e9825fde1e1701afa62e7537"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"1e80e7b6e2b8695b971d6369d1f02aab1aa39225","unresolved":true,"context_lines":[{"line_number":420,"context_line":"The options should be configured for the :program:`nova-api` and"},{"line_number":421,"context_line":":program:`nova-conductor` services. The :program:`nova-conductor` service"},{"line_number":422,"context_line":"performs quota enforcement when :oslo.config:option:`quota.recheck_quota` is"},{"line_number":423,"context_line":"``True`` (the default)."},{"line_number":424,"context_line":""},{"line_number":425,"context_line":"The ``unified_limits_resource_list`` list can also be set to an empty list."},{"line_number":426,"context_line":""}],"source_content_type":"text/x-rst","patch_set":17,"id":"8593727f_ba8cdeb1","line":423,"in_reply_to":"b9b5324e_a0f69249","updated":"2024-11-21 21:49:53.000000000","message":"Yeah, quota checking historically has been intentionally avoided on computes. Maybe in part because of the old config option way of setting limits, the idea of having to update them on all computes every time you changed something.","commit_id":"c275dfccb9c8da76e9825fde1e1701afa62e7537"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"b1a37f1f39ed0955cd7b52bd060be713c2645811","unresolved":true,"context_lines":[{"line_number":410,"context_line":"``unified_limits_resource_list`` is requested and has no registered limit set,"},{"line_number":411,"context_line":"the quota limit for that resource will be considered to be 0 and all requests"},{"line_number":412,"context_line":"to allocate that resource will be rejected for being over quota. Any resource"},{"line_number":413,"context_line":"not in the list will be considered to have unlimited quota."},{"line_number":414,"context_line":""},{"line_number":415,"context_line":"When ``unified_limits_resource_strategy \u003d ignore``, if a resource in"},{"line_number":416,"context_line":"``unified_limits_resource_list`` is requested and has no registered limit set,"}],"source_content_type":"text/x-rst","patch_set":21,"id":"acb6c0d6_3c4fe975","line":413,"updated":"2024-11-25 18:00:01.000000000","message":"nit: will be considered to have an unlimited quota no registered limit is set.","commit_id":"fd5b6929053ca6065e90054422f4b23b166c7df1"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"b1a37f1f39ed0955cd7b52bd060be713c2645811","unresolved":true,"context_lines":[{"line_number":416,"context_line":"``unified_limits_resource_list`` is requested and has no registered limit set,"},{"line_number":417,"context_line":"the quota limit for that resource will be considered to be unlimited and all"},{"line_number":418,"context_line":"requests to allocate that resource will be accepted. Any resource not in the"},{"line_number":419,"context_line":"list will be considered to have 0 quota."},{"line_number":420,"context_line":""},{"line_number":421,"context_line":"The options should be configured for the :program:`nova-api` and"},{"line_number":422,"context_line":":program:`nova-conductor` services. The :program:`nova-conductor` service"}],"source_content_type":"text/x-rst","patch_set":21,"id":"caaa2c1f_72eae265","line":419,"updated":"2024-11-25 18:00:01.000000000","message":"same nit here.\ni understand form context what is being said here but the \n\n\"is requested and has no registered limit set,\" caveat is in a different sentence\nall be it in the same paragraph.","commit_id":"fd5b6929053ca6065e90054422f4b23b166c7df1"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"b1a37f1f39ed0955cd7b52bd060be713c2645811","unresolved":false,"context_lines":[{"line_number":431,"context_line":""},{"line_number":432,"context_line":"   [quota]"},{"line_number":433,"context_line":"   unified_limits_resource_strategy \u003d require"},{"line_number":434,"context_line":"   unified_limits_resource_list \u003d servers,class:VCPU,class:MEMORY_MB,class:DISK_GB"}],"source_content_type":"text/x-rst","patch_set":21,"id":"e1df1080_9419a256","line":434,"updated":"2024-11-25 18:00:01.000000000","message":"+1","commit_id":"fd5b6929053ca6065e90054422f4b23b166c7df1"}],"nova/conf/quota.py":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"ae2ef90a4d8844e0df7f487bbccfdfc2575b7b75","unresolved":true,"context_lines":[{"line_number":292,"context_line":"checks will fail for being over quota if unified limits are enabled but no"},{"line_number":293,"context_line":"limits have been set."},{"line_number":294,"context_line":"\"\"\"),"},{"line_number":295,"context_line":"]"},{"line_number":296,"context_line":""},{"line_number":297,"context_line":""},{"line_number":298,"context_line":"def register_opts(conf):"}],"source_content_type":"text/x-python","patch_set":7,"id":"8448a953_96ff8344","line":295,"updated":"2024-11-12 18:58:18.000000000","message":"+1 I assume the `class:` prefix is just required to make it simpler to differentiate placement countable items for the legacy ones like keypairs?\n\nthe only other suggestion i have is it might help to provide an example in the expect format in the help text\n\n[quota]\nunified_limits_required_resources \u003d servers,class:VCPU,class:MEMORY_MB\n\nby the way i assume this is case insensitive since the cannoncal form a a resouce class is capitabl but i woudl kid of expect class:memory_mb to also work.\n\nif we are matching on case then w shoudl call that out either way.","commit_id":"9beb1f1d7e65a2e623e8fc94bd65de123019561b"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"5cf796ac5daaede6946e8a05262dbb610226df39","unresolved":true,"context_lines":[{"line_number":292,"context_line":"checks will fail for being over quota if unified limits are enabled but no"},{"line_number":293,"context_line":"limits have been set."},{"line_number":294,"context_line":"\"\"\"),"},{"line_number":295,"context_line":"]"},{"line_number":296,"context_line":""},{"line_number":297,"context_line":""},{"line_number":298,"context_line":"def register_opts(conf):"}],"source_content_type":"text/x-python","patch_set":7,"id":"883f3ee3_825b1a05","line":295,"in_reply_to":"8448a953_96ff8344","updated":"2024-11-13 00:08:56.000000000","message":"\u003e +1 I assume the `class:` prefix is just required to make it simpler to differentiate placement countable items for the legacy ones like keypairs?\n\nI believe so, that it\u0027s to indicate a Placement resource class. Resource counted from Placement.\n\n\u003e the only other suggestion i have is it might help to provide an example in the expect format in the help text\n\u003e \n\u003e [quota]\n\u003e unified_limits_required_resources \u003d servers,class:VCPU,class:MEMORY_MB\n\nSure, I can add that. I think I put it in the docs but here also it would be good.\n\n\u003e by the way i assume this is case insensitive since the cannoncal form a a resouce class is capitabl but i woudl kid of expect class:memory_mb to also work.\n\u003e \n\u003e if we are matching on case then w shoudl call that out either way.\n\nI don\u0027t think the existing unified limit quota check is case insensitive. I would expect the casing to match exactly what is in Placement but maybe that is just me.","commit_id":"9beb1f1d7e65a2e623e8fc94bd65de123019561b"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"8aa91b4c225fea762b806b5197184611c963c9b9","unresolved":false,"context_lines":[{"line_number":292,"context_line":"checks will fail for being over quota if unified limits are enabled but no"},{"line_number":293,"context_line":"limits have been set."},{"line_number":294,"context_line":"\"\"\"),"},{"line_number":295,"context_line":"]"},{"line_number":296,"context_line":""},{"line_number":297,"context_line":""},{"line_number":298,"context_line":"def register_opts(conf):"}],"source_content_type":"text/x-python","patch_set":7,"id":"89606b96_949435a6","line":295,"in_reply_to":"883f3ee3_825b1a05","updated":"2024-11-20 11:47:39.000000000","message":"Acknowledged","commit_id":"9beb1f1d7e65a2e623e8fc94bd65de123019561b"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"8aa91b4c225fea762b806b5197184611c963c9b9","unresolved":true,"context_lines":[{"line_number":279,"context_line":"             \u0027in Keystone\u0027),"},{"line_number":280,"context_line":"            (\u0027ignore\u0027, \u0027Ignore the resources in \u0027"},{"line_number":281,"context_line":"             \u0027``unified_limits_resource_list`` if they do not have registered \u0027"},{"line_number":282,"context_line":"             \u0027limits set in Keystone\u0027),"},{"line_number":283,"context_line":"        ],"},{"line_number":284,"context_line":"        help\u003d\"\"\""},{"line_number":285,"context_line":"Specify the semantics of the ``unified_limits_resource_list``."}],"source_content_type":"text/x-python","patch_set":16,"id":"32c00161_43fc54a6","line":282,"updated":"2024-11-20 11:47:39.000000000","message":"im not personally sure where an operator would want to use ignore\nbut if this works for dan then +1","commit_id":"3f0e9f1a39bb4cb621fd9772c8b5f02f8796d41b"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"033a4c5e1ebea86197818fc22c6e5a9915052495","unresolved":true,"context_lines":[{"line_number":279,"context_line":"             \u0027in Keystone\u0027),"},{"line_number":280,"context_line":"            (\u0027ignore\u0027, \u0027Ignore the resources in \u0027"},{"line_number":281,"context_line":"             \u0027``unified_limits_resource_list`` if they do not have registered \u0027"},{"line_number":282,"context_line":"             \u0027limits set in Keystone\u0027),"},{"line_number":283,"context_line":"        ],"},{"line_number":284,"context_line":"        help\u003d\"\"\""},{"line_number":285,"context_line":"Specify the semantics of the ``unified_limits_resource_list``."}],"source_content_type":"text/x-python","patch_set":16,"id":"342bd178_8ff9548e","line":282,"in_reply_to":"32c00161_43fc54a6","updated":"2024-11-20 16:07:55.000000000","message":"I\u0027m not sure but this is meant to enable someone to say, \"I care about requiring limits for all resources except these\".","commit_id":"3f0e9f1a39bb4cb621fd9772c8b5f02f8796d41b"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"6e1e88c413ff4936366e036aba60e5ac1a929448","unresolved":true,"context_lines":[{"line_number":279,"context_line":"             \u0027in Keystone\u0027),"},{"line_number":280,"context_line":"            (\u0027ignore\u0027, \u0027Ignore the resources in \u0027"},{"line_number":281,"context_line":"             \u0027``unified_limits_resource_list`` if they do not have registered \u0027"},{"line_number":282,"context_line":"             \u0027limits set in Keystone\u0027),"},{"line_number":283,"context_line":"        ],"},{"line_number":284,"context_line":"        help\u003d\"\"\""},{"line_number":285,"context_line":"Specify the semantics of the ``unified_limits_resource_list``."}],"source_content_type":"text/x-python","patch_set":16,"id":"4acac3ae_9e734749","line":282,"in_reply_to":"342bd178_8ff9548e","updated":"2024-11-20 19:23:31.000000000","message":"ya that might be something someone wants to do\ni personally would hope you coudl do that by registerign a limit with -1\n\nthat siad i dont object to it i just woudl not personally use ignore.","commit_id":"3f0e9f1a39bb4cb621fd9772c8b5f02f8796d41b"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"b1a37f1f39ed0955cd7b52bd060be713c2645811","unresolved":false,"context_lines":[{"line_number":279,"context_line":"             \u0027in Keystone\u0027),"},{"line_number":280,"context_line":"            (\u0027ignore\u0027, \u0027Ignore the resources in \u0027"},{"line_number":281,"context_line":"             \u0027``unified_limits_resource_list`` if they do not have registered \u0027"},{"line_number":282,"context_line":"             \u0027limits set in Keystone\u0027),"},{"line_number":283,"context_line":"        ],"},{"line_number":284,"context_line":"        help\u003d\"\"\""},{"line_number":285,"context_line":"Specify the semantics of the ``unified_limits_resource_list``."}],"source_content_type":"text/x-python","patch_set":16,"id":"4b31ea80_bcd1847d","line":282,"in_reply_to":"4acac3ae_9e734749","updated":"2024-11-25 18:00:01.000000000","message":"Acknowledged","commit_id":"3f0e9f1a39bb4cb621fd9772c8b5f02f8796d41b"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"cf3b9c1ed321d3b108bd1a4ce0f7552ab7f4008b","unresolved":true,"context_lines":[{"line_number":44,"context_line":"            f\u0027one of: {valid_resources} or a custom resource class name \u0027"},{"line_number":45,"context_line":"            f\u0027of the form {custom_regex[1:-1]}\u0027)"},{"line_number":46,"context_line":"        raise ValueError(msg)"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"quota_group \u003d cfg.OptGroup("},{"line_number":50,"context_line":"    name\u003d\u0027quota\u0027,"}],"source_content_type":"text/x-python","patch_set":17,"id":"19b9e68e_abee08ef","line":47,"updated":"2024-11-21 17:18:33.000000000","message":"I note that this validation triggered during loading of the config options as the service starts up. I tested in devstack and found that oslo.service based services (such as nova-conductor) will exit the process if an invalid config raises the ValueError here. For a service running a WSGI app (like nova-api) it causes the WSGI app to fail to load HOWEVER it is not exiting the process:\n\nhttps://paste.openstack.org/show/b7s0zWslkXznihw1Y3yB/\n\nNot yet sure what is needed to cause the process to exit, looking into it.","commit_id":"c275dfccb9c8da76e9825fde1e1701afa62e7537"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"4c5ab3e7cef72ef7ffba654616bbfb93a310028d","unresolved":true,"context_lines":[{"line_number":44,"context_line":"            f\u0027one of: {valid_resources} or a custom resource class name \u0027"},{"line_number":45,"context_line":"            f\u0027of the form {custom_regex[1:-1]}\u0027)"},{"line_number":46,"context_line":"        raise ValueError(msg)"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"quota_group \u003d cfg.OptGroup("},{"line_number":50,"context_line":"    name\u003d\u0027quota\u0027,"}],"source_content_type":"text/x-python","patch_set":17,"id":"7833a72e_bca6d8c2","line":47,"in_reply_to":"19b9e68e_abee08ef","updated":"2024-11-21 18:04:26.000000000","message":"Update: Sean and I discussed this on IRC and apparently this is par for the course for WSGI app running and that there are various ways a deployer can configure their uWSGI or mod_wsgi etc to behave the way they want. So it seems there is nothing additional we need to do here.","commit_id":"c275dfccb9c8da76e9825fde1e1701afa62e7537"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"b1a37f1f39ed0955cd7b52bd060be713c2645811","unresolved":false,"context_lines":[{"line_number":44,"context_line":"            f\u0027one of: {valid_resources} or a custom resource class name \u0027"},{"line_number":45,"context_line":"            f\u0027of the form {custom_regex[1:-1]}\u0027)"},{"line_number":46,"context_line":"        raise ValueError(msg)"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"quota_group \u003d cfg.OptGroup("},{"line_number":50,"context_line":"    name\u003d\u0027quota\u0027,"}],"source_content_type":"text/x-python","patch_set":17,"id":"fb4a188d_bd487ffa","line":47,"in_reply_to":"7833a72e_bca6d8c2","updated":"2024-11-25 18:00:01.000000000","message":"Acknowledged","commit_id":"c275dfccb9c8da76e9825fde1e1701afa62e7537"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"e019470300b7109ed50826772a54d9a1b95051cf","unresolved":true,"context_lines":[{"line_number":335,"context_line":"\"\"\"),"},{"line_number":336,"context_line":"    cfg.ListOpt("},{"line_number":337,"context_line":"        \u0027unified_limits_resource_list\u0027,"},{"line_number":338,"context_line":"        item_type\u003dUnifiedLimitsResource(),"},{"line_number":339,"context_line":"        default\u003d[\u0027servers\u0027],"},{"line_number":340,"context_line":"        help\u003d\"\"\""},{"line_number":341,"context_line":"Specify a list of resources to require or ignore registered limits."}],"source_content_type":"text/x-python","patch_set":17,"id":"80fb13ba_0408f37d","line":338,"updated":"2024-11-21 21:28:45.000000000","message":"Aha, now I see the linkage between the conversation this morning and the code. Sneaky.","commit_id":"c275dfccb9c8da76e9825fde1e1701afa62e7537"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"1e80e7b6e2b8695b971d6369d1f02aab1aa39225","unresolved":true,"context_lines":[{"line_number":335,"context_line":"\"\"\"),"},{"line_number":336,"context_line":"    cfg.ListOpt("},{"line_number":337,"context_line":"        \u0027unified_limits_resource_list\u0027,"},{"line_number":338,"context_line":"        item_type\u003dUnifiedLimitsResource(),"},{"line_number":339,"context_line":"        default\u003d[\u0027servers\u0027],"},{"line_number":340,"context_line":"        help\u003d\"\"\""},{"line_number":341,"context_line":"Specify a list of resources to require or ignore registered limits."}],"source_content_type":"text/x-python","patch_set":17,"id":"d8b598d9_5a74023e","line":338,"in_reply_to":"80fb13ba_0408f37d","updated":"2024-11-21 21:49:53.000000000","message":"I think it\u0027s pretty neat 🙂","commit_id":"c275dfccb9c8da76e9825fde1e1701afa62e7537"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"b1a37f1f39ed0955cd7b52bd060be713c2645811","unresolved":false,"context_lines":[{"line_number":335,"context_line":"\"\"\"),"},{"line_number":336,"context_line":"    cfg.ListOpt("},{"line_number":337,"context_line":"        \u0027unified_limits_resource_list\u0027,"},{"line_number":338,"context_line":"        item_type\u003dUnifiedLimitsResource(),"},{"line_number":339,"context_line":"        default\u003d[\u0027servers\u0027],"},{"line_number":340,"context_line":"        help\u003d\"\"\""},{"line_number":341,"context_line":"Specify a list of resources to require or ignore registered limits."}],"source_content_type":"text/x-python","patch_set":17,"id":"115e849d_d76fe909","line":338,"in_reply_to":"cb0e9154_a87038b1","updated":"2024-11-25 18:00:01.000000000","message":"Acknowledged","commit_id":"c275dfccb9c8da76e9825fde1e1701afa62e7537"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"dad1d53bc82b0d049b9817c81670f2064a4d7106","unresolved":true,"context_lines":[{"line_number":335,"context_line":"\"\"\"),"},{"line_number":336,"context_line":"    cfg.ListOpt("},{"line_number":337,"context_line":"        \u0027unified_limits_resource_list\u0027,"},{"line_number":338,"context_line":"        item_type\u003dUnifiedLimitsResource(),"},{"line_number":339,"context_line":"        default\u003d[\u0027servers\u0027],"},{"line_number":340,"context_line":"        help\u003d\"\"\""},{"line_number":341,"context_line":"Specify a list of resources to require or ignore registered limits."}],"source_content_type":"text/x-python","patch_set":17,"id":"cb0e9154_a87038b1","line":338,"in_reply_to":"d8b598d9_5a74023e","updated":"2024-11-21 21:55:06.000000000","message":"you actully did it in a cleaner way then i was suggestign so i aggree.\n\nbeing able to just pass a class to validate the item via item_type is\ncleaner then creatigna UnifiedLimitsResourceListOpt class that inherits form ListOpt","commit_id":"c275dfccb9c8da76e9825fde1e1701afa62e7537"}],"nova/limit/local.py":[{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"ddc26907b8749a289c98d459a0259ae66f9e0bac","unresolved":true,"context_lines":[{"line_number":139,"context_line":"    try:"},{"line_number":140,"context_line":"        enforcer.enforce(None, {entity_type: count})"},{"line_number":141,"context_line":"    except limit_exceptions.ProjectOverLimit as e:"},{"line_number":142,"context_line":"        if nova_limit_utils.should_enforce(e, [entity_type]):"},{"line_number":143,"context_line":"            # Copy the exception message to a OverQuota to propagate to the"},{"line_number":144,"context_line":"            # API layer."},{"line_number":145,"context_line":"            raise EXCEPTIONS.get(entity_type, exception.OverQuota)(str(e))"}],"source_content_type":"text/x-python","patch_set":10,"id":"86197c6d_183a9eb7","line":142,"updated":"2024-10-22 15:39:40.000000000","message":"oh... nice.","commit_id":"0138b7e4083a33e9bed2c8c00c126fa79d5eee4a"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"b1a37f1f39ed0955cd7b52bd060be713c2645811","unresolved":false,"context_lines":[{"line_number":139,"context_line":"    try:"},{"line_number":140,"context_line":"        enforcer.enforce(None, {entity_type: count})"},{"line_number":141,"context_line":"    except limit_exceptions.ProjectOverLimit as e:"},{"line_number":142,"context_line":"        if nova_limit_utils.should_enforce(e, [entity_type]):"},{"line_number":143,"context_line":"            # Copy the exception message to a OverQuota to propagate to the"},{"line_number":144,"context_line":"            # API layer."},{"line_number":145,"context_line":"            raise EXCEPTIONS.get(entity_type, exception.OverQuota)(str(e))"}],"source_content_type":"text/x-python","patch_set":10,"id":"1197baaa_761595c7","line":142,"in_reply_to":"86197c6d_183a9eb7","updated":"2024-11-25 18:00:01.000000000","message":"Acknowledged","commit_id":"0138b7e4083a33e9bed2c8c00c126fa79d5eee4a"}],"nova/limit/utils.py":[{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"8b06856e109e4e02c47cd923e04ebb6b28dfdba1","unresolved":true,"context_lines":[{"line_number":41,"context_line":"        # limits and it will also automatically work with the"},{"line_number":42,"context_line":"        # oslo_limit.LimitFixture in our tests."},{"line_number":43,"context_line":"        KEYSTONECLIENT \u003d limit.Enforcer(lambda: None, cache\u003dFalse).connection"},{"line_number":44,"context_line":"    return KEYSTONECLIENT"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"def should_enforce("}],"source_content_type":"text/x-python","patch_set":2,"id":"780aa867_e2725499","line":44,"updated":"2024-07-12 23:33:22.000000000","message":"Thought about this some more and thinking it should be OK to cache this client, no? Registered limits are global to a deployment so we won\u0027t be needing or wanting to use the user\u0027s token about it. The internal state of Enforcer holds only the settings from the `[oslo_limit]` section of the Nova config, like the endpoint_id [1]. So that should be reasonable to keep until nova-compute is restarted.\n\n[1] https://docs.openstack.org/nova/latest/admin/unified-limits.html#configuration","commit_id":"5c4fcb438d12ee6557e233a4b912b7720214eeda"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"545ceb0ab618bccdf28497d13a8abca4796bdc0f","unresolved":false,"context_lines":[{"line_number":41,"context_line":"        # limits and it will also automatically work with the"},{"line_number":42,"context_line":"        # oslo_limit.LimitFixture in our tests."},{"line_number":43,"context_line":"        KEYSTONECLIENT \u003d limit.Enforcer(lambda: None, cache\u003dFalse).connection"},{"line_number":44,"context_line":"    return KEYSTONECLIENT"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"def should_enforce("}],"source_content_type":"text/x-python","patch_set":2,"id":"aab8f559_bcb34877","line":44,"in_reply_to":"780aa867_e2725499","updated":"2024-11-22 02:19:37.000000000","message":"Acknowledged","commit_id":"5c4fcb438d12ee6557e233a4b912b7720214eeda"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"ddc26907b8749a289c98d459a0259ae66f9e0bac","unresolved":true,"context_lines":[{"line_number":100,"context_line":"                f\u0027Please set registered limits for {unset_limits} in \u0027"},{"line_number":101,"context_line":"                \u0027Keystone\u0027)"},{"line_number":102,"context_line":"            # If none of the 0 limit resources have limits set, don\u0027t enforce."},{"line_number":103,"context_line":"            return False"},{"line_number":104,"context_line":"    return True"}],"source_content_type":"text/x-python","patch_set":10,"id":"cae85f3f_b5c85643","line":103,"updated":"2024-10-22 15:39:40.000000000","message":"I think we should still return True for things like MEMORY_MB, SERVERS, I think we need to skip this and return True here? Would that be OK? \n\nThe reason here is to protect against operator typo leaving you with no registered limits.","commit_id":"0138b7e4083a33e9bed2c8c00c126fa79d5eee4a"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"5ec845e8bd7a530f7ae1b14bd3b3da9d8ed23edf","unresolved":true,"context_lines":[{"line_number":100,"context_line":"                f\u0027Please set registered limits for {unset_limits} in \u0027"},{"line_number":101,"context_line":"                \u0027Keystone\u0027)"},{"line_number":102,"context_line":"            # If none of the 0 limit resources have limits set, don\u0027t enforce."},{"line_number":103,"context_line":"            return False"},{"line_number":104,"context_line":"    return True"}],"source_content_type":"text/x-python","patch_set":10,"id":"a4afb8aa_42d39269","line":103,"in_reply_to":"6817f83e_a7ce9a51","updated":"2024-10-23 12:56:28.000000000","message":"I like the idea of a list with a default of [\u0027MEMORY_MB\u0027, \u0027servers\u0027, \u0027VCPU\u0027] or maybe even just [\u0027servers\u0027]. Either way, making this the default behaviour sounds like the way forward.\n\nI think I was all for hardcoding it to just [\u0027servers\u0027], purely for simplicity. Configurable is probably better.","commit_id":"0138b7e4083a33e9bed2c8c00c126fa79d5eee4a"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"b1a37f1f39ed0955cd7b52bd060be713c2645811","unresolved":false,"context_lines":[{"line_number":100,"context_line":"                f\u0027Please set registered limits for {unset_limits} in \u0027"},{"line_number":101,"context_line":"                \u0027Keystone\u0027)"},{"line_number":102,"context_line":"            # If none of the 0 limit resources have limits set, don\u0027t enforce."},{"line_number":103,"context_line":"            return False"},{"line_number":104,"context_line":"    return True"}],"source_content_type":"text/x-python","patch_set":10,"id":"9520a950_55c83f25","line":103,"in_reply_to":"a4afb8aa_42d39269","updated":"2024-11-25 18:00:01.000000000","message":"Done","commit_id":"0138b7e4083a33e9bed2c8c00c126fa79d5eee4a"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"d627ae6777246c25cd51da2c215b3aacd53e5d37","unresolved":true,"context_lines":[{"line_number":100,"context_line":"                f\u0027Please set registered limits for {unset_limits} in \u0027"},{"line_number":101,"context_line":"                \u0027Keystone\u0027)"},{"line_number":102,"context_line":"            # If none of the 0 limit resources have limits set, don\u0027t enforce."},{"line_number":103,"context_line":"            return False"},{"line_number":104,"context_line":"    return True"}],"source_content_type":"text/x-python","patch_set":10,"id":"6817f83e_a7ce9a51","line":103,"in_reply_to":"cae85f3f_b5c85643","updated":"2024-10-22 18:46:09.000000000","message":"Sure. Though I wonder ... if this would be best done as a list in config? (instead of a `[workarounds]` option). I know we said we could punt the filtering ability for later but I dunno, a configurable list would seem to fit well here rather than hardcoding?\n\nWe could have something like `[quota]unified_limits_required_resources` which is a list of resources that we require to have a registered limit set. And we can default it to [\u0027MEMORY_MB\u0027, \u0027servers\u0027, \u0027VCPU\u0027] for example. If an operator wants to make it an empty list, they can, if they want to add more resource names, they can. And any resource not in the configured list will be considered unlimited if no limit is set.\n\nI know the suggestion of a list like this has come up before and I can\u0027t remember if there is a reason not to do it? The workaround option in here is mostly for the sake of having something to look at and discuss if there\u0027s a different way we prefer. I think the main core of the logic is pretty dialed in but where the config option goes and what it means/represents can vary.","commit_id":"0138b7e4083a33e9bed2c8c00c126fa79d5eee4a"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"ae2ef90a4d8844e0df7f487bbccfdfc2575b7b75","unresolved":true,"context_lines":[{"line_number":71,"context_line":"    # but oslo.limit enforce does not treat -1 as unlimited at this time and"},{"line_number":72,"context_line":"    # instead uses its literal integer value."},{"line_number":73,"context_line":"    if all(-1 \u003d\u003d info.limit for info in exc.over_limit_info_list):"},{"line_number":74,"context_line":"        return False"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"    # At this point, we know at least one of the exceeded limits is 0 and the"},{"line_number":77,"context_line":"    # rest are either 0 or -1. We don\u0027t know yet whether the 0 limit(s) are"}],"source_content_type":"text/x-python","patch_set":13,"id":"5017ca7e_1b50381f","line":74,"updated":"2024-11-12 18:58:18.000000000","message":"ok so we are also going to explcitly supprot explict -1\nthere by allowign this unlimited behavior to be set via the api event fi oslo.limts does not currently suppot that natively.\n\ni guess that is something we can discuss with the oslo.limits/keystone maintainer to see if that should eventually move to oslo.limits","commit_id":"3af3c584894685a97a682655c21f1a287e1705ed"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"5cf796ac5daaede6946e8a05262dbb610226df39","unresolved":true,"context_lines":[{"line_number":71,"context_line":"    # but oslo.limit enforce does not treat -1 as unlimited at this time and"},{"line_number":72,"context_line":"    # instead uses its literal integer value."},{"line_number":73,"context_line":"    if all(-1 \u003d\u003d info.limit for info in exc.over_limit_info_list):"},{"line_number":74,"context_line":"        return False"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"    # At this point, we know at least one of the exceeded limits is 0 and the"},{"line_number":77,"context_line":"    # rest are either 0 or -1. We don\u0027t know yet whether the 0 limit(s) are"}],"source_content_type":"text/x-python","patch_set":13,"id":"a811e254_7a46fc4c","line":74,"in_reply_to":"5017ca7e_1b50381f","updated":"2024-11-13 00:08:56.000000000","message":"I thought so ... because what\u0027s the alternative? The Keystone docs say -1 means unlimited (it is linked in the code comment here). So here we can either treat it as unlimited or we can treat it as a literal negative value and make all quota checks for it fail. I thought the former made more sense than the latter.","commit_id":"3af3c584894685a97a682655c21f1a287e1705ed"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"8aa91b4c225fea762b806b5197184611c963c9b9","unresolved":false,"context_lines":[{"line_number":71,"context_line":"    # but oslo.limit enforce does not treat -1 as unlimited at this time and"},{"line_number":72,"context_line":"    # instead uses its literal integer value."},{"line_number":73,"context_line":"    if all(-1 \u003d\u003d info.limit for info in exc.over_limit_info_list):"},{"line_number":74,"context_line":"        return False"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"    # At this point, we know at least one of the exceeded limits is 0 and the"},{"line_number":77,"context_line":"    # rest are either 0 or -1. We don\u0027t know yet whether the 0 limit(s) are"}],"source_content_type":"text/x-python","patch_set":13,"id":"0b0520ac_4cd7349d","line":74,"in_reply_to":"a811e254_7a46fc4c","updated":"2024-11-20 11:47:39.000000000","message":"Acknowledged","commit_id":"3af3c584894685a97a682655c21f1a287e1705ed"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"ae2ef90a4d8844e0df7f487bbccfdfc2575b7b75","unresolved":true,"context_lines":[{"line_number":78,"context_line":"    # unset or explicitly zero."},{"line_number":79,"context_line":"    have_limit_of_zero \u003d {"},{"line_number":80,"context_line":"        info.resource_name for info in exc.over_limit_info_list"},{"line_number":81,"context_line":"        if info.limit \u003d\u003d 0}"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"    # Get a list of all the registered limits that are set. There is not a way"},{"line_number":84,"context_line":"    # to filter by resource names however this will do one API call whereas the"}],"source_content_type":"text/x-python","patch_set":13,"id":"4185218c_184fad37","line":81,"updated":"2024-11-12 18:58:18.000000000","message":"and this also allwos the operator to explcitly say a tenant cant use any of a resouce.","commit_id":"3af3c584894685a97a682655c21f1a287e1705ed"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"8aa91b4c225fea762b806b5197184611c963c9b9","unresolved":false,"context_lines":[{"line_number":78,"context_line":"    # unset or explicitly zero."},{"line_number":79,"context_line":"    have_limit_of_zero \u003d {"},{"line_number":80,"context_line":"        info.resource_name for info in exc.over_limit_info_list"},{"line_number":81,"context_line":"        if info.limit \u003d\u003d 0}"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"    # Get a list of all the registered limits that are set. There is not a way"},{"line_number":84,"context_line":"    # to filter by resource names however this will do one API call whereas the"}],"source_content_type":"text/x-python","patch_set":13,"id":"8eccc7b6_65f2e1d2","line":81,"in_reply_to":"221734f5_8d966509","updated":"2024-11-20 11:47:39.000000000","message":"Acknowledged","commit_id":"3af3c584894685a97a682655c21f1a287e1705ed"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"5cf796ac5daaede6946e8a05262dbb610226df39","unresolved":true,"context_lines":[{"line_number":78,"context_line":"    # unset or explicitly zero."},{"line_number":79,"context_line":"    have_limit_of_zero \u003d {"},{"line_number":80,"context_line":"        info.resource_name for info in exc.over_limit_info_list"},{"line_number":81,"context_line":"        if info.limit \u003d\u003d 0}"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"    # Get a list of all the registered limits that are set. There is not a way"},{"line_number":84,"context_line":"    # to filter by resource names however this will do one API call whereas the"}],"source_content_type":"text/x-python","patch_set":13,"id":"221734f5_8d966509","line":81,"in_reply_to":"4185218c_184fad37","updated":"2024-11-13 00:08:56.000000000","message":"Right. If an admin has explicitly set a limit, we just use that limit. The rest of the behavior is around unset limits.","commit_id":"3af3c584894685a97a682655c21f1a287e1705ed"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"ae2ef90a4d8844e0df7f487bbccfdfc2575b7b75","unresolved":true,"context_lines":[{"line_number":94,"context_line":"    explicitly_zero \u003d have_limit_of_zero \u0026 have_limits_set"},{"line_number":95,"context_line":"    required_resources \u003d ("},{"line_number":96,"context_line":"        have_limit_of_zero \u0026 set(CONF.quota.unified_limits_required_resources))"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"    if not explicitly_zero and not required_resources:"},{"line_number":99,"context_line":"        unset_limits \u003d set(have_limit_of_zero) - set(explicitly_zero)"},{"line_number":100,"context_line":"        LOG.debug("}],"source_content_type":"text/x-python","patch_set":13,"id":"5503f4c4_2dadfe76","line":97,"updated":"2024-11-12 18:58:18.000000000","message":"this is currenlty case sensitive\n\nis that really what we want?","commit_id":"3af3c584894685a97a682655c21f1a287e1705ed"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"4f84a94eb0487d293dd476333bbebd9cbf7bd79d","unresolved":true,"context_lines":[{"line_number":94,"context_line":"    explicitly_zero \u003d have_limit_of_zero \u0026 have_limits_set"},{"line_number":95,"context_line":"    required_resources \u003d ("},{"line_number":96,"context_line":"        have_limit_of_zero \u0026 set(CONF.quota.unified_limits_required_resources))"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"    if not explicitly_zero and not required_resources:"},{"line_number":99,"context_line":"        unset_limits \u003d set(have_limit_of_zero) - set(explicitly_zero)"},{"line_number":100,"context_line":"        LOG.debug("}],"source_content_type":"text/x-python","patch_set":13,"id":"e592cb4f_eec2d017","line":97,"in_reply_to":"4b4d927b_de7c9f97","updated":"2024-11-13 01:02:28.000000000","message":"im fine with keeping it case sensitive i kind of agree that we shoudl match placment but i just want ot sure this is docuemnted and inentional.\n\nfor pci in placmenet or mdevs we do some massaging ot make the value a valide placment Resocue class i.e by making it uppercase if you dont do that in the config.\n\nthat why this was on my mind.","commit_id":"3af3c584894685a97a682655c21f1a287e1705ed"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"5cf796ac5daaede6946e8a05262dbb610226df39","unresolved":true,"context_lines":[{"line_number":94,"context_line":"    explicitly_zero \u003d have_limit_of_zero \u0026 have_limits_set"},{"line_number":95,"context_line":"    required_resources \u003d ("},{"line_number":96,"context_line":"        have_limit_of_zero \u0026 set(CONF.quota.unified_limits_required_resources))"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"    if not explicitly_zero and not required_resources:"},{"line_number":99,"context_line":"        unset_limits \u003d set(have_limit_of_zero) - set(explicitly_zero)"},{"line_number":100,"context_line":"        LOG.debug("}],"source_content_type":"text/x-python","patch_set":13,"id":"4b4d927b_de7c9f97","line":97,"in_reply_to":"5503f4c4_2dadfe76","updated":"2024-11-13 00:08:56.000000000","message":"I thought it should match Placement, but maybe we can ask Dan his opinion?","commit_id":"3af3c584894685a97a682655c21f1a287e1705ed"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"8aa91b4c225fea762b806b5197184611c963c9b9","unresolved":false,"context_lines":[{"line_number":94,"context_line":"    explicitly_zero \u003d have_limit_of_zero \u0026 have_limits_set"},{"line_number":95,"context_line":"    required_resources \u003d ("},{"line_number":96,"context_line":"        have_limit_of_zero \u0026 set(CONF.quota.unified_limits_required_resources))"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"    if not explicitly_zero and not required_resources:"},{"line_number":99,"context_line":"        unset_limits \u003d set(have_limit_of_zero) - set(explicitly_zero)"},{"line_number":100,"context_line":"        LOG.debug("}],"source_content_type":"text/x-python","patch_set":13,"id":"0cbd6955_db10ad14","line":97,"in_reply_to":"e592cb4f_eec2d017","updated":"2024-11-20 11:47:39.000000000","message":"Acknowledged","commit_id":"3af3c584894685a97a682655c21f1a287e1705ed"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"ae2ef90a4d8844e0df7f487bbccfdfc2575b7b75","unresolved":true,"context_lines":[{"line_number":102,"context_line":"            \u0027not configured in [quota]unified_limits_required_resources, so \u0027"},{"line_number":103,"context_line":"            \u0027not enforcing.\u0027)"},{"line_number":104,"context_line":"        return False"},{"line_number":105,"context_line":"    return True"}],"source_content_type":"text/x-python","patch_set":13,"id":"a19ef764_906c7056","line":105,"updated":"2024-11-12 18:58:18.000000000","message":"so tracing through this I think this does what we want it to do and is inline with the spec.\n\ni don\u0027t recall seeing the explicit -1 and 0 behaviour in the spec but i have nto read it in a few days. to me this is reasonable given the current state of oslo.limits and what we are trying to enable.\n\nwith that said im debating if this algorithm is deserving of a contributor doc or if the comments inline are enough to capture our intent.","commit_id":"3af3c584894685a97a682655c21f1a287e1705ed"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"4f84a94eb0487d293dd476333bbebd9cbf7bd79d","unresolved":true,"context_lines":[{"line_number":102,"context_line":"            \u0027not configured in [quota]unified_limits_required_resources, so \u0027"},{"line_number":103,"context_line":"            \u0027not enforcing.\u0027)"},{"line_number":104,"context_line":"        return False"},{"line_number":105,"context_line":"    return True"}],"source_content_type":"text/x-python","patch_set":13,"id":"efac1ffe_d6963d0c","line":105,"in_reply_to":"185078c6_d25d0a76","updated":"2024-11-13 01:02:28.000000000","message":"yep i expect -1 to be unlimited so i think that is the correct choice here.","commit_id":"3af3c584894685a97a682655c21f1a287e1705ed"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"5cf796ac5daaede6946e8a05262dbb610226df39","unresolved":true,"context_lines":[{"line_number":102,"context_line":"            \u0027not configured in [quota]unified_limits_required_resources, so \u0027"},{"line_number":103,"context_line":"            \u0027not enforcing.\u0027)"},{"line_number":104,"context_line":"        return False"},{"line_number":105,"context_line":"    return True"}],"source_content_type":"text/x-python","patch_set":13,"id":"185078c6_d25d0a76","line":105,"in_reply_to":"a19ef764_906c7056","updated":"2024-11-13 00:08:56.000000000","message":"I\u0027m not sure if I called out -1 in the spec. 0 I thought needs no call out. If the admin actively set it to 0, I thought it should mean 0. With -1 we have two choices: treat as unlimited or treat as negative one (fail all checks). AFAICT it\u0027s a matter of which one makes more sense. And the Keystone docs say -1 is supposed to mean unlimited.","commit_id":"3af3c584894685a97a682655c21f1a287e1705ed"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"8aa91b4c225fea762b806b5197184611c963c9b9","unresolved":false,"context_lines":[{"line_number":102,"context_line":"            \u0027not configured in [quota]unified_limits_required_resources, so \u0027"},{"line_number":103,"context_line":"            \u0027not enforcing.\u0027)"},{"line_number":104,"context_line":"        return False"},{"line_number":105,"context_line":"    return True"}],"source_content_type":"text/x-python","patch_set":13,"id":"4fe45471_8681f7fb","line":105,"in_reply_to":"efac1ffe_d6963d0c","updated":"2024-11-20 11:47:39.000000000","message":"Acknowledged","commit_id":"3af3c584894685a97a682655c21f1a287e1705ed"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"e019470300b7109ed50826772a54d9a1b95051cf","unresolved":true,"context_lines":[{"line_number":112,"context_line":"                    \u0027and are specified in [quota]unified_limits_resource_list \u0027"},{"line_number":113,"context_line":"                    \u0027with strategy ignore, so not enforcing.\u0027)"},{"line_number":114,"context_line":"                return False"},{"line_number":115,"context_line":"    return True"}],"source_content_type":"text/x-python","patch_set":17,"id":"3a4ef189_9d9ca2cb","line":115,"updated":"2024-11-21 21:28:45.000000000","message":"Man, I know what this is supposed to be doing, but it seems really complex. Not saying it\u0027s not required to be that way, but I\u0027m having a hard time getting it in my brain to confirm that it\u0027s always right...","commit_id":"c275dfccb9c8da76e9825fde1e1701afa62e7537"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"b371f2476c9c15273e3d7feb1a2222ab4ffc5a15","unresolved":false,"context_lines":[{"line_number":112,"context_line":"                    \u0027and are specified in [quota]unified_limits_resource_list \u0027"},{"line_number":113,"context_line":"                    \u0027with strategy ignore, so not enforcing.\u0027)"},{"line_number":114,"context_line":"                return False"},{"line_number":115,"context_line":"    return True"}],"source_content_type":"text/x-python","patch_set":17,"id":"9a785ca0_8bc59f19","line":115,"in_reply_to":"2cd9d369_b9950fed","updated":"2024-11-22 19:45:51.000000000","message":"Acknowledged","commit_id":"c275dfccb9c8da76e9825fde1e1701afa62e7537"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"1e80e7b6e2b8695b971d6369d1f02aab1aa39225","unresolved":true,"context_lines":[{"line_number":112,"context_line":"                    \u0027and are specified in [quota]unified_limits_resource_list \u0027"},{"line_number":113,"context_line":"                    \u0027with strategy ignore, so not enforcing.\u0027)"},{"line_number":114,"context_line":"                return False"},{"line_number":115,"context_line":"    return True"}],"source_content_type":"text/x-python","patch_set":17,"id":"ded203ff_3527dac8","line":115,"in_reply_to":"3a4ef189_9d9ca2cb","updated":"2024-11-21 21:49:53.000000000","message":"I can sympathize and I did spend a fair amount of time trying to make it as simple as possible. If there is more simplifying that can be done that I have missed, I\u0027m happy to do it.\n\nI feel like the most confusing thing about it is remembering that `ProjectOverLimit` contains _only_ limits that were exceeded. So I tried to think of like this:\n\n* if any of the exceeded limits are greater than zero, then someone set at least one of them to something and it\u0027s a legit failure, so enforce\n\n* if all of the exceeded limits are -1, no question that we don\u0027t enforce\n\n* find which exceeded limits are 0 and then find which of those are actual found limits in Keystone. Meaning someone purposely set them to 0 (which would be a legit failure so enforce)\n\n* once we know which exceeded limits are not set in Keystone, check the resource list. For \"require\", if no unset limits are in the require list, then we don\u0027t care about them, so don\u0027t enforce. For \"ignore\", if all of the unset limits are in the ignore list, don\u0027t enforce","commit_id":"c275dfccb9c8da76e9825fde1e1701afa62e7537"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"545ceb0ab618bccdf28497d13a8abca4796bdc0f","unresolved":true,"context_lines":[{"line_number":112,"context_line":"                    \u0027and are specified in [quota]unified_limits_resource_list \u0027"},{"line_number":113,"context_line":"                    \u0027with strategy ignore, so not enforcing.\u0027)"},{"line_number":114,"context_line":"                return False"},{"line_number":115,"context_line":"    return True"}],"source_content_type":"text/x-python","patch_set":17,"id":"2cd9d369_b9950fed","line":115,"in_reply_to":"ded203ff_3527dac8","updated":"2024-11-22 02:19:37.000000000","message":"Update: I have reworked this method to make it hopefully easier to parse.","commit_id":"c275dfccb9c8da76e9825fde1e1701afa62e7537"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"f05019ece9c653f4e44b5597055073a47446ec2f","unresolved":true,"context_lines":[{"line_number":73,"context_line":"    #"},{"line_number":74,"context_line":"    # but oslo.limit enforce does not treat -1 as unlimited at this time and"},{"line_number":75,"context_line":"    # instead uses its literal integer value."},{"line_number":76,"context_line":"    if all(-1 \u003d\u003d info.limit for info in exc.over_limit_info_list):"},{"line_number":77,"context_line":"        return False"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"    # Only resources with exceeded limits of \"0\" are candidates for"}],"source_content_type":"text/x-python","patch_set":18,"id":"f13e2128_701ccd9c","line":76,"updated":"2024-11-22 15:03:27.000000000","message":"So, it\u0027s good that you call out the documentation of -1 being special, but it\u0027s only special in the docs. I wonder if we should just consider any negative quota to be the same?","commit_id":"55e8a049733acbd8b5fb8a8b2086d76b85d97dfb"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"b371f2476c9c15273e3d7feb1a2222ab4ffc5a15","unresolved":false,"context_lines":[{"line_number":73,"context_line":"    #"},{"line_number":74,"context_line":"    # but oslo.limit enforce does not treat -1 as unlimited at this time and"},{"line_number":75,"context_line":"    # instead uses its literal integer value."},{"line_number":76,"context_line":"    if all(-1 \u003d\u003d info.limit for info in exc.over_limit_info_list):"},{"line_number":77,"context_line":"        return False"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"    # Only resources with exceeded limits of \"0\" are candidates for"}],"source_content_type":"text/x-python","patch_set":18,"id":"3cb9d75a_c1b8d061","line":76,"in_reply_to":"791d9267_4d5fa7f8","updated":"2024-11-22 19:45:51.000000000","message":"Done","commit_id":"55e8a049733acbd8b5fb8a8b2086d76b85d97dfb"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"03ec36a13c79b5c09a91f28d8b7872f49a3a14a5","unresolved":true,"context_lines":[{"line_number":73,"context_line":"    #"},{"line_number":74,"context_line":"    # but oslo.limit enforce does not treat -1 as unlimited at this time and"},{"line_number":75,"context_line":"    # instead uses its literal integer value."},{"line_number":76,"context_line":"    if all(-1 \u003d\u003d info.limit for info in exc.over_limit_info_list):"},{"line_number":77,"context_line":"        return False"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"    # Only resources with exceeded limits of \"0\" are candidates for"}],"source_content_type":"text/x-python","patch_set":18,"id":"791d9267_4d5fa7f8","line":76,"in_reply_to":"f13e2128_701ccd9c","updated":"2024-11-22 18:34:03.000000000","message":"Sure, can\u0027t hurt.","commit_id":"55e8a049733acbd8b5fb8a8b2086d76b85d97dfb"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"f05019ece9c653f4e44b5597055073a47446ec2f","unresolved":true,"context_lines":[{"line_number":77,"context_line":"        return False"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"    # Only resources with exceeded limits of \"0\" are candidates for"},{"line_number":80,"context_line":"    # enforcement."},{"line_number":81,"context_line":"    enforce_candidates \u003d {"},{"line_number":82,"context_line":"        info.resource_name for info in exc.over_limit_info_list"},{"line_number":83,"context_line":"            if info.limit \u003d\u003d 0}"}],"source_content_type":"text/x-python","patch_set":18,"id":"ed57b4bc_a784a5d2","line":80,"updated":"2024-11-22 15:03:27.000000000","message":"Can you add words here. I\u0027m trying to mix this together with your comment above about greater than zero meaning you exceeded. Zero here means we may not have any info at all? Or, wait, maybe it means we may have consumed the very last item? Or... both?","commit_id":"55e8a049733acbd8b5fb8a8b2086d76b85d97dfb"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"f246fb4c3c2ddf18c6ea391fc4a6785f94f07886","unresolved":true,"context_lines":[{"line_number":77,"context_line":"        return False"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"    # Only resources with exceeded limits of \"0\" are candidates for"},{"line_number":80,"context_line":"    # enforcement."},{"line_number":81,"context_line":"    enforce_candidates \u003d {"},{"line_number":82,"context_line":"        info.resource_name for info in exc.over_limit_info_list"},{"line_number":83,"context_line":"            if info.limit \u003d\u003d 0}"}],"source_content_type":"text/x-python","patch_set":18,"id":"c3b1dcba_9bca844b","line":80,"in_reply_to":"b5feaaf2_26199109","updated":"2024-11-22 18:45:39.000000000","message":"Yeah that in comments would really help I think.","commit_id":"55e8a049733acbd8b5fb8a8b2086d76b85d97dfb"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"b02ecdf145d0a259e4a72161a7f9dfdbdf0c310c","unresolved":false,"context_lines":[{"line_number":77,"context_line":"        return False"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"    # Only resources with exceeded limits of \"0\" are candidates for"},{"line_number":80,"context_line":"    # enforcement."},{"line_number":81,"context_line":"    enforce_candidates \u003d {"},{"line_number":82,"context_line":"        info.resource_name for info in exc.over_limit_info_list"},{"line_number":83,"context_line":"            if info.limit \u003d\u003d 0}"}],"source_content_type":"text/x-python","patch_set":18,"id":"17eb3b91_f4ad0c94","line":80,"in_reply_to":"c3b1dcba_9bca844b","updated":"2024-11-22 19:50:02.000000000","message":"Done","commit_id":"55e8a049733acbd8b5fb8a8b2086d76b85d97dfb"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"b371f2476c9c15273e3d7feb1a2222ab4ffc5a15","unresolved":false,"context_lines":[{"line_number":77,"context_line":"        return False"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"    # Only resources with exceeded limits of \"0\" are candidates for"},{"line_number":80,"context_line":"    # enforcement."},{"line_number":81,"context_line":"    enforce_candidates \u003d {"},{"line_number":82,"context_line":"        info.resource_name for info in exc.over_limit_info_list"},{"line_number":83,"context_line":"            if info.limit \u003d\u003d 0}"}],"source_content_type":"text/x-python","patch_set":18,"id":"9cafda78_21139b55","line":80,"in_reply_to":"c3b1dcba_9bca844b","updated":"2024-11-22 19:45:51.000000000","message":"Done","commit_id":"55e8a049733acbd8b5fb8a8b2086d76b85d97dfb"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"03ec36a13c79b5c09a91f28d8b7872f49a3a14a5","unresolved":true,"context_lines":[{"line_number":77,"context_line":"        return False"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"    # Only resources with exceeded limits of \"0\" are candidates for"},{"line_number":80,"context_line":"    # enforcement."},{"line_number":81,"context_line":"    enforce_candidates \u003d {"},{"line_number":82,"context_line":"        info.resource_name for info in exc.over_limit_info_list"},{"line_number":83,"context_line":"            if info.limit \u003d\u003d 0}"}],"source_content_type":"text/x-python","patch_set":18,"id":"b5feaaf2_26199109","line":80,"in_reply_to":"ed57b4bc_a784a5d2","updated":"2024-11-22 18:34:03.000000000","message":"I\u0027ll add more words. I\u0027m overly used to what 0 is so I take it for granted. \"0\" means that oslo.limit is telling us it\u0027s 0. But it may be a) \"admin set it to 0\" or b) \"I found no registered limit, so I\u0027m returning it as 0\". And we have to pull the list of registered limits from Keystone to know whether it\u0027s a) or b).","commit_id":"55e8a049733acbd8b5fb8a8b2086d76b85d97dfb"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"f05019ece9c653f4e44b5597055073a47446ec2f","unresolved":true,"context_lines":[{"line_number":94,"context_line":"    have_limits_set \u003d {limit.resource_name for limit in registered_limits}"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"    # If any candidates have limits set, enforce. It means at least one limit"},{"line_number":97,"context_line":"    # has been explicitly set to 0."},{"line_number":98,"context_line":"    if enforce_candidates \u0026 have_limits_set:"},{"line_number":99,"context_line":"        return True"},{"line_number":100,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"79816879_83486709","line":97,"updated":"2024-11-22 15:03:27.000000000","message":"Oh or, zero means (or can also mean) it\u0027s actually set to zero.","commit_id":"55e8a049733acbd8b5fb8a8b2086d76b85d97dfb"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"03ec36a13c79b5c09a91f28d8b7872f49a3a14a5","unresolved":true,"context_lines":[{"line_number":94,"context_line":"    have_limits_set \u003d {limit.resource_name for limit in registered_limits}"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"    # If any candidates have limits set, enforce. It means at least one limit"},{"line_number":97,"context_line":"    # has been explicitly set to 0."},{"line_number":98,"context_line":"    if enforce_candidates \u0026 have_limits_set:"},{"line_number":99,"context_line":"        return True"},{"line_number":100,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"a22107be_3b3fbac9","line":97,"in_reply_to":"79816879_83486709","updated":"2024-11-22 18:34:03.000000000","message":"Correct.","commit_id":"55e8a049733acbd8b5fb8a8b2086d76b85d97dfb"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"f246fb4c3c2ddf18c6ea391fc4a6785f94f07886","unresolved":false,"context_lines":[{"line_number":94,"context_line":"    have_limits_set \u003d {limit.resource_name for limit in registered_limits}"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"    # If any candidates have limits set, enforce. It means at least one limit"},{"line_number":97,"context_line":"    # has been explicitly set to 0."},{"line_number":98,"context_line":"    if enforce_candidates \u0026 have_limits_set:"},{"line_number":99,"context_line":"        return True"},{"line_number":100,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"67cf51ed_7672b0de","line":97,"in_reply_to":"a22107be_3b3fbac9","updated":"2024-11-22 18:45:39.000000000","message":"Acknowledged","commit_id":"55e8a049733acbd8b5fb8a8b2086d76b85d97dfb"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"f05019ece9c653f4e44b5597055073a47446ec2f","unresolved":true,"context_lines":[{"line_number":104,"context_line":"    if CONF.quota.unified_limits_resource_strategy \u003d\u003d \u0027require\u0027:"},{"line_number":105,"context_line":"        # If there is no overlap between candidates and the require list,"},{"line_number":106,"context_line":"        # don\u0027t enforce."},{"line_number":107,"context_line":"        if not enforce_candidates \u0026 require_or_ignore:"},{"line_number":108,"context_line":"            LOG.debug("},{"line_number":109,"context_line":"                f\u0027Resources {enforce_candidates} have no registered limits \u0027"},{"line_number":110,"context_line":"                \u0027set and are not specified in \u0027"}],"source_content_type":"text/x-python","patch_set":18,"id":"c1ce32c0_a13cf9c3","line":107,"updated":"2024-11-22 15:03:27.000000000","message":"If not ... return false is hard for me to reason about. Doesn\u0027t this mean \"if there is overlap with required limits, do enforce?\" If so, can we make the logic behave that way?","commit_id":"55e8a049733acbd8b5fb8a8b2086d76b85d97dfb"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"b371f2476c9c15273e3d7feb1a2222ab4ffc5a15","unresolved":false,"context_lines":[{"line_number":104,"context_line":"    if CONF.quota.unified_limits_resource_strategy \u003d\u003d \u0027require\u0027:"},{"line_number":105,"context_line":"        # If there is no overlap between candidates and the require list,"},{"line_number":106,"context_line":"        # don\u0027t enforce."},{"line_number":107,"context_line":"        if not enforce_candidates \u0026 require_or_ignore:"},{"line_number":108,"context_line":"            LOG.debug("},{"line_number":109,"context_line":"                f\u0027Resources {enforce_candidates} have no registered limits \u0027"},{"line_number":110,"context_line":"                \u0027set and are not specified in \u0027"}],"source_content_type":"text/x-python","patch_set":18,"id":"a774d994_0fea8011","line":107,"in_reply_to":"757e55e0_538a0a3d","updated":"2024-11-22 19:45:51.000000000","message":"Done","commit_id":"55e8a049733acbd8b5fb8a8b2086d76b85d97dfb"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"03ec36a13c79b5c09a91f28d8b7872f49a3a14a5","unresolved":true,"context_lines":[{"line_number":104,"context_line":"    if CONF.quota.unified_limits_resource_strategy \u003d\u003d \u0027require\u0027:"},{"line_number":105,"context_line":"        # If there is no overlap between candidates and the require list,"},{"line_number":106,"context_line":"        # don\u0027t enforce."},{"line_number":107,"context_line":"        if not enforce_candidates \u0026 require_or_ignore:"},{"line_number":108,"context_line":"            LOG.debug("},{"line_number":109,"context_line":"                f\u0027Resources {enforce_candidates} have no registered limits \u0027"},{"line_number":110,"context_line":"                \u0027set and are not specified in \u0027"}],"source_content_type":"text/x-python","patch_set":18,"id":"757e55e0_538a0a3d","line":107,"in_reply_to":"c1ce32c0_a13cf9c3","updated":"2024-11-22 18:34:03.000000000","message":"You mean like let the drop down at the bottom be \"return False\" instead and then invert these and \"return True\" from them? Yeah can do that and maybe it will make it more clear also.","commit_id":"55e8a049733acbd8b5fb8a8b2086d76b85d97dfb"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"f05019ece9c653f4e44b5597055073a47446ec2f","unresolved":true,"context_lines":[{"line_number":114,"context_line":"    elif CONF.quota.unified_limits_resource_strategy \u003d\u003d \u0027ignore\u0027:"},{"line_number":115,"context_line":"        # If the difference between the candidates and the ignore list is"},{"line_number":116,"context_line":"        # an empty set, don\u0027t enforce."},{"line_number":117,"context_line":"        if not enforce_candidates - require_or_ignore:"},{"line_number":118,"context_line":"            LOG.debug("},{"line_number":119,"context_line":"                f\u0027Resources {enforce_candidates} have no registered limits \u0027"},{"line_number":120,"context_line":"                \u0027set and are specified in [quota]unified_limits_resource_list \u0027"}],"source_content_type":"text/x-python","patch_set":18,"id":"82840cb1_d572def9","line":117,"updated":"2024-11-22 15:03:27.000000000","message":"Similarly, this \"if not return false\" seems simpler to me as \"if all ignored, return false\".\n\nI think maybe this whole section would be easier for me to grok if we don\u0027t have a two-tiered conditional with a default return at the end, but rather return explicitly for each of our cases. So maybe this:\n\n```\nif strategy \u003d\u003d \u0027require\u0027:\n  enforced \u003d enforce_candidates \u0026 require_or_ignore\nelif strategy \u003d\u003d \u0027ignore\u0027:\n  enforced \u003d enforce_candidates - require_or_ignore\nelse:\n  # This should have a log.error if we happened to get a bad\n  # strategy value, with the explicit enforcement, IMHO.\n  return True\n\n# If any failed limits are to be enforced, return True\nreturn bool(enforced)\n```","commit_id":"55e8a049733acbd8b5fb8a8b2086d76b85d97dfb"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"b371f2476c9c15273e3d7feb1a2222ab4ffc5a15","unresolved":false,"context_lines":[{"line_number":114,"context_line":"    elif CONF.quota.unified_limits_resource_strategy \u003d\u003d \u0027ignore\u0027:"},{"line_number":115,"context_line":"        # If the difference between the candidates and the ignore list is"},{"line_number":116,"context_line":"        # an empty set, don\u0027t enforce."},{"line_number":117,"context_line":"        if not enforce_candidates - require_or_ignore:"},{"line_number":118,"context_line":"            LOG.debug("},{"line_number":119,"context_line":"                f\u0027Resources {enforce_candidates} have no registered limits \u0027"},{"line_number":120,"context_line":"                \u0027set and are specified in [quota]unified_limits_resource_list \u0027"}],"source_content_type":"text/x-python","patch_set":18,"id":"e94cce4d_3730c525","line":117,"in_reply_to":"456e6d65_2c9243c9","updated":"2024-11-22 19:45:51.000000000","message":"Done","commit_id":"55e8a049733acbd8b5fb8a8b2086d76b85d97dfb"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"f246fb4c3c2ddf18c6ea391fc4a6785f94f07886","unresolved":true,"context_lines":[{"line_number":114,"context_line":"    elif CONF.quota.unified_limits_resource_strategy \u003d\u003d \u0027ignore\u0027:"},{"line_number":115,"context_line":"        # If the difference between the candidates and the ignore list is"},{"line_number":116,"context_line":"        # an empty set, don\u0027t enforce."},{"line_number":117,"context_line":"        if not enforce_candidates - require_or_ignore:"},{"line_number":118,"context_line":"            LOG.debug("},{"line_number":119,"context_line":"                f\u0027Resources {enforce_candidates} have no registered limits \u0027"},{"line_number":120,"context_line":"                \u0027set and are specified in [quota]unified_limits_resource_list \u0027"}],"source_content_type":"text/x-python","patch_set":18,"id":"77b6d918_0c316d81","line":117,"in_reply_to":"5f6120e1_df018442","updated":"2024-11-22 18:45:39.000000000","message":"No loophole (that I know of) just that if we were to add that to the list of choices and didn\u0027t add it here, we\u0027d always fall through. Maybe that doesn\u0027t matter because we fall through to enforcing, but we\u0027d log nothing about the fact that we\u0027re always rejecting because we don\u0027t recognize the strategy and not for any other legit reason. I just think we should be defensive against our own bugs there. For the same reason you\u0027re being quite verbose about each time we skip enforcement, I think we should make it clear that something went wrong if we drop out the bottom. Honestly, it should be a `raise RuntimeError` or something to indicate that _we_ screwed up somewhere, but I think it\u0027s probably best to just log an error and let it enforce/fail instead of a weird traceback that might not be as clear to an operator.","commit_id":"55e8a049733acbd8b5fb8a8b2086d76b85d97dfb"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"f55ddefcb3720e2e00f8e51e5c9da4fd1aaec530","unresolved":true,"context_lines":[{"line_number":114,"context_line":"    elif CONF.quota.unified_limits_resource_strategy \u003d\u003d \u0027ignore\u0027:"},{"line_number":115,"context_line":"        # If the difference between the candidates and the ignore list is"},{"line_number":116,"context_line":"        # an empty set, don\u0027t enforce."},{"line_number":117,"context_line":"        if not enforce_candidates - require_or_ignore:"},{"line_number":118,"context_line":"            LOG.debug("},{"line_number":119,"context_line":"                f\u0027Resources {enforce_candidates} have no registered limits \u0027"},{"line_number":120,"context_line":"                \u0027set and are specified in [quota]unified_limits_resource_list \u0027"}],"source_content_type":"text/x-python","patch_set":18,"id":"456e6d65_2c9243c9","line":117,"in_reply_to":"77b6d918_0c316d81","updated":"2024-11-22 18:53:37.000000000","message":"Oh, gotcha. That makes sense, I\u0027ll add it.","commit_id":"55e8a049733acbd8b5fb8a8b2086d76b85d97dfb"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"03ec36a13c79b5c09a91f28d8b7872f49a3a14a5","unresolved":true,"context_lines":[{"line_number":114,"context_line":"    elif CONF.quota.unified_limits_resource_strategy \u003d\u003d \u0027ignore\u0027:"},{"line_number":115,"context_line":"        # If the difference between the candidates and the ignore list is"},{"line_number":116,"context_line":"        # an empty set, don\u0027t enforce."},{"line_number":117,"context_line":"        if not enforce_candidates - require_or_ignore:"},{"line_number":118,"context_line":"            LOG.debug("},{"line_number":119,"context_line":"                f\u0027Resources {enforce_candidates} have no registered limits \u0027"},{"line_number":120,"context_line":"                \u0027set and are specified in [quota]unified_limits_resource_list \u0027"}],"source_content_type":"text/x-python","patch_set":18,"id":"5f6120e1_df018442","line":117,"in_reply_to":"82840cb1_d572def9","updated":"2024-11-22 18:34:03.000000000","message":"Sure, that sounds fine to me. Also, I don\u0027t consider a bad strategy value because the config option has a `choices\u003d[\u0027require\u0027, \u0027ignore\u0027]` which as I understand makes it so it\u0027s impossible for someone to set it to anything else. Is there a loophole of some sort?","commit_id":"55e8a049733acbd8b5fb8a8b2086d76b85d97dfb"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"b02ecdf145d0a259e4a72161a7f9dfdbdf0c310c","unresolved":true,"context_lines":[{"line_number":83,"context_line":"    # A limit of \"0\" in the over_limit_info_list means that oslo.limit is"},{"line_number":84,"context_line":"    # telling us the limit is 0. But oslo.limit returns 0 for two cases:"},{"line_number":85,"context_line":"    # a) it found a limit of 0 in Keystone or b) it did not find a limit in"},{"line_number":86,"context_line":"    # Keystone at all."},{"line_number":87,"context_line":"    #"},{"line_number":88,"context_line":"    # We will need to query the list of registered limits from Keystone in"},{"line_number":89,"context_line":"    # order to determine whether each \"0\" limit is case a) or case b)."}],"source_content_type":"text/x-python","patch_set":19,"id":"5fad70f5_2efc402a","line":86,"updated":"2024-11-22 19:50:02.000000000","message":"Yass, thanks.","commit_id":"01553e93e487e343b16d90ec564e591a955fd250"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"b1a37f1f39ed0955cd7b52bd060be713c2645811","unresolved":false,"context_lines":[{"line_number":83,"context_line":"    # A limit of \"0\" in the over_limit_info_list means that oslo.limit is"},{"line_number":84,"context_line":"    # telling us the limit is 0. But oslo.limit returns 0 for two cases:"},{"line_number":85,"context_line":"    # a) it found a limit of 0 in Keystone or b) it did not find a limit in"},{"line_number":86,"context_line":"    # Keystone at all."},{"line_number":87,"context_line":"    #"},{"line_number":88,"context_line":"    # We will need to query the list of registered limits from Keystone in"},{"line_number":89,"context_line":"    # order to determine whether each \"0\" limit is case a) or case b)."}],"source_content_type":"text/x-python","patch_set":19,"id":"bd9a3c65_28e0b8f4","line":86,"in_reply_to":"5fad70f5_2efc402a","updated":"2024-11-25 18:00:01.000000000","message":"Acknowledged","commit_id":"01553e93e487e343b16d90ec564e591a955fd250"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"b02ecdf145d0a259e4a72161a7f9dfdbdf0c310c","unresolved":true,"context_lines":[{"line_number":132,"context_line":"        f\u0027Keystone. [quota]unified_limits_resource_strategy is {strategy} and \u0027"},{"line_number":133,"context_line":"        f\u0027[quota]unified_limits_resource_list is {require_or_ignore}, \u0027"},{"line_number":134,"context_line":"        f\u0027so {msg}\u0027)"},{"line_number":135,"context_line":"    return bool(enforced)"}],"source_content_type":"text/x-python","patch_set":19,"id":"7d9195af_a927953c","line":135,"updated":"2024-11-22 19:50:02.000000000","message":"So if we hit the else above, this will NameError since we never set it in either of the first two conditionals right? I guess no test since this is supposed to be rejected by oslo.config.. Will the test fixture refuse to let you set it to something other than choices? If so, `patch.object(nova.limit.utils, \u0027CONF\u0027)` should let you cover that I think.","commit_id":"01553e93e487e343b16d90ec564e591a955fd250"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"d509279863aef757361fcdae79f7e79be039f269","unresolved":true,"context_lines":[{"line_number":132,"context_line":"        f\u0027Keystone. [quota]unified_limits_resource_strategy is {strategy} and \u0027"},{"line_number":133,"context_line":"        f\u0027[quota]unified_limits_resource_list is {require_or_ignore}, \u0027"},{"line_number":134,"context_line":"        f\u0027so {msg}\u0027)"},{"line_number":135,"context_line":"    return bool(enforced)"}],"source_content_type":"text/x-python","patch_set":19,"id":"f6cc6a88_291a0f5c","line":135,"in_reply_to":"7d9195af_a927953c","updated":"2024-11-22 19:53:06.000000000","message":"Oh, yeah you\u0027re right 😣 and yeah I thought maybe it couldn\u0027t be tested. I\u0027ll try the patching.","commit_id":"01553e93e487e343b16d90ec564e591a955fd250"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"eca5fc0d0fc09d1b69ace99a0f928abbbe4ab41e","unresolved":false,"context_lines":[{"line_number":132,"context_line":"        f\u0027Keystone. [quota]unified_limits_resource_strategy is {strategy} and \u0027"},{"line_number":133,"context_line":"        f\u0027[quota]unified_limits_resource_list is {require_or_ignore}, \u0027"},{"line_number":134,"context_line":"        f\u0027so {msg}\u0027)"},{"line_number":135,"context_line":"    return bool(enforced)"}],"source_content_type":"text/x-python","patch_set":19,"id":"3b87be0a_258d77f3","line":135,"in_reply_to":"f6cc6a88_291a0f5c","updated":"2024-11-22 21:19:13.000000000","message":"Done","commit_id":"01553e93e487e343b16d90ec564e591a955fd250"}],"nova/tests/functional/test_unified_limits.py":[{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"aac255f81c8ed3c9ac7fc431cd7e9519fae64ba3","unresolved":true,"context_lines":[{"line_number":224,"context_line":""},{"line_number":225,"context_line":"        self.admin_api.delete_server(server[\u0027id\u0027])"},{"line_number":226,"context_line":""},{"line_number":227,"context_line":""},{"line_number":228,"context_line":"class RequiredResourcesTest(integrated_helpers._IntegratedTestBase):"},{"line_number":229,"context_line":""},{"line_number":230,"context_line":"    def setUp(self):"}],"source_content_type":"text/x-python","patch_set":12,"id":"ebb9aa90_3a82b253","line":227,"updated":"2024-11-10 02:09:44.000000000","message":"Note to reviewers: this patch depends on the flavor scanning patch (or vice versa) because both need the changes to the `UnifiedLimitsFixture`.","commit_id":"1882d065482882589e93ff8f95a1b39a0bbfae8a"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"8aa91b4c225fea762b806b5197184611c963c9b9","unresolved":false,"context_lines":[{"line_number":224,"context_line":""},{"line_number":225,"context_line":"        self.admin_api.delete_server(server[\u0027id\u0027])"},{"line_number":226,"context_line":""},{"line_number":227,"context_line":""},{"line_number":228,"context_line":"class RequiredResourcesTest(integrated_helpers._IntegratedTestBase):"},{"line_number":229,"context_line":""},{"line_number":230,"context_line":"    def setUp(self):"}],"source_content_type":"text/x-python","patch_set":12,"id":"fe449837_fac606b1","line":227,"in_reply_to":"ebb9aa90_3a82b253","updated":"2024-11-20 11:47:39.000000000","message":"Acknowledged","commit_id":"1882d065482882589e93ff8f95a1b39a0bbfae8a"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"ae2ef90a4d8844e0df7f487bbccfdfc2575b7b75","unresolved":true,"context_lines":[{"line_number":260,"context_line":"        # The message will be logged twice -- once in nova-api and once in"},{"line_number":261,"context_line":"        # nova-conductor because of the quota recheck after resource creation."},{"line_number":262,"context_line":"        self.assertEqual([call, call], mock_log_debug.mock_calls)"},{"line_number":263,"context_line":""},{"line_number":264,"context_line":"    def test_some_required_limits_not_set(self):"},{"line_number":265,"context_line":"        # Now add DISK_GB as a required resource."},{"line_number":266,"context_line":"        self.flags(unified_limits_required_resources\u003d["}],"source_content_type":"text/x-python","patch_set":13,"id":"25c0e0ec_a5038534","line":263,"updated":"2024-11-12 18:58:18.000000000","message":"if we are not going to support case intensive resource class names can we add a test case to show that it does not work\n\nim kind of ok with making it case sensitive or insensitive as long as we document and test both so which ever you think it best is fine with me.\n\ncanonically in os-resouce-classes all standard resocue classes are upper case\n\nhttps://github.com/openstack/os-resource-classes/blob/master/os_resource_classes/__init__.py#L41-L81\n\nand programaticlly custom  resouce classes are generated with https://github.com/openstack/os-resource-classes/blob/master/os_resource_classes/__init__.py#L100-L119\n\nwe can enfoce the casing but if we do we likely shoudl validate teh config option in init_host to ensure the conted is corect and log a error before exiting.","commit_id":"3af3c584894685a97a682655c21f1a287e1705ed"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"5cf796ac5daaede6946e8a05262dbb610226df39","unresolved":true,"context_lines":[{"line_number":260,"context_line":"        # The message will be logged twice -- once in nova-api and once in"},{"line_number":261,"context_line":"        # nova-conductor because of the quota recheck after resource creation."},{"line_number":262,"context_line":"        self.assertEqual([call, call], mock_log_debug.mock_calls)"},{"line_number":263,"context_line":""},{"line_number":264,"context_line":"    def test_some_required_limits_not_set(self):"},{"line_number":265,"context_line":"        # Now add DISK_GB as a required resource."},{"line_number":266,"context_line":"        self.flags(unified_limits_required_resources\u003d["}],"source_content_type":"text/x-python","patch_set":13,"id":"e3a6bb6a_88a5b63d","line":263,"in_reply_to":"25c0e0ec_a5038534","updated":"2024-11-13 00:08:56.000000000","message":"That\u0027s a fair point, that test coverage for that would be helpful.\n\nI like the idea of validating the resource classes. And we could also validate the \"local\" resource names like \"servers\" by doing a lookup in `nova.limit.local.LEGACY_LIMITS` and `nova.limit.placement.LEGACY_LIMITS`.","commit_id":"3af3c584894685a97a682655c21f1a287e1705ed"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"033a4c5e1ebea86197818fc22c6e5a9915052495","unresolved":true,"context_lines":[{"line_number":260,"context_line":"        # The message will be logged twice -- once in nova-api and once in"},{"line_number":261,"context_line":"        # nova-conductor because of the quota recheck after resource creation."},{"line_number":262,"context_line":"        self.assertEqual([call, call], mock_log_debug.mock_calls)"},{"line_number":263,"context_line":""},{"line_number":264,"context_line":"    def test_some_required_limits_not_set(self):"},{"line_number":265,"context_line":"        # Now add DISK_GB as a required resource."},{"line_number":266,"context_line":"        self.flags(unified_limits_required_resources\u003d["}],"source_content_type":"text/x-python","patch_set":13,"id":"fccd870a_6e663d01","line":263,"in_reply_to":"cf4e8d16_5a3c66ad","updated":"2024-11-20 16:07:55.000000000","message":"You\u0027re right, I completely forgot to add that sorry 😣 I\u0027ll add it in the next PS.","commit_id":"3af3c584894685a97a682655c21f1a287e1705ed"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"8aa91b4c225fea762b806b5197184611c963c9b9","unresolved":true,"context_lines":[{"line_number":260,"context_line":"        # The message will be logged twice -- once in nova-api and once in"},{"line_number":261,"context_line":"        # nova-conductor because of the quota recheck after resource creation."},{"line_number":262,"context_line":"        self.assertEqual([call, call], mock_log_debug.mock_calls)"},{"line_number":263,"context_line":""},{"line_number":264,"context_line":"    def test_some_required_limits_not_set(self):"},{"line_number":265,"context_line":"        # Now add DISK_GB as a required resource."},{"line_number":266,"context_line":"        self.flags(unified_limits_required_resources\u003d["}],"source_content_type":"text/x-python","patch_set":13,"id":"cf4e8d16_5a3c66ad","line":263,"in_reply_to":"e3a6bb6a_88a5b63d","updated":"2024-11-20 11:47:39.000000000","message":"note this start up detection has not been added\n\neffectivly we need to check that either its in the legacy limts\nor its starts with class:  and the remainder fo the class is either a standard trait or starts with CUSTOM_\n\ndo you plan to add another patch to do this check?\n\ni think its ok to do as a follow up but just want to confirm.","commit_id":"3af3c584894685a97a682655c21f1a287e1705ed"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"05c61f418810763b4c8b675e1028dcf6cd08da48","unresolved":false,"context_lines":[{"line_number":260,"context_line":"        # The message will be logged twice -- once in nova-api and once in"},{"line_number":261,"context_line":"        # nova-conductor because of the quota recheck after resource creation."},{"line_number":262,"context_line":"        self.assertEqual([call, call], mock_log_debug.mock_calls)"},{"line_number":263,"context_line":""},{"line_number":264,"context_line":"    def test_some_required_limits_not_set(self):"},{"line_number":265,"context_line":"        # Now add DISK_GB as a required resource."},{"line_number":266,"context_line":"        self.flags(unified_limits_required_resources\u003d["}],"source_content_type":"text/x-python","patch_set":13,"id":"76285b9e_f5c7f44d","line":263,"in_reply_to":"fccd870a_6e663d01","updated":"2024-11-21 05:19:39.000000000","message":"Done","commit_id":"3af3c584894685a97a682655c21f1a287e1705ed"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"8aa91b4c225fea762b806b5197184611c963c9b9","unresolved":false,"context_lines":[{"line_number":257,"context_line":"        call \u003d mock.call("},{"line_number":258,"context_line":"            f\u0027Resources {unset_limits} have no registered limits set and are \u0027"},{"line_number":259,"context_line":"            \u0027not specified in [quota]unified_limits_resource_list with \u0027"},{"line_number":260,"context_line":"            \u0027strategy require, so not enforcing.\u0027)"},{"line_number":261,"context_line":"        # The message will be logged twice -- once in nova-api and once in"},{"line_number":262,"context_line":"        # nova-conductor because of the quota recheck after resource creation."},{"line_number":263,"context_line":"        self.assertEqual([call, call], mock_log_debug.mock_calls)"}],"source_content_type":"text/x-python","patch_set":16,"id":"438f2a75_67f70577","line":260,"updated":"2024-11-20 11:47:39.000000000","message":"ack, its not listed in in required so the boot passed but the default flaor is not boot form volume so the root disk will not be 0 hence this will be in the request and will not have a limit as you did not configure one above","commit_id":"3f0e9f1a39bb4cb621fd9772c8b5f02f8796d41b"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"eca5fc0d0fc09d1b69ace99a0f928abbbe4ab41e","unresolved":true,"context_lines":[{"line_number":231,"context_line":"        super().setUp()"},{"line_number":232,"context_line":"        # Use different project_ids for non-admin and admin."},{"line_number":233,"context_line":"        self.api.project_id \u003d \u0027fake\u0027"},{"line_number":234,"context_line":"        self.admin_api.project_id \u003d \u0027admin\u0027"},{"line_number":235,"context_line":""},{"line_number":236,"context_line":"        self.flags(driver\u003d\"nova.quota.UnifiedLimitsDriver\", group\u003d\u0027quota\u0027)"},{"line_number":237,"context_line":"        self.ctx \u003d nova_context.get_admin_context()"}],"source_content_type":"text/x-python","patch_set":20,"id":"d07be7d0_c18b074c","line":234,"updated":"2024-11-22 21:19:13.000000000","message":"Bah, I forgot I did this. So the \u0027other\u0027 project_id stuff I did in the last test is not necessary. I could have just used self.admin_api. I had that originally in the test but then forgot why it was OK and changed it 🙄","commit_id":"9d05b6d141eaef997784c7a4a46360f83346029b"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"1ac515da02d4985425fd058c7695ecdecf06ca54","unresolved":false,"context_lines":[{"line_number":231,"context_line":"        super().setUp()"},{"line_number":232,"context_line":"        # Use different project_ids for non-admin and admin."},{"line_number":233,"context_line":"        self.api.project_id \u003d \u0027fake\u0027"},{"line_number":234,"context_line":"        self.admin_api.project_id \u003d \u0027admin\u0027"},{"line_number":235,"context_line":""},{"line_number":236,"context_line":"        self.flags(driver\u003d\"nova.quota.UnifiedLimitsDriver\", group\u003d\u0027quota\u0027)"},{"line_number":237,"context_line":"        self.ctx \u003d nova_context.get_admin_context()"}],"source_content_type":"text/x-python","patch_set":20,"id":"26cfb3b9_f1db2c7c","line":234,"in_reply_to":"d07be7d0_c18b074c","updated":"2024-11-22 22:10:29.000000000","message":"Done","commit_id":"9d05b6d141eaef997784c7a4a46360f83346029b"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"b1a37f1f39ed0955cd7b52bd060be713c2645811","unresolved":true,"context_lines":[{"line_number":247,"context_line":"                ValueError, self.flags, unified_limits_resource_list\u003d[name],"},{"line_number":248,"context_line":"                group\u003d\u0027quota\u0027)"},{"line_number":249,"context_line":"            self.assertIsInstance(e, ValueError)"},{"line_number":250,"context_line":"            self.assertIn(\u0027not a valid resource class name\u0027, str(e))"},{"line_number":251,"context_line":""},{"line_number":252,"context_line":"    def test_valid_custom_resource_classes(self):"},{"line_number":253,"context_line":"        valid_names \u003d (\u0027class:CUSTOM_GOLD\u0027, \u0027class:CUSTOM_A5_1\u0027)"}],"source_content_type":"text/x-python","patch_set":21,"id":"952ffe5c_f9bd2bad","line":250,"updated":"2024-11-25 18:00:01.000000000","message":"so this could just be a unit test but its fine to include it with these.\nto keep them grouped together.\nits si effectilgy ust testing the new item validator\n\nhttps://review.opendev.org/c/openstack/nova/+/924025/21/nova/conf/quota.py#24","commit_id":"fd5b6929053ca6065e90054422f4b23b166c7df1"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"b1a37f1f39ed0955cd7b52bd060be713c2645811","unresolved":false,"context_lines":[{"line_number":253,"context_line":"        valid_names \u003d (\u0027class:CUSTOM_GOLD\u0027, \u0027class:CUSTOM_A5_1\u0027)"},{"line_number":254,"context_line":"        for name in valid_names:"},{"line_number":255,"context_line":"            self.flags(unified_limits_resource_list\u003d[name], group\u003d\u0027quota\u0027)"},{"line_number":256,"context_line":""},{"line_number":257,"context_line":"    @mock.patch(\u0027nova.limit.utils.LOG.error\u0027)"},{"line_number":258,"context_line":"    def test_invalid_strategy_configuration(self, mock_log_error):"},{"line_number":259,"context_line":"        # Quota should be enforced and fail the check if there is somehow an"}],"source_content_type":"text/x-python","patch_set":21,"id":"9944cd17_1c39cf2e","line":256,"updated":"2024-11-25 18:00:01.000000000","message":"and this is the happy path for the proceeding test.\n+1","commit_id":"fd5b6929053ca6065e90054422f4b23b166c7df1"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"b1a37f1f39ed0955cd7b52bd060be713c2645811","unresolved":false,"context_lines":[{"line_number":269,"context_line":"            \u0027[quota]unified_limits_resource_strategy config option, so \u0027"},{"line_number":270,"context_line":"            \u0027enforcing for resources\u0027)"},{"line_number":271,"context_line":"        mock_log_error.assert_called()"},{"line_number":272,"context_line":"        self.assertIn(expected, mock_log_error.call_args.args[0])"},{"line_number":273,"context_line":""},{"line_number":274,"context_line":"    @mock.patch(\u0027nova.limit.utils.LOG.debug\u0027)"},{"line_number":275,"context_line":"    def test_required_limits_set(self, mock_log_debug):"}],"source_content_type":"text/x-python","patch_set":21,"id":"ac0f7586_6b5ef6bf","line":272,"updated":"2024-11-25 18:00:01.000000000","message":"this is testing \nhttps://review.opendev.org/c/openstack/nova/+/924025/21/nova/limit/utils.py#124","commit_id":"fd5b6929053ca6065e90054422f4b23b166c7df1"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"b1a37f1f39ed0955cd7b52bd060be713c2645811","unresolved":false,"context_lines":[{"line_number":286,"context_line":"            resource_name\u003d\u0027class:MEMORY_MB\u0027, default_limit\u003d32768)"},{"line_number":287,"context_line":"        # Server create should succeed because required resources VCPU,"},{"line_number":288,"context_line":"        # MEMORY_MB, and \u0027servers\u0027 have registered limits."},{"line_number":289,"context_line":"        self._create_server()"},{"line_number":290,"context_line":"        unset_limits \u003d set([\u0027class:DISK_GB\u0027])"},{"line_number":291,"context_line":"        call \u003d mock.call("},{"line_number":292,"context_line":"            f\u0027Resources {unset_limits} have no registered limits set in \u0027"}],"source_content_type":"text/x-python","patch_set":21,"id":"77f44375_8a09003e","line":289,"updated":"2024-11-25 18:00:01.000000000","message":"+1 DISK_GB is not required so we expect the server create to compelte without excption","commit_id":"fd5b6929053ca6065e90054422f4b23b166c7df1"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"b1a37f1f39ed0955cd7b52bd060be713c2645811","unresolved":false,"context_lines":[{"line_number":295,"context_line":"            \u0027enforcing\u0027)"},{"line_number":296,"context_line":"        # The message will be logged twice -- once in nova-api and once in"},{"line_number":297,"context_line":"        # nova-conductor because of the quota recheck after resource creation."},{"line_number":298,"context_line":"        self.assertEqual([call, call], mock_log_debug.mock_calls)"},{"line_number":299,"context_line":""},{"line_number":300,"context_line":"    def test_some_required_limits_not_set(self):"},{"line_number":301,"context_line":"        # Now add DISK_GB as a required resource."}],"source_content_type":"text/x-python","patch_set":21,"id":"419c8813_0449def1","line":298,"updated":"2024-11-25 18:00:01.000000000","message":"ack this is testing \nhttps://review.opendev.org/c/openstack/nova/+/924025/21/nova/limit/utils.py#131\nin the required code path.","commit_id":"fd5b6929053ca6065e90054422f4b23b166c7df1"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"b1a37f1f39ed0955cd7b52bd060be713c2645811","unresolved":false,"context_lines":[{"line_number":314,"context_line":"        # have a registered limit set."},{"line_number":315,"context_line":"        e \u003d self.assertRaises("},{"line_number":316,"context_line":"            client.OpenStackApiException, self._create_server, api\u003dself.api)"},{"line_number":317,"context_line":"        self.assertEqual(403, e.response.status_code)"},{"line_number":318,"context_line":""},{"line_number":319,"context_line":"    @mock.patch(\u0027nova.limit.utils.LOG.debug\u0027)"},{"line_number":320,"context_line":"    def test_no_required_limits(self, mock_log_debug):"}],"source_content_type":"text/x-python","patch_set":21,"id":"3abb79cf_efd616fd","line":317,"updated":"2024-11-25 18:00:01.000000000","message":"ack, now DISK_GB is required but no limit is set so we are over quota","commit_id":"fd5b6929053ca6065e90054422f4b23b166c7df1"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"b1a37f1f39ed0955cd7b52bd060be713c2645811","unresolved":false,"context_lines":[{"line_number":326,"context_line":"        self._create_server()"},{"line_number":327,"context_line":"        # The message will be logged twice -- once in nova-api and once in"},{"line_number":328,"context_line":"        # nova-conductor because of the quota recheck after resource creation."},{"line_number":329,"context_line":"        self.assertEqual(2, mock_log_debug.call_count)"},{"line_number":330,"context_line":""},{"line_number":331,"context_line":"    @mock.patch(\u0027nova.limit.utils.LOG.debug\u0027)"},{"line_number":332,"context_line":"    def test_ignored_limits_set(self, mock_log_debug):"}],"source_content_type":"text/x-python","patch_set":21,"id":"95ab1a62_c1943850","line":329,"updated":"2024-11-25 18:00:01.000000000","message":"ack this is just assertign that its posisbel to remvoe all limits by explcit via config since the default is to enfoce the server limit.","commit_id":"fd5b6929053ca6065e90054422f4b23b166c7df1"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"b1a37f1f39ed0955cd7b52bd060be713c2645811","unresolved":false,"context_lines":[{"line_number":352,"context_line":"            \u0027enforcing\u0027)"},{"line_number":353,"context_line":"        # The message will be logged twice -- once in nova-api and once in"},{"line_number":354,"context_line":"        # nova-conductor because of the quota recheck after resource creation."},{"line_number":355,"context_line":"        self.assertEqual([call, call], mock_log_debug.mock_calls)"},{"line_number":356,"context_line":""},{"line_number":357,"context_line":"    def test_some_ignored_limits_not_set(self):"},{"line_number":358,"context_line":"        # Configured to ignore only one unset resource limit."}],"source_content_type":"text/x-python","patch_set":21,"id":"4074849a_d0a0392d","line":355,"updated":"2024-11-25 18:00:01.000000000","message":"ack so this is the sysmetric test usign the ignore poslicy.\nhere we explcitly need to ignore DISK_GB because the default flavor is not boot form volume and has a non 0 root disk.","commit_id":"fd5b6929053ca6065e90054422f4b23b166c7df1"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"b1a37f1f39ed0955cd7b52bd060be713c2645811","unresolved":false,"context_lines":[{"line_number":369,"context_line":"        # \u0027servers\u0027 does not have a limit set and it is not in the ignore list."},{"line_number":370,"context_line":"        e \u003d self.assertRaises("},{"line_number":371,"context_line":"            client.OpenStackApiException, self._create_server, api\u003dself.api)"},{"line_number":372,"context_line":"        self.assertEqual(403, e.response.status_code)"},{"line_number":373,"context_line":""},{"line_number":374,"context_line":"    def test_no_ignored_limits(self):"},{"line_number":375,"context_line":"        # Configured to not ignore any unset resource limits."}],"source_content_type":"text/x-python","patch_set":21,"id":"87acbe8a_26bf0685","line":372,"updated":"2024-11-25 18:00:01.000000000","message":"ack: in this case it will fail on the server limit since its not in the ignore list and does nto have a registered limit","commit_id":"fd5b6929053ca6065e90054422f4b23b166c7df1"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"b1a37f1f39ed0955cd7b52bd060be713c2645811","unresolved":false,"context_lines":[{"line_number":379,"context_line":"        # registered limit set and it is not in the ignore list."},{"line_number":380,"context_line":"        e \u003d self.assertRaises("},{"line_number":381,"context_line":"            client.OpenStackApiException, self._create_server, api\u003dself.api)"},{"line_number":382,"context_line":"        self.assertEqual(403, e.response.status_code)"},{"line_number":383,"context_line":""},{"line_number":384,"context_line":"    def test_all_unlimited(self):"},{"line_number":385,"context_line":"        # -1 is documented in Keystone as meaning unlimited:"}],"source_content_type":"text/x-python","patch_set":21,"id":"284920ff_0cef082d","line":382,"updated":"2024-11-25 18:00:01.000000000","message":"ack: this is testing that it is possible to say never ignore any missing limit.","commit_id":"fd5b6929053ca6065e90054422f4b23b166c7df1"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"b1a37f1f39ed0955cd7b52bd060be713c2645811","unresolved":false,"context_lines":[{"line_number":395,"context_line":"                \u0027servers\u0027, \u0027class:VCPU\u0027, \u0027class:MEMORY_MB\u0027, \u0027class:DISK_GB\u0027):"},{"line_number":396,"context_line":"            self.ul_api.create_registered_limit("},{"line_number":397,"context_line":"                resource_name\u003dresource, default_limit\u003d-1)"},{"line_number":398,"context_line":"        self._create_server()"},{"line_number":399,"context_line":""},{"line_number":400,"context_line":"    def test_default_unlimited_but_project_limited(self):"},{"line_number":401,"context_line":"        # If the default limit is set to -1 unlimited but the project has a"}],"source_content_type":"text/x-python","patch_set":21,"id":"9247acd6_ffc7302f","line":398,"updated":"2024-11-25 18:00:01.000000000","message":"+1 this is impoant in my view as i could see use eventually making the default ignore with an empty list and documetign that you shoudl register -1 limits instead.\n\nbut only after we have made unifed limits the default for at least 1 slurp.\n\ni.e. we could perhaps do that in 2026.2 or later.","commit_id":"fd5b6929053ca6065e90054422f4b23b166c7df1"}],"nova/tests/unit/api/openstack/compute/test_server_group_quotas.py":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"b1a37f1f39ed0955cd7b52bd060be713c2645811","unresolved":false,"context_lines":[{"line_number":26,"context_line":"from nova.limit import local as local_limit"},{"line_number":27,"context_line":"from nova import objects"},{"line_number":28,"context_line":"from nova import test"},{"line_number":29,"context_line":"from nova.tests import fixtures as nova_fixtures"},{"line_number":30,"context_line":"from nova.tests.unit.api.openstack import fakes"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":""}],"source_content_type":"text/x-python","patch_set":21,"id":"aace5266_eda5f644","line":29,"updated":"2024-11-25 18:00:01.000000000","message":"ah yes we need to use our own fixture now due to the extra logic,makes sense.","commit_id":"fd5b6929053ca6065e90054422f4b23b166c7df1"}],"releasenotes/notes/unified-limits-required-resources-fb99b0d994decf62.yaml":[{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"e019470300b7109ed50826772a54d9a1b95051cf","unresolved":true,"context_lines":[{"line_number":21,"context_line":"    The options should be configured for the :program:`nova-api` and"},{"line_number":22,"context_line":"    :program:`nova-conductor` services. The :program:`nova-conductor` service"},{"line_number":23,"context_line":"    performs quota enforcement when ``[quota]recheck_quota`` is ``True`` (the"},{"line_number":24,"context_line":"    default)."},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"    The ``unified_limits_resource_list`` list can also be set to an empty list."},{"line_number":27,"context_line":"upgrade:"}],"source_content_type":"text/x-yaml","patch_set":17,"id":"b4f73bb3_b0408ab0","line":24,"updated":"2024-11-21 21:28:45.000000000","message":"Same comments here about the other side of the equation.","commit_id":"c275dfccb9c8da76e9825fde1e1701afa62e7537"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"545ceb0ab618bccdf28497d13a8abca4796bdc0f","unresolved":false,"context_lines":[{"line_number":21,"context_line":"    The options should be configured for the :program:`nova-api` and"},{"line_number":22,"context_line":"    :program:`nova-conductor` services. The :program:`nova-conductor` service"},{"line_number":23,"context_line":"    performs quota enforcement when ``[quota]recheck_quota`` is ``True`` (the"},{"line_number":24,"context_line":"    default)."},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"    The ``unified_limits_resource_list`` list can also be set to an empty list."},{"line_number":27,"context_line":"upgrade:"}],"source_content_type":"text/x-yaml","patch_set":17,"id":"2924178a_92d7fef7","line":24,"in_reply_to":"b4f73bb3_b0408ab0","updated":"2024-11-22 02:19:37.000000000","message":"Done","commit_id":"c275dfccb9c8da76e9825fde1e1701afa62e7537"}]}
