)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"78638794b57e0d96551ea64273e9f544cf4dc231","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"b45ec22a_e049a8e2","updated":"2024-07-22 00:41:10.000000000","message":"Great work so far!","commit_id":"e8f9661f6840ea7e2994880d4119caca31ff8be4"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"36616881b155eab9381a046f0f528400cf0aefac","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"f9151cc8_7a03deb7","updated":"2024-09-06 06:31:05.000000000","message":"Looking great and just intime for the release.","commit_id":"264261cb9813ae891587ac0eb3e5679a566d739e"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"305e67df0061b8fcb1ceae805fca5a224a707827","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"b8e6ce32_93344045","updated":"2024-09-06 16:06:12.000000000","message":"I\u0027ll see if I can get this fixed up later today.","commit_id":"84ab86f88e28109690c1573c930d2c3b3a782600"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"c430804cca5294ae87643427bf3ff3c426d5c1cd","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"68b2a678_74df180c","updated":"2024-09-06 20:58:01.000000000","message":"I\u0027ll let Matt have final approval, since I had a hand in the last round of fixups.","commit_id":"975c63de69665d3796f02c0c13a82b71a4a590c8"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"2c7320623ae675d2b75f99119b8cee74cb15c597","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"91ef6b7a_b3013254","updated":"2024-09-09 06:10:09.000000000","message":"Let\u0027s land this patch and get it in the release!\n\nNice work everyone!","commit_id":"4eefae2482aeacbf27b58dae44b7f5808bbfa3de"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"d6d60b1cf0094f95bc1245dc9a6b858df491a17a","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"22c8f5d2_850486a0","updated":"2024-09-06 23:47:28.000000000","message":"The functional tests could also go check for the new Quota-Count variants too. But as this is just function test, this can be a follow up. It doesn\u0027t need to hold up this patch or the release.\n\n@distroguy@gmail.com Did you want to have a go at a follow up that adds the Quota-Count tests to the functional test Tim added? That way we can still land this.\n\nWaiting on a +1 from zuul before I +A.","commit_id":"4eefae2482aeacbf27b58dae44b7f5808bbfa3de"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"5af8292e7237829180c665579ce3302a5a8950ed","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"25028e1f_ac94c01c","updated":"2024-09-06 23:15:50.000000000","message":"recheck\n\n```\nOSError: [Errno 99] Cannot assign requested address\n```\n\nSeems like it might be some trouble with the raxflex provider?","commit_id":"4eefae2482aeacbf27b58dae44b7f5808bbfa3de"}],"swift/common/middleware/account_quotas.py":[{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"03541c122186be8dc93fe5bddcfd565f2f32d569","unresolved":true,"context_lines":[{"line_number":24,"context_line":"+---------------------------------------------+-------------------------------+"},{"line_number":25,"context_line":"|Metadata                                     | Use                           |"},{"line_number":26,"context_line":"+\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d+\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d+"},{"line_number":27,"context_line":"| X-Account-Meta-Quota-Bytes                  | Maximum overall bytes stored  |"},{"line_number":28,"context_line":"|                                             | in account across containers. |"},{"line_number":29,"context_line":"+---------------------------------------------+-------------------------------+"},{"line_number":30,"context_line":"| X-Account-Meta-Quota-Count                  | Maximum object count under    |"}],"source_content_type":"text/x-python","patch_set":2,"id":"442d9227_b9863dd8","line":27,"range":{"start_line":27,"start_character":30,"end_line":27,"end_character":32},"updated":"2024-07-22 07:03:04.000000000","message":"Maybe add:\n\n    | X-Account-Meta-Quota-Bytes (Deprecated)\n\nOr something here, so the world knows that once this lands this old way is deprecated?","commit_id":"e8f9661f6840ea7e2994880d4119caca31ff8be4"},{"author":{"_account_id":22042,"name":"Chris Smart","email":"distroguy@gmail.com","username":"csmart"},"change_message_id":"adb9cd893cc8074358896a6d4875f0ed5b201eba","unresolved":false,"context_lines":[{"line_number":24,"context_line":"+---------------------------------------------+-------------------------------+"},{"line_number":25,"context_line":"|Metadata                                     | Use                           |"},{"line_number":26,"context_line":"+\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d+\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d+"},{"line_number":27,"context_line":"| X-Account-Meta-Quota-Bytes                  | Maximum overall bytes stored  |"},{"line_number":28,"context_line":"|                                             | in account across containers. |"},{"line_number":29,"context_line":"+---------------------------------------------+-------------------------------+"},{"line_number":30,"context_line":"| X-Account-Meta-Quota-Count                  | Maximum object count under    |"}],"source_content_type":"text/x-python","patch_set":2,"id":"922e3f25_38d3b23c","line":27,"range":{"start_line":27,"start_character":30,"end_line":27,"end_character":32},"in_reply_to":"442d9227_b9863dd8","updated":"2024-09-06 05:53:47.000000000","message":"I\u0027ve added Obsoleted.","commit_id":"e8f9661f6840ea7e2994880d4119caca31ff8be4"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"03541c122186be8dc93fe5bddcfd565f2f32d569","unresolved":true,"context_lines":[{"line_number":27,"context_line":"| X-Account-Meta-Quota-Bytes                  | Maximum overall bytes stored  |"},{"line_number":28,"context_line":"|                                             | in account across containers. |"},{"line_number":29,"context_line":"+---------------------------------------------+-------------------------------+"},{"line_number":30,"context_line":"| X-Account-Meta-Quota-Count                  | Maximum object count under    |"},{"line_number":31,"context_line":"|                                             | account.                      |"},{"line_number":32,"context_line":"+---------------------------------------------+-------------------------------+"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"7bf9b1cc_faf3a5ad","line":31,"range":{"start_line":30,"start_character":1,"end_line":31,"end_character":67},"updated":"2024-07-22 07:03:04.000000000","message":"Let\u0027s remove this (as it isn\u0027t supported anymore, and we\u0027ve removed it before a release so we don\u0027t need to keep supporting it).","commit_id":"e8f9661f6840ea7e2994880d4119caca31ff8be4"},{"author":{"_account_id":22042,"name":"Chris Smart","email":"distroguy@gmail.com","username":"csmart"},"change_message_id":"adb9cd893cc8074358896a6d4875f0ed5b201eba","unresolved":false,"context_lines":[{"line_number":27,"context_line":"| X-Account-Meta-Quota-Bytes                  | Maximum overall bytes stored  |"},{"line_number":28,"context_line":"|                                             | in account across containers. |"},{"line_number":29,"context_line":"+---------------------------------------------+-------------------------------+"},{"line_number":30,"context_line":"| X-Account-Meta-Quota-Count                  | Maximum object count under    |"},{"line_number":31,"context_line":"|                                             | account.                      |"},{"line_number":32,"context_line":"+---------------------------------------------+-------------------------------+"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"8ccea1d9_60ecfc58","line":31,"range":{"start_line":30,"start_character":1,"end_line":31,"end_character":67},"in_reply_to":"7bf9b1cc_faf3a5ad","updated":"2024-09-06 05:53:47.000000000","message":"This has been renamed to the new API.","commit_id":"e8f9661f6840ea7e2994880d4119caca31ff8be4"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"03541c122186be8dc93fe5bddcfd565f2f32d569","unresolved":true,"context_lines":[{"line_number":29,"context_line":"+---------------------------------------------+-------------------------------+"},{"line_number":30,"context_line":"| X-Account-Meta-Quota-Count                  | Maximum object count under    |"},{"line_number":31,"context_line":"|                                             | account.                      |"},{"line_number":32,"context_line":"+---------------------------------------------+-------------------------------+"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"Write requests to those metadata entries are only permitted for resellers."}],"source_content_type":"text/x-python","patch_set":2,"id":"28774130_775e6e93","line":32,"updated":"2024-07-22 07:03:04.000000000","message":"Add the new options to the table too!","commit_id":"e8f9661f6840ea7e2994880d4119caca31ff8be4"},{"author":{"_account_id":22042,"name":"Chris Smart","email":"distroguy@gmail.com","username":"csmart"},"change_message_id":"adb9cd893cc8074358896a6d4875f0ed5b201eba","unresolved":false,"context_lines":[{"line_number":29,"context_line":"+---------------------------------------------+-------------------------------+"},{"line_number":30,"context_line":"| X-Account-Meta-Quota-Count                  | Maximum object count under    |"},{"line_number":31,"context_line":"|                                             | account.                      |"},{"line_number":32,"context_line":"+---------------------------------------------+-------------------------------+"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"Write requests to those metadata entries are only permitted for resellers."}],"source_content_type":"text/x-python","patch_set":2,"id":"063c542b_724ff98a","line":32,"in_reply_to":"28774130_775e6e93","updated":"2024-09-06 05:53:47.000000000","message":"Done.","commit_id":"e8f9661f6840ea7e2994880d4119caca31ff8be4"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"78638794b57e0d96551ea64273e9f544cf4dc231","unresolved":true,"context_lines":[{"line_number":128,"context_line":"            self.validate_and_translate_quotas(request, \"Quota-Bytes\")"},{"line_number":129,"context_line":"            self.validate_and_translate_quotas(request, \"Quota-Count\")"},{"line_number":130,"context_line":"        resp \u003d request.get_response(self.app)"},{"line_number":131,"context_line":"        # Non-resellers can\u0027t update quotas, but they *can* see them"},{"line_number":132,"context_line":"        for policy in POLICIES:"},{"line_number":133,"context_line":"            infixes \u003d (\u0027Quota-Bytes-Policy\u0027, \u0027Quota-Count-Policy\u0027)"},{"line_number":134,"context_line":"            for infix in infixes:"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a0a2870_e3dd412e","line":131,"updated":"2024-07-22 00:41:10.000000000","message":"Need to translate the new sysmeta\u0027s back to X-Account-* so they can be seen by users. Sysmeta headers are stripped.","commit_id":"e8f9661f6840ea7e2994880d4119caca31ff8be4"},{"author":{"_account_id":22042,"name":"Chris Smart","email":"distroguy@gmail.com","username":"csmart"},"change_message_id":"adb9cd893cc8074358896a6d4875f0ed5b201eba","unresolved":false,"context_lines":[{"line_number":128,"context_line":"            self.validate_and_translate_quotas(request, \"Quota-Bytes\")"},{"line_number":129,"context_line":"            self.validate_and_translate_quotas(request, \"Quota-Count\")"},{"line_number":130,"context_line":"        resp \u003d request.get_response(self.app)"},{"line_number":131,"context_line":"        # Non-resellers can\u0027t update quotas, but they *can* see them"},{"line_number":132,"context_line":"        for policy in POLICIES:"},{"line_number":133,"context_line":"            infixes \u003d (\u0027Quota-Bytes-Policy\u0027, \u0027Quota-Count-Policy\u0027)"},{"line_number":134,"context_line":"            for infix in infixes:"}],"source_content_type":"text/x-python","patch_set":2,"id":"3cebf2ce_872f3277","line":131,"in_reply_to":"3a0a2870_e3dd412e","updated":"2024-09-06 05:53:47.000000000","message":"This should be implemented now","commit_id":"e8f9661f6840ea7e2994880d4119caca31ff8be4"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"78638794b57e0d96551ea64273e9f544cf4dc231","unresolved":true,"context_lines":[{"line_number":171,"context_line":""},{"line_number":172,"context_line":"        # Check for quota byte violation"},{"line_number":173,"context_line":"        try:"},{"line_number":174,"context_line":"            quota \u003d int(account_info[\u0027sysmeta\u0027].get(\u0027quota-bytes\u0027, -1))"},{"line_number":175,"context_line":"        except ValueError:"},{"line_number":176,"context_line":"            quota \u003d -1"},{"line_number":177,"context_line":"        if quota \u003e\u003d 0:"}],"source_content_type":"text/x-python","patch_set":2,"id":"6f1e33d6_718f9b6c","line":174,"updated":"2024-07-22 00:41:10.000000000","message":"Maybe we can change this to something like:\n\n    quota \u003d int(account_info[\u0027sysmeta\u0027].get(\u0027quota-bytes\u0027, account_info[\u0027meta\u0027].get(\u0027quota-bytes\u0027, -1)))","commit_id":"e8f9661f6840ea7e2994880d4119caca31ff8be4"},{"author":{"_account_id":22042,"name":"Chris Smart","email":"distroguy@gmail.com","username":"csmart"},"change_message_id":"adb9cd893cc8074358896a6d4875f0ed5b201eba","unresolved":false,"context_lines":[{"line_number":171,"context_line":""},{"line_number":172,"context_line":"        # Check for quota byte violation"},{"line_number":173,"context_line":"        try:"},{"line_number":174,"context_line":"            quota \u003d int(account_info[\u0027sysmeta\u0027].get(\u0027quota-bytes\u0027, -1))"},{"line_number":175,"context_line":"        except ValueError:"},{"line_number":176,"context_line":"            quota \u003d -1"},{"line_number":177,"context_line":"        if quota \u003e\u003d 0:"}],"source_content_type":"text/x-python","patch_set":2,"id":"3201f140_909f018e","line":174,"in_reply_to":"6f1e33d6_718f9b6c","updated":"2024-09-06 05:53:47.000000000","message":"This should be supported now.","commit_id":"e8f9661f6840ea7e2994880d4119caca31ff8be4"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"36616881b155eab9381a046f0f528400cf0aefac","unresolved":true,"context_lines":[{"line_number":146,"context_line":"        resp \u003d request.get_response(self.app)"},{"line_number":147,"context_line":"        # Non-resellers can\u0027t update quotas, but they *can* see them"},{"line_number":148,"context_line":"        # Global quotas"},{"line_number":149,"context_line":"        infixes \u003d (\u0027Quota-Bytes\u0027, \u0027Quota-Count\u0027)"},{"line_number":150,"context_line":"        for infix in infixes:"},{"line_number":151,"context_line":"            value \u003d resp.headers.get(\u0027X-Account-Sysmeta-%s\u0027 % infix)"},{"line_number":152,"context_line":"            if value:"}],"source_content_type":"text/x-python","patch_set":3,"id":"16ad14c9_50101964","line":149,"range":{"start_line":149,"start_character":8,"end_line":149,"end_character":15},"updated":"2024-09-06 06:31:05.000000000","message":"I guess if I wanted to NIT I could say this should be postfix instead of infix, because it\u0027s at the end :P\n\nBut definitely not blocking on that 😄","commit_id":"264261cb9813ae891587ac0eb3e5679a566d739e"},{"author":{"_account_id":22042,"name":"Chris Smart","email":"distroguy@gmail.com","username":"csmart"},"change_message_id":"d69968370de49aa367a615f557ca6ae0528356f2","unresolved":false,"context_lines":[{"line_number":146,"context_line":"        resp \u003d request.get_response(self.app)"},{"line_number":147,"context_line":"        # Non-resellers can\u0027t update quotas, but they *can* see them"},{"line_number":148,"context_line":"        # Global quotas"},{"line_number":149,"context_line":"        infixes \u003d (\u0027Quota-Bytes\u0027, \u0027Quota-Count\u0027)"},{"line_number":150,"context_line":"        for infix in infixes:"},{"line_number":151,"context_line":"            value \u003d resp.headers.get(\u0027X-Account-Sysmeta-%s\u0027 % infix)"},{"line_number":152,"context_line":"            if value:"}],"source_content_type":"text/x-python","patch_set":3,"id":"b8adf62e_3914d16d","line":149,"range":{"start_line":149,"start_character":8,"end_line":149,"end_character":15},"in_reply_to":"16ad14c9_50101964","updated":"2024-09-06 06:48:21.000000000","message":"I can probably do that 😊","commit_id":"264261cb9813ae891587ac0eb3e5679a566d739e"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"5a6cea43cff832e4ee48776136ffe30594b90a96","unresolved":true,"context_lines":[{"line_number":153,"context_line":"                resp.headers[\u0027X-Account-%s\u0027 % postfix] \u003d value"},{"line_number":154,"context_line":""},{"line_number":155,"context_line":"        # Per policy quotas"},{"line_number":156,"context_line":"        for policy in POLICIES:"},{"line_number":157,"context_line":"            postfixes \u003d (\u0027Quota-Bytes-Policy\u0027, \u0027Quota-Count-Policy\u0027)"},{"line_number":158,"context_line":"            for postfix in postfixes:"},{"line_number":159,"context_line":"                value \u003d resp.headers.get(\u0027X-Account-Sysmeta-%s-%d\u0027 % ("},{"line_number":160,"context_line":"                    postfix, policy.idx))"},{"line_number":161,"context_line":"                if value:"},{"line_number":162,"context_line":"                    resp.headers[\u0027X-Account-%s-%s\u0027 % ("},{"line_number":163,"context_line":"                        postfix, policy.name)] \u003d value"},{"line_number":164,"context_line":"        return resp"},{"line_number":165,"context_line":""},{"line_number":166,"context_line":"    @wsgify"}],"source_content_type":"text/x-python","patch_set":4,"id":"59ac54fb_d3ae3a5c","line":163,"range":{"start_line":156,"start_character":7,"end_line":163,"end_character":54},"updated":"2024-09-06 07:15:38.000000000","message":"These should be infixes tho, because they\u0027re inbetween the header.","commit_id":"2af52caa1241a35fe5c24879bb5250ea2dfbd0ad"},{"author":{"_account_id":22042,"name":"Chris Smart","email":"distroguy@gmail.com","username":"csmart"},"change_message_id":"2abbd63549f9ccf1e2bd518fd8bc77b3a65a668c","unresolved":false,"context_lines":[{"line_number":153,"context_line":"                resp.headers[\u0027X-Account-%s\u0027 % postfix] \u003d value"},{"line_number":154,"context_line":""},{"line_number":155,"context_line":"        # Per policy quotas"},{"line_number":156,"context_line":"        for policy in POLICIES:"},{"line_number":157,"context_line":"            postfixes \u003d (\u0027Quota-Bytes-Policy\u0027, \u0027Quota-Count-Policy\u0027)"},{"line_number":158,"context_line":"            for postfix in postfixes:"},{"line_number":159,"context_line":"                value \u003d resp.headers.get(\u0027X-Account-Sysmeta-%s-%d\u0027 % ("},{"line_number":160,"context_line":"                    postfix, policy.idx))"},{"line_number":161,"context_line":"                if value:"},{"line_number":162,"context_line":"                    resp.headers[\u0027X-Account-%s-%s\u0027 % ("},{"line_number":163,"context_line":"                        postfix, policy.name)] \u003d value"},{"line_number":164,"context_line":"        return resp"},{"line_number":165,"context_line":""},{"line_number":166,"context_line":"    @wsgify"}],"source_content_type":"text/x-python","patch_set":4,"id":"97aefb6d_ffafeb0d","line":163,"range":{"start_line":156,"start_character":7,"end_line":163,"end_character":54},"in_reply_to":"59ac54fb_d3ae3a5c","updated":"2024-09-06 07:19:54.000000000","message":"gah, that\u0027s what I get for rushing... thanks.","commit_id":"2af52caa1241a35fe5c24879bb5250ea2dfbd0ad"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"7199dc9579e74b06e17a15b5685d7eb8317335e0","unresolved":false,"context_lines":[{"line_number":153,"context_line":"                resp.headers[\u0027X-Account-%s\u0027 % postfix] \u003d value"},{"line_number":154,"context_line":""},{"line_number":155,"context_line":"        # Per policy quotas"},{"line_number":156,"context_line":"        for policy in POLICIES:"},{"line_number":157,"context_line":"            postfixes \u003d (\u0027Quota-Bytes-Policy\u0027, \u0027Quota-Count-Policy\u0027)"},{"line_number":158,"context_line":"            for postfix in postfixes:"},{"line_number":159,"context_line":"                value \u003d resp.headers.get(\u0027X-Account-Sysmeta-%s-%d\u0027 % ("},{"line_number":160,"context_line":"                    postfix, policy.idx))"},{"line_number":161,"context_line":"                if value:"},{"line_number":162,"context_line":"                    resp.headers[\u0027X-Account-%s-%s\u0027 % ("},{"line_number":163,"context_line":"                        postfix, policy.name)] \u003d value"},{"line_number":164,"context_line":"        return resp"},{"line_number":165,"context_line":""},{"line_number":166,"context_line":"    @wsgify"}],"source_content_type":"text/x-python","patch_set":4,"id":"eb95a392_b2f1b930","line":163,"range":{"start_line":156,"start_character":7,"end_line":163,"end_character":54},"in_reply_to":"97aefb6d_ffafeb0d","updated":"2024-09-06 07:38:23.000000000","message":"Lol, its always the case. I always rush and then get a pep8 issue... so it always happens 😊\nNice one!","commit_id":"2af52caa1241a35fe5c24879bb5250ea2dfbd0ad"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"dacd6003e914de65052a526501da5ea890318a60","unresolved":true,"context_lines":[{"line_number":114,"context_line":"                raise HTTPBadRequest()"},{"line_number":115,"context_line":"            for idx, quota in new_quotas.items():"},{"line_number":116,"context_line":"                if idx is None:"},{"line_number":117,"context_line":"                    continue  # For legacy reasons, it\u0027s in user meta"},{"line_number":118,"context_line":"                hdr \u003d \u0027X-Account-Sysmeta-%s-Policy-%d\u0027 % (quota_type, idx)"},{"line_number":119,"context_line":"                request.headers[hdr] \u003d quota"},{"line_number":120,"context_line":"        elif any(quota is not None for quota in new_quotas.values()):"}],"source_content_type":"text/x-python","patch_set":5,"id":"c78daa26_3171786a","side":"PARENT","line":117,"updated":"2024-09-06 20:56:21.000000000","message":"Oh, wow! There was a really subtle bug that got introduced here: sending `X-Remove-Account-(Meta-)Quota-Bytes` now *reduces the quota to zero* instead of removing the limit!\n\nIt used to be that we\u0027d just let the `X-Remove-Account-Meta-Quota-Bytes` header through and that\u0027d be enough to clear it, but now that we\u0027re doing this translation, we\u0027re sending *something* and almost certainly it\u0027s the **opposite** of what we actually want.\n\nMeanwhile, the per-policy quotas have always been broken like this ever since I introduced them 😞\n\nhttps://review.opendev.org/c/openstack/swift/+/928476","commit_id":"48e087b1cc7ea564d0f205baf5d625cad34be810"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"305e67df0061b8fcb1ceae805fca5a224a707827","unresolved":true,"context_lines":[{"line_number":137,"context_line":"            # Support old meta format"},{"line_number":138,"context_line":"            legacy_quota_bytes \u003d request.headers.get("},{"line_number":139,"context_line":"                \u0027X-Account-Meta-Quota-Bytes\u0027)"},{"line_number":140,"context_line":"            if legacy_quota_bytes and not \\"},{"line_number":141,"context_line":"                    request.headers.get(\u0027X-Account-Quota-Bytes\u0027):"},{"line_number":142,"context_line":"                request.headers[\u0027X-Account-Quota-Bytes\u0027] \u003d legacy_quota_bytes"},{"line_number":143,"context_line":"            # account request, so we pay attention to the quotas"}],"source_content_type":"text/x-python","patch_set":5,"id":"a3ab9738_780b0a7f","line":140,"range":{"start_line":140,"start_character":15,"end_line":140,"end_character":33},"updated":"2024-09-06 16:06:12.000000000","message":"`... is not None`\n\nI *think* that should fix the tempest failure.\n\nShould we do any similar translation for `X-Remove-Account-Meta-Quota-Bytes`? Maybe better/easier to let it lie -- then we don\u0027t have to think about cases where legacy remove header is sent with a new-style quota...","commit_id":"84ab86f88e28109690c1573c930d2c3b3a782600"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"d6d60b1cf0094f95bc1245dc9a6b858df491a17a","unresolved":true,"context_lines":[{"line_number":113,"context_line":"        for policy in POLICIES:"},{"line_number":114,"context_line":"            tail \u003d \u0027Account-%s-Policy-%s\u0027 % (quota_type, policy.name)"},{"line_number":115,"context_line":"            if request.headers.get(\u0027X-Remove-\u0027 + tail):"},{"line_number":116,"context_line":"                new_quotas[policy.idx] \u003d \u0027\u0027"},{"line_number":117,"context_line":"            else:"},{"line_number":118,"context_line":"                quota \u003d request.headers.pop(\u0027X-\u0027 + tail, None)"},{"line_number":119,"context_line":"                new_quotas[policy.idx] \u003d quota"}],"source_content_type":"text/x-python","patch_set":7,"id":"84696235_e7330b10","line":116,"updated":"2024-09-06 23:47:28.000000000","message":"Oh yeah! so we\u0027ve had this bug for a while then. Good spot!","commit_id":"4eefae2482aeacbf27b58dae44b7f5808bbfa3de"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"d6d60b1cf0094f95bc1245dc9a6b858df491a17a","unresolved":true,"context_lines":[{"line_number":143,"context_line":"                legacy_value \u003d request.headers.get(legacy_header)"},{"line_number":144,"context_line":"                if legacy_value is not None and not \\"},{"line_number":145,"context_line":"                        request.headers.get(new_header):"},{"line_number":146,"context_line":"                    request.headers[new_header] \u003d legacy_value"},{"line_number":147,"context_line":"            # account request, so we pay attention to the quotas"},{"line_number":148,"context_line":"            self.validate_and_translate_quotas(request, \"Quota-Bytes\")"},{"line_number":149,"context_line":"            self.validate_and_translate_quotas(request, \"Quota-Count\")"}],"source_content_type":"text/x-python","patch_set":7,"id":"518c15b7_97741a61","line":146,"updated":"2024-09-06 23:47:28.000000000","message":"Nice, yeah passing the other X-Remove too. Good idea.","commit_id":"4eefae2482aeacbf27b58dae44b7f5808bbfa3de"}],"test/functional/test_account.py":[{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"d6d60b1cf0094f95bc1245dc9a6b858df491a17a","unresolved":true,"context_lines":[{"line_number":929,"context_line":"        if \u0027account_quotas\u0027 not in tf.cluster_info:"},{"line_number":930,"context_line":"            raise SkipTest(\u0027Account quotas are not enabled\u0027)"},{"line_number":931,"context_line":""},{"line_number":932,"context_line":"        self.policies \u003d tf.FunctionalStoragePolicyCollection.from_info()"},{"line_number":933,"context_line":""},{"line_number":934,"context_line":"    def _check_user_cannot_post(self, headers):"},{"line_number":935,"context_line":"        def post(url, token, parsed, conn):"}],"source_content_type":"text/x-python","patch_set":7,"id":"9e4bedba_8b95073d","line":932,"updated":"2024-09-06 23:47:28.000000000","message":"Sweet, nice functional tests.. didn\u0027t think to looks to see if we had these let alone write some. Nice work Tim. I guess this is a good way to test the old remove \u003d 0 bug.\nGood thinking!","commit_id":"4eefae2482aeacbf27b58dae44b7f5808bbfa3de"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"d6d60b1cf0094f95bc1245dc9a6b858df491a17a","unresolved":true,"context_lines":[{"line_number":1015,"context_line":""},{"line_number":1016,"context_line":"    def test_admin_can_set_and_remove_user_quota(self):"},{"line_number":1017,"context_line":"        self._test_admin_can_set_and_remove_user_quota("},{"line_number":1018,"context_line":"            \u0027X-Account-Quota-Bytes\u0027)"},{"line_number":1019,"context_line":""},{"line_number":1020,"context_line":"    def test_admin_can_set_and_remove_user_policy_quota(self):"},{"line_number":1021,"context_line":"        if tf.skip_if_no_reseller_admin:"}],"source_content_type":"text/x-python","patch_set":7,"id":"ed84826d_05a7450e","line":1018,"updated":"2024-09-06 23:47:28.000000000","message":"Maybe we should loop this and also look at `X-Account-Quota-Count` header too.","commit_id":"4eefae2482aeacbf27b58dae44b7f5808bbfa3de"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"d6d60b1cf0094f95bc1245dc9a6b858df491a17a","unresolved":true,"context_lines":[{"line_number":1021,"context_line":"        if tf.skip_if_no_reseller_admin:"},{"line_number":1022,"context_line":"            raise SkipTest(\u0027No admin user configured\u0027)"},{"line_number":1023,"context_line":"        policy \u003d self.policies.select()[\u0027name\u0027]"},{"line_number":1024,"context_line":"        quota_header \u003d \u0027X-Account-Quota-Bytes-Policy-\u0027 + policy"},{"line_number":1025,"context_line":""},{"line_number":1026,"context_line":"        def get_current_quota():"},{"line_number":1027,"context_line":"            def head(url, token, parsed, conn):"}],"source_content_type":"text/x-python","patch_set":7,"id":"dafe3c48_a492e58f","line":1024,"updated":"2024-09-06 23:47:28.000000000","message":"`X-Account-Quota-Count-Policy-\u003cpolname\u003e` here too?","commit_id":"4eefae2482aeacbf27b58dae44b7f5808bbfa3de"}],"test/unit/common/middleware/test_account_quotas.py":[{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"78638794b57e0d96551ea64273e9f544cf4dc231","unresolved":true,"context_lines":[{"line_number":219,"context_line":"                            headers\u003d{\u0027x-auth-token\u0027: \u0027secret\u0027},"},{"line_number":220,"context_line":"                            environ\u003d{\u0027swift.cache\u0027: cache})"},{"line_number":221,"context_line":"        res \u003d req.get_response(app)"},{"line_number":222,"context_line":"        self.assertEqual(res.status_int, 200)"},{"line_number":223,"context_line":""},{"line_number":224,"context_line":"    def test_exceed_quota_bytes_on_empty_account_not_authorized(self):"},{"line_number":225,"context_line":"        self.app.register(\u0027HEAD\u0027, \u0027/v1/a\u0027, HTTPOk, {"}],"source_content_type":"text/x-python","patch_set":2,"id":"6582ae2f_e54d88ee","line":222,"updated":"2024-07-22 00:41:10.000000000","message":"Maybe we want a few tests that still use the old x-account-meta-quota-bytes to show that it still works if the \u0027x-account-sysmeta-quota-bytes\u0027 isn\u0027t used. And maybe one that has both set and show that the sysmeta wins.","commit_id":"e8f9661f6840ea7e2994880d4119caca31ff8be4"},{"author":{"_account_id":22042,"name":"Chris Smart","email":"distroguy@gmail.com","username":"csmart"},"change_message_id":"adb9cd893cc8074358896a6d4875f0ed5b201eba","unresolved":false,"context_lines":[{"line_number":219,"context_line":"                            headers\u003d{\u0027x-auth-token\u0027: \u0027secret\u0027},"},{"line_number":220,"context_line":"                            environ\u003d{\u0027swift.cache\u0027: cache})"},{"line_number":221,"context_line":"        res \u003d req.get_response(app)"},{"line_number":222,"context_line":"        self.assertEqual(res.status_int, 200)"},{"line_number":223,"context_line":""},{"line_number":224,"context_line":"    def test_exceed_quota_bytes_on_empty_account_not_authorized(self):"},{"line_number":225,"context_line":"        self.app.register(\u0027HEAD\u0027, \u0027/v1/a\u0027, HTTPOk, {"}],"source_content_type":"text/x-python","patch_set":2,"id":"023c9fd7_83d4c8da","line":222,"in_reply_to":"6582ae2f_e54d88ee","updated":"2024-09-06 05:53:47.000000000","message":"I\u0027ve added a number of tests that I think should cover it...","commit_id":"e8f9661f6840ea7e2994880d4119caca31ff8be4"},{"author":{"_account_id":37085,"name":"Daanish Khan","display_name":"Daanish Khan","email":"daanishk@andrew.cmu.edu","username":"daanishk"},"change_message_id":"c0613acac3c683d8a5692ad18c39dd13e4b6ebbd","unresolved":true,"context_lines":[{"line_number":431,"context_line":"        self.assertEqual(self.app.calls_with_headers, ["},{"line_number":432,"context_line":"            (\u0027POST\u0027, \u0027/v1/a\u0027, {\u0027Host\u0027: \u0027localhost:80\u0027,"},{"line_number":433,"context_line":"                               \u0027X-Account-Quota-Bytes\u0027: \u0027100\u0027,"},{"line_number":434,"context_line":"                               \u0027X-Account-Sysmeta-Quota-Bytes\u0027: \u0027100\u0027})])"},{"line_number":435,"context_line":""},{"line_number":436,"context_line":"    @patch_policies"},{"line_number":437,"context_line":"    def test_valid_policy_quota_reseller(self):"}],"source_content_type":"text/x-python","patch_set":2,"id":"6dec5203_325995fc","line":434,"updated":"2024-07-20 12:30:05.000000000","message":"This doesn\u0027t look entirely right, will look further into it.","commit_id":"e8f9661f6840ea7e2994880d4119caca31ff8be4"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"78638794b57e0d96551ea64273e9f544cf4dc231","unresolved":true,"context_lines":[{"line_number":431,"context_line":"        self.assertEqual(self.app.calls_with_headers, ["},{"line_number":432,"context_line":"            (\u0027POST\u0027, \u0027/v1/a\u0027, {\u0027Host\u0027: \u0027localhost:80\u0027,"},{"line_number":433,"context_line":"                               \u0027X-Account-Quota-Bytes\u0027: \u0027100\u0027,"},{"line_number":434,"context_line":"                               \u0027X-Account-Sysmeta-Quota-Bytes\u0027: \u0027100\u0027})])"},{"line_number":435,"context_line":""},{"line_number":436,"context_line":"    @patch_policies"},{"line_number":437,"context_line":"    def test_valid_policy_quota_reseller(self):"}],"source_content_type":"text/x-python","patch_set":2,"id":"f25544ae_45953a35","line":434,"in_reply_to":"6dec5203_325995fc","updated":"2024-07-22 00:41:10.000000000","message":"kk, dig in. We probably don\u0027t pop the qouta out of the resp headers so it\u0027s still here. Does the policy code path pop it?","commit_id":"e8f9661f6840ea7e2994880d4119caca31ff8be4"},{"author":{"_account_id":22042,"name":"Chris Smart","email":"distroguy@gmail.com","username":"csmart"},"change_message_id":"adb9cd893cc8074358896a6d4875f0ed5b201eba","unresolved":false,"context_lines":[{"line_number":431,"context_line":"        self.assertEqual(self.app.calls_with_headers, ["},{"line_number":432,"context_line":"            (\u0027POST\u0027, \u0027/v1/a\u0027, {\u0027Host\u0027: \u0027localhost:80\u0027,"},{"line_number":433,"context_line":"                               \u0027X-Account-Quota-Bytes\u0027: \u0027100\u0027,"},{"line_number":434,"context_line":"                               \u0027X-Account-Sysmeta-Quota-Bytes\u0027: \u0027100\u0027})])"},{"line_number":435,"context_line":""},{"line_number":436,"context_line":"    @patch_policies"},{"line_number":437,"context_line":"    def test_valid_policy_quota_reseller(self):"}],"source_content_type":"text/x-python","patch_set":2,"id":"6bae9391_597681e8","line":434,"in_reply_to":"f25544ae_45953a35","updated":"2024-09-06 05:53:47.000000000","message":"I think this is OK as it\u0027s dropped in the gatekeeper before being returned to the client.","commit_id":"e8f9661f6840ea7e2994880d4119caca31ff8be4"},{"author":{"_account_id":37085,"name":"Daanish Khan","display_name":"Daanish Khan","email":"daanishk@andrew.cmu.edu","username":"daanishk"},"change_message_id":"c0613acac3c683d8a5692ad18c39dd13e4b6ebbd","unresolved":true,"context_lines":[{"line_number":773,"context_line":"        self.assertEqual(self.app.calls_with_headers, ["},{"line_number":774,"context_line":"            (\u0027POST\u0027, \u0027/v1/a\u0027, {\u0027Host\u0027: \u0027localhost:80\u0027,"},{"line_number":775,"context_line":"                               \u0027X-Account-Quota-Count\u0027: \u0027100\u0027,"},{"line_number":776,"context_line":"                               \u0027X-Account-Sysmeta-Quota-Count\u0027: \u0027100\u0027})])"},{"line_number":777,"context_line":""},{"line_number":778,"context_line":"    @patch_policies"},{"line_number":779,"context_line":"    def test_valid_policy_count_quota_reseller(self):"}],"source_content_type":"text/x-python","patch_set":2,"id":"7f1fccb4_15095dc2","line":776,"updated":"2024-07-20 12:30:05.000000000","message":"Same for this :/","commit_id":"e8f9661f6840ea7e2994880d4119caca31ff8be4"},{"author":{"_account_id":22042,"name":"Chris Smart","email":"distroguy@gmail.com","username":"csmart"},"change_message_id":"adb9cd893cc8074358896a6d4875f0ed5b201eba","unresolved":false,"context_lines":[{"line_number":773,"context_line":"        self.assertEqual(self.app.calls_with_headers, ["},{"line_number":774,"context_line":"            (\u0027POST\u0027, \u0027/v1/a\u0027, {\u0027Host\u0027: \u0027localhost:80\u0027,"},{"line_number":775,"context_line":"                               \u0027X-Account-Quota-Count\u0027: \u0027100\u0027,"},{"line_number":776,"context_line":"                               \u0027X-Account-Sysmeta-Quota-Count\u0027: \u0027100\u0027})])"},{"line_number":777,"context_line":""},{"line_number":778,"context_line":"    @patch_policies"},{"line_number":779,"context_line":"    def test_valid_policy_count_quota_reseller(self):"}],"source_content_type":"text/x-python","patch_set":2,"id":"e2c6caa0_f2a3b665","line":776,"in_reply_to":"7f1fccb4_15095dc2","updated":"2024-09-06 05:53:47.000000000","message":"I think this is OK too.","commit_id":"e8f9661f6840ea7e2994880d4119caca31ff8be4"}]}
