)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":29244,"name":"Gregory Thiemonge","email":"gthiemon@redhat.com","username":"gthiemonge"},"change_message_id":"4c34712f235c8fa2627d110724605e46332f1989","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":13,"id":"06840461_b85262f0","updated":"2024-07-09 07:50:49.000000000","message":"Additional question:\nare there some restrictions when mixing different rule metrics?","commit_id":"2bac2f59abb1658162a1efbecb93b4cb53dcefed"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"08282d04071e757ae3aa4d97e7230bb822297fc0","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":13,"id":"06febc50_d4dffbd6","updated":"2024-07-10 03:39:06.000000000","message":"I have a couple of comments I think we should discuss.","commit_id":"2bac2f59abb1658162a1efbecb93b4cb53dcefed"},{"author":{"_account_id":34429,"name":"Tom Weininger","email":"dienste@weinimo.de","username":"tweining"},"change_message_id":"5594a20ab2ff851d64360bf4426815217bff779b","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":13,"id":"20599064_b6f9d77e","in_reply_to":"06840461_b85262f0","updated":"2024-07-09 09:48:00.000000000","message":"We should do some checks during validation. E.g. when there is a rule for the `/foo` URL path already, we should not allow to add a new rule with the same path via `POST` for instance. Users would need to use `PUT` instead, or `DELETE` the other rule first.\n\nApart from such plausibility checks, I can\u0027t see why we should restrict mixing different rule metrics. If a certain driver cannot apply a certain rule for whatever reason (not implemented or driver limitations), he should raise an error which will cause an HTTP error status code in the response.\n\nDid you think of anything specific?","commit_id":"2bac2f59abb1658162a1efbecb93b4cb53dcefed"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"785ab1a9f461fdce04e37f6edfdbafc26d3b3c15","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":21,"id":"89018792_cda55b42","updated":"2024-08-08 23:21:27.000000000","message":"I think we should bring back the policy and rule split here.\n\nThe policy should define the action, the rules define the criteria for match.\nA policy with more than one rule will logically AND the rules to form a match.\nMultiple policies on a single listener would logically OR each other.\n\nFor example, maybe you want to create a rate limit policy that silently drops requests that exceed both a requests limit (say 100) and a kbytes limit (say 1000).\nYou would add a policy to the listener with an action of silent drop, and two rules (criteria) one for requests and one for kbytes.\nThen you might also want to add a policy to that listener that politely rejects the request when the requests exceed 90.\n\nI think being able to create policies with multiple rules will also be useful as we add additional metrics or criteria in future features.","commit_id":"2fb28093ef47899683c1d6aef2a20fe451ad208c"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"21714b51570bb6e84a1e771821940a40a1655d44","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":22,"id":"8f60d0dd_bc70415a","updated":"2024-08-14 17:30:02.000000000","message":"A couple of questions on the update.","commit_id":"76532cc24ccf9baacdf7cf37762087d7c36738eb"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"523de548c3c9a38f28aaa079a1f85592f9775bd9","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":23,"id":"9488a515_f8943e50","updated":"2024-08-21 23:34:54.000000000","message":"LGTM","commit_id":"0aef474cd9119466241eb55ddcf50066e52cf600"}],"specs/version15.0/rate_limiting.rst":[{"author":{"_account_id":34429,"name":"Tom Weininger","email":"dienste@weinimo.de","username":"tweining"},"change_message_id":"501e98caf3a96d0124be46537fb40e8e38ad9f0c","unresolved":true,"context_lines":[{"line_number":23,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":24,"context_line":"Both the data model and the REST API will need to be extended."},{"line_number":25,"context_line":"Users will be able to"},{"line_number":26,"context_line":"configure rate limiting as part of listener configuration."},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"Rate limiting can be implemented in various ways using different metrics for"},{"line_number":29,"context_line":"different protocols. Hence, this specification tries to be as flexible"}],"source_content_type":"text/x-rst","patch_set":10,"id":"1ae57bf2_53b9fea0","line":26,"range":{"start_line":26,"start_character":27,"end_line":26,"end_character":43},"updated":"2024-07-03 16:37:35.000000000","message":"TODO update","commit_id":"fdbd37bcee105bf397840eca0c4306d5e3b59931"},{"author":{"_account_id":34429,"name":"Tom Weininger","email":"dienste@weinimo.de","username":"tweining"},"change_message_id":"2558216f06c466695fcbacdec349338db5c4495f","unresolved":false,"context_lines":[{"line_number":23,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":24,"context_line":"Both the data model and the REST API will need to be extended."},{"line_number":25,"context_line":"Users will be able to"},{"line_number":26,"context_line":"configure rate limiting as part of listener configuration."},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"Rate limiting can be implemented in various ways using different metrics for"},{"line_number":29,"context_line":"different protocols. Hence, this specification tries to be as flexible"}],"source_content_type":"text/x-rst","patch_set":10,"id":"1527ac0a_365246ad","line":26,"range":{"start_line":26,"start_character":27,"end_line":26,"end_character":43},"in_reply_to":"1ae57bf2_53b9fea0","updated":"2024-07-08 13:43:37.000000000","message":"Done","commit_id":"fdbd37bcee105bf397840eca0c4306d5e3b59931"},{"author":{"_account_id":34429,"name":"Tom Weininger","email":"dienste@weinimo.de","username":"tweining"},"change_message_id":"501e98caf3a96d0124be46537fb40e8e38ad9f0c","unresolved":true,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":"Rate limiting can be implemented in various ways using different metrics for"},{"line_number":29,"context_line":"different protocols. Hence, this specification tries to be as flexible"},{"line_number":30,"context_line":"as possible while keeping the listener API simple. Drivers may choose to"},{"line_number":31,"context_line":"implement only a subset of the possible variants, or even none of them."},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"The algorithm used for rate limiting is up to the driver\u0027s implementation"}],"source_content_type":"text/x-rst","patch_set":10,"id":"c872dafd_7342a28a","line":30,"range":{"start_line":30,"start_character":30,"end_line":30,"end_character":38},"updated":"2024-07-03 16:37:35.000000000","message":"TODO update","commit_id":"fdbd37bcee105bf397840eca0c4306d5e3b59931"},{"author":{"_account_id":34429,"name":"Tom Weininger","email":"dienste@weinimo.de","username":"tweining"},"change_message_id":"2558216f06c466695fcbacdec349338db5c4495f","unresolved":false,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":"Rate limiting can be implemented in various ways using different metrics for"},{"line_number":29,"context_line":"different protocols. Hence, this specification tries to be as flexible"},{"line_number":30,"context_line":"as possible while keeping the listener API simple. Drivers may choose to"},{"line_number":31,"context_line":"implement only a subset of the possible variants, or even none of them."},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"The algorithm used for rate limiting is up to the driver\u0027s implementation"}],"source_content_type":"text/x-rst","patch_set":10,"id":"e09c8bce_84a86181","line":30,"range":{"start_line":30,"start_character":30,"end_line":30,"end_character":38},"in_reply_to":"c872dafd_7342a28a","updated":"2024-07-08 13:43:37.000000000","message":"Done","commit_id":"fdbd37bcee105bf397840eca0c4306d5e3b59931"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"08282d04071e757ae3aa4d97e7230bb822297fc0","unresolved":true,"context_lines":[{"line_number":14,"context_line":"Problem description"},{"line_number":15,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":16,"context_line":"Without rate limiting, malicious clients and bots,"},{"line_number":17,"context_line":"may be able to attack a server by flooding it with traffic or requests."},{"line_number":18,"context_line":"Rate limiting can help to limit the amount of resources that"},{"line_number":19,"context_line":"single clients can allocate on server side and therefor"},{"line_number":20,"context_line":"can help to mitigate DoS attacks."}],"source_content_type":"text/x-rst","patch_set":13,"id":"0514ac21_282e22f3","line":17,"updated":"2024-07-10 03:39:06.000000000","message":"How does this interact with the existing connection rate limiting in Octavia (i.e. the connection limit API)?","commit_id":"2bac2f59abb1658162a1efbecb93b4cb53dcefed"},{"author":{"_account_id":34429,"name":"Tom Weininger","email":"dienste@weinimo.de","username":"tweining"},"change_message_id":"022b82d88b1b15f2eeda918f1899df709d2e494d","unresolved":true,"context_lines":[{"line_number":14,"context_line":"Problem description"},{"line_number":15,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":16,"context_line":"Without rate limiting, malicious clients and bots,"},{"line_number":17,"context_line":"may be able to attack a server by flooding it with traffic or requests."},{"line_number":18,"context_line":"Rate limiting can help to limit the amount of resources that"},{"line_number":19,"context_line":"single clients can allocate on server side and therefor"},{"line_number":20,"context_line":"can help to mitigate DoS attacks."}],"source_content_type":"text/x-rst","patch_set":13,"id":"d65e08b9_d08eec67","line":17,"in_reply_to":"0514ac21_282e22f3","updated":"2024-07-10 15:03:26.000000000","message":"I guess they need to co-exist. That means rate limiting does not interact with the existing connection-limit setting.","commit_id":"2bac2f59abb1658162a1efbecb93b4cb53dcefed"},{"author":{"_account_id":34429,"name":"Tom Weininger","email":"dienste@weinimo.de","username":"tweining"},"change_message_id":"772f3db46fcdd12b00010d75f57df978f5ab74ea","unresolved":false,"context_lines":[{"line_number":14,"context_line":"Problem description"},{"line_number":15,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":16,"context_line":"Without rate limiting, malicious clients and bots,"},{"line_number":17,"context_line":"may be able to attack a server by flooding it with traffic or requests."},{"line_number":18,"context_line":"Rate limiting can help to limit the amount of resources that"},{"line_number":19,"context_line":"single clients can allocate on server side and therefor"},{"line_number":20,"context_line":"can help to mitigate DoS attacks."}],"source_content_type":"text/x-rst","patch_set":13,"id":"55900b0a_cf20d811","line":17,"in_reply_to":"d65e08b9_d08eec67","updated":"2024-08-21 12:22:37.000000000","message":"Done","commit_id":"2bac2f59abb1658162a1efbecb93b4cb53dcefed"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"08282d04071e757ae3aa4d97e7230bb822297fc0","unresolved":true,"context_lines":[{"line_number":45,"context_line":"and configured using the listener API."},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"Splitting the configuration between two different APIs may confuse users,"},{"line_number":48,"context_line":"however. Using a separate API for rate limiting seems like the cleaner"},{"line_number":49,"context_line":"approach."},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"Data model impact"}],"source_content_type":"text/x-rst","patch_set":13,"id":"eb9e8a48_ebbeba6c","line":48,"updated":"2024-07-10 03:39:06.000000000","message":"Totally agree with this","commit_id":"2bac2f59abb1658162a1efbecb93b4cb53dcefed"},{"author":{"_account_id":34429,"name":"Tom Weininger","email":"dienste@weinimo.de","username":"tweining"},"change_message_id":"022b82d88b1b15f2eeda918f1899df709d2e494d","unresolved":false,"context_lines":[{"line_number":45,"context_line":"and configured using the listener API."},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"Splitting the configuration between two different APIs may confuse users,"},{"line_number":48,"context_line":"however. Using a separate API for rate limiting seems like the cleaner"},{"line_number":49,"context_line":"approach."},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"Data model impact"}],"source_content_type":"text/x-rst","patch_set":13,"id":"15a4e1a5_f58d879b","line":48,"in_reply_to":"eb9e8a48_ebbeba6c","updated":"2024-07-10 15:03:26.000000000","message":"Acknowledged","commit_id":"2bac2f59abb1658162a1efbecb93b4cb53dcefed"},{"author":{"_account_id":29244,"name":"Gregory Thiemonge","email":"gthiemon@redhat.com","username":"gthiemonge"},"change_message_id":"b4f63ecc2a970790f42dca0ded66018f72d11484","unresolved":true,"context_lines":[{"line_number":50,"context_line":""},{"line_number":51,"context_line":"Data model impact"},{"line_number":52,"context_line":"-----------------"},{"line_number":53,"context_line":"A new `RateLimitPolicy` model class will be added. It will have the attributes"},{"line_number":54,"context_line":"id, name, description, rules,"},{"line_number":55,"context_line":"listener_id, listener, enabled, provisioning_status,"},{"line_number":56,"context_line":"project_id, created_at, updated_at, tags. The *rules* attribute forms a"}],"source_content_type":"text/x-rst","patch_set":13,"id":"ccd65822_44139e70","line":53,"range":{"start_line":53,"start_character":7,"end_line":53,"end_character":22},"updated":"2024-07-09 07:48:18.000000000","message":"are multiple RateLimitPolicies allowed for a single listener?","commit_id":"2bac2f59abb1658162a1efbecb93b4cb53dcefed"},{"author":{"_account_id":34429,"name":"Tom Weininger","email":"dienste@weinimo.de","username":"tweining"},"change_message_id":"772f3db46fcdd12b00010d75f57df978f5ab74ea","unresolved":false,"context_lines":[{"line_number":50,"context_line":""},{"line_number":51,"context_line":"Data model impact"},{"line_number":52,"context_line":"-----------------"},{"line_number":53,"context_line":"A new `RateLimitPolicy` model class will be added. It will have the attributes"},{"line_number":54,"context_line":"id, name, description, rules,"},{"line_number":55,"context_line":"listener_id, listener, enabled, provisioning_status,"},{"line_number":56,"context_line":"project_id, created_at, updated_at, tags. The *rules* attribute forms a"}],"source_content_type":"text/x-rst","patch_set":13,"id":"0337db79_2f318646","line":53,"range":{"start_line":53,"start_character":7,"end_line":53,"end_character":22},"in_reply_to":"7075ea0c_85b1129a","updated":"2024-08-21 12:22:37.000000000","message":"The current version of the proposal allows to link multiple policies to a single listener. That seems to cover the use case you describe.","commit_id":"2bac2f59abb1658162a1efbecb93b4cb53dcefed"},{"author":{"_account_id":34429,"name":"Tom Weininger","email":"dienste@weinimo.de","username":"tweining"},"change_message_id":"4a5b62295d4316ba8040d348f043d6f292e6eee5","unresolved":true,"context_lines":[{"line_number":50,"context_line":""},{"line_number":51,"context_line":"Data model impact"},{"line_number":52,"context_line":"-----------------"},{"line_number":53,"context_line":"A new `RateLimitPolicy` model class will be added. It will have the attributes"},{"line_number":54,"context_line":"id, name, description, rules,"},{"line_number":55,"context_line":"listener_id, listener, enabled, provisioning_status,"},{"line_number":56,"context_line":"project_id, created_at, updated_at, tags. The *rules* attribute forms a"}],"source_content_type":"text/x-rst","patch_set":13,"id":"c424fc5d_f50c7d29","line":53,"range":{"start_line":53,"start_character":7,"end_line":53,"end_character":22},"in_reply_to":"a8bb3a4c_369245d4","updated":"2024-07-15 11:40:00.000000000","message":"I changed my mind. One policy per listener should be enough.","commit_id":"2bac2f59abb1658162a1efbecb93b4cb53dcefed"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"ce944ba4bea2aee3474c8142445ef71056f4c196","unresolved":true,"context_lines":[{"line_number":50,"context_line":""},{"line_number":51,"context_line":"Data model impact"},{"line_number":52,"context_line":"-----------------"},{"line_number":53,"context_line":"A new `RateLimitPolicy` model class will be added. It will have the attributes"},{"line_number":54,"context_line":"id, name, description, rules,"},{"line_number":55,"context_line":"listener_id, listener, enabled, provisioning_status,"},{"line_number":56,"context_line":"project_id, created_at, updated_at, tags. The *rules* attribute forms a"}],"source_content_type":"text/x-rst","patch_set":13,"id":"7075ea0c_85b1129a","line":53,"range":{"start_line":53,"start_character":7,"end_line":53,"end_character":22},"in_reply_to":"c424fc5d_f50c7d29","updated":"2024-07-16 01:53:00.000000000","message":"This is a tricky one. I can imagine a scenario where a certain set of rules would lead to a \"DROP\" action, but another set of rules would lead to a \"QUEUE\".\nI.e. connection rate may lead to drop, but request rate lead to queue.","commit_id":"2bac2f59abb1658162a1efbecb93b4cb53dcefed"},{"author":{"_account_id":34429,"name":"Tom Weininger","email":"dienste@weinimo.de","username":"tweining"},"change_message_id":"5594a20ab2ff851d64360bf4426815217bff779b","unresolved":true,"context_lines":[{"line_number":50,"context_line":""},{"line_number":51,"context_line":"Data model impact"},{"line_number":52,"context_line":"-----------------"},{"line_number":53,"context_line":"A new `RateLimitPolicy` model class will be added. It will have the attributes"},{"line_number":54,"context_line":"id, name, description, rules,"},{"line_number":55,"context_line":"listener_id, listener, enabled, provisioning_status,"},{"line_number":56,"context_line":"project_id, created_at, updated_at, tags. The *rules* attribute forms a"}],"source_content_type":"text/x-rst","patch_set":13,"id":"a8bb3a4c_369245d4","line":53,"range":{"start_line":53,"start_character":7,"end_line":53,"end_character":22},"in_reply_to":"ccd65822_44139e70","updated":"2024-07-09 09:48:00.000000000","message":"That was the idea. I\u0027m not sure if it is really needed.","commit_id":"2bac2f59abb1658162a1efbecb93b4cb53dcefed"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"08282d04071e757ae3aa4d97e7230bb822297fc0","unresolved":true,"context_lines":[{"line_number":58,"context_line":""},{"line_number":59,"context_line":"The new `RateLimitRule` model class will be used to define a specific"},{"line_number":60,"context_line":"rate limiting rule. Its attributes are *id* (string), *project_id* (string),"},{"line_number":61,"context_line":"*metric* (string), *threshold* (string), *interval* (integer)."},{"line_number":62,"context_line":"*metric* is a string and can be either of *REQUESTS*, *REQUESTS_PER_URL*,"},{"line_number":63,"context_line":"*CONCURRENT_CONNECTIONS*, *KBYTES*, *PACKETS*. *interval* denotes the time"},{"line_number":64,"context_line":"interval in seconds in which the metric should be measured."}],"source_content_type":"text/x-rst","patch_set":13,"id":"3fc9f4ec_7722b9af","line":61,"updated":"2024-07-10 03:39:06.000000000","message":"metric should be an enum and not a free form string.","commit_id":"2bac2f59abb1658162a1efbecb93b4cb53dcefed"},{"author":{"_account_id":34429,"name":"Tom Weininger","email":"dienste@weinimo.de","username":"tweining"},"change_message_id":"022b82d88b1b15f2eeda918f1899df709d2e494d","unresolved":false,"context_lines":[{"line_number":58,"context_line":""},{"line_number":59,"context_line":"The new `RateLimitRule` model class will be used to define a specific"},{"line_number":60,"context_line":"rate limiting rule. Its attributes are *id* (string), *project_id* (string),"},{"line_number":61,"context_line":"*metric* (string), *threshold* (string), *interval* (integer)."},{"line_number":62,"context_line":"*metric* is a string and can be either of *REQUESTS*, *REQUESTS_PER_URL*,"},{"line_number":63,"context_line":"*CONCURRENT_CONNECTIONS*, *KBYTES*, *PACKETS*. *interval* denotes the time"},{"line_number":64,"context_line":"interval in seconds in which the metric should be measured."}],"source_content_type":"text/x-rst","patch_set":13,"id":"484a9969_b7d7aac4","line":61,"in_reply_to":"3fc9f4ec_7722b9af","updated":"2024-07-10 15:03:26.000000000","message":"Done","commit_id":"2bac2f59abb1658162a1efbecb93b4cb53dcefed"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"9d121606d63fa0e8e684365323abd2ac0811e620","unresolved":false,"context_lines":[{"line_number":58,"context_line":""},{"line_number":59,"context_line":"The new `RateLimitRule` model class will be used to define a specific"},{"line_number":60,"context_line":"rate limiting rule. Its attributes are *id* (string), *project_id* (string),"},{"line_number":61,"context_line":"*metric* (string), *threshold* (string), *interval* (integer)."},{"line_number":62,"context_line":"*metric* is a string and can be either of *REQUESTS*, *REQUESTS_PER_URL*,"},{"line_number":63,"context_line":"*CONCURRENT_CONNECTIONS*, *KBYTES*, *PACKETS*. *interval* denotes the time"},{"line_number":64,"context_line":"interval in seconds in which the metric should be measured."}],"source_content_type":"text/x-rst","patch_set":13,"id":"1c733057_d1ea363b","line":61,"in_reply_to":"484a9969_b7d7aac4","updated":"2024-08-21 23:52:52.000000000","message":"I was thinking of an enum in the API type validation, so really this comment should be in the api changes section.\nThough we could do enums in the data model, we have not done so to date and I think that could be a separate investigation/patch chain.","commit_id":"2bac2f59abb1658162a1efbecb93b4cb53dcefed"},{"author":{"_account_id":29244,"name":"Gregory Thiemonge","email":"gthiemon@redhat.com","username":"gthiemonge"},"change_message_id":"b4f63ecc2a970790f42dca0ded66018f72d11484","unresolved":true,"context_lines":[{"line_number":60,"context_line":"rate limiting rule. Its attributes are *id* (string), *project_id* (string),"},{"line_number":61,"context_line":"*metric* (string), *threshold* (string), *interval* (integer)."},{"line_number":62,"context_line":"*metric* is a string and can be either of *REQUESTS*, *REQUESTS_PER_URL*,"},{"line_number":63,"context_line":"*CONCURRENT_CONNECTIONS*, *KBYTES*, *PACKETS*. *interval* denotes the time"},{"line_number":64,"context_line":"interval in seconds in which the metric should be measured."},{"line_number":65,"context_line":"*threshold* defines the threshold at which the rate should be limited."},{"line_number":66,"context_line":"Then using the *REQUESTS_PER_URL* *metric*, the *threshold* value must"}],"source_content_type":"text/x-rst","patch_set":13,"id":"e310c32e_d9815993","line":63,"range":{"start_line":63,"start_character":1,"end_line":63,"end_character":23},"updated":"2024-07-09 07:48:18.000000000","message":"I think CONCURRENT_CONNECTIONS is already addressed by the \"connection-limit\" parameter in the listener API","commit_id":"2bac2f59abb1658162a1efbecb93b4cb53dcefed"},{"author":{"_account_id":34429,"name":"Tom Weininger","email":"dienste@weinimo.de","username":"tweining"},"change_message_id":"022b82d88b1b15f2eeda918f1899df709d2e494d","unresolved":false,"context_lines":[{"line_number":60,"context_line":"rate limiting rule. Its attributes are *id* (string), *project_id* (string),"},{"line_number":61,"context_line":"*metric* (string), *threshold* (string), *interval* (integer)."},{"line_number":62,"context_line":"*metric* is a string and can be either of *REQUESTS*, *REQUESTS_PER_URL*,"},{"line_number":63,"context_line":"*CONCURRENT_CONNECTIONS*, *KBYTES*, *PACKETS*. *interval* denotes the time"},{"line_number":64,"context_line":"interval in seconds in which the metric should be measured."},{"line_number":65,"context_line":"*threshold* defines the threshold at which the rate should be limited."},{"line_number":66,"context_line":"Then using the *REQUESTS_PER_URL* *metric*, the *threshold* value must"}],"source_content_type":"text/x-rst","patch_set":13,"id":"7bbba5d1_bfc48897","line":63,"range":{"start_line":63,"start_character":1,"end_line":63,"end_character":23},"in_reply_to":"e310c32e_d9815993","updated":"2024-07-10 15:03:26.000000000","message":"Thanks. Removed.","commit_id":"2bac2f59abb1658162a1efbecb93b4cb53dcefed"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"08282d04071e757ae3aa4d97e7230bb822297fc0","unresolved":true,"context_lines":[{"line_number":64,"context_line":"interval in seconds in which the metric should be measured."},{"line_number":65,"context_line":"*threshold* defines the threshold at which the rate should be limited."},{"line_number":66,"context_line":"Then using the *REQUESTS_PER_URL* *metric*, the *threshold* value must"},{"line_number":67,"context_line":"consist the URL path, followed by a space and the threshold, e.g."},{"line_number":68,"context_line":"*/path_a 50*."},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"REST API impact"}],"source_content_type":"text/x-rst","patch_set":13,"id":"16251bfa_5bef6797","line":67,"updated":"2024-07-10 03:39:06.000000000","message":"I would rather see this as separate API fields. The URL param can be required for certain methods, and None for others.\nThis can be a parameter that is allowed multiple times (list of params).","commit_id":"2bac2f59abb1658162a1efbecb93b4cb53dcefed"},{"author":{"_account_id":34429,"name":"Tom Weininger","email":"dienste@weinimo.de","username":"tweining"},"change_message_id":"022b82d88b1b15f2eeda918f1899df709d2e494d","unresolved":false,"context_lines":[{"line_number":64,"context_line":"interval in seconds in which the metric should be measured."},{"line_number":65,"context_line":"*threshold* defines the threshold at which the rate should be limited."},{"line_number":66,"context_line":"Then using the *REQUESTS_PER_URL* *metric*, the *threshold* value must"},{"line_number":67,"context_line":"consist the URL path, followed by a space and the threshold, e.g."},{"line_number":68,"context_line":"*/path_a 50*."},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"REST API impact"}],"source_content_type":"text/x-rst","patch_set":13,"id":"91b2177d_d7905b95","line":67,"in_reply_to":"16251bfa_5bef6797","updated":"2024-07-10 15:03:26.000000000","message":"Okay, I\u0027m fine with that.","commit_id":"2bac2f59abb1658162a1efbecb93b4cb53dcefed"},{"author":{"_account_id":34429,"name":"Tom Weininger","email":"dienste@weinimo.de","username":"tweining"},"change_message_id":"022b82d88b1b15f2eeda918f1899df709d2e494d","unresolved":false,"context_lines":[{"line_number":64,"context_line":"interval in seconds in which the metric should be measured."},{"line_number":65,"context_line":"*threshold* defines the threshold at which the rate should be limited."},{"line_number":66,"context_line":"Then using the *REQUESTS_PER_URL* *metric*, the *threshold* value must"},{"line_number":67,"context_line":"consist the URL path, followed by a space and the threshold, e.g."},{"line_number":68,"context_line":"*/path_a 50*."},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"REST API impact"}],"source_content_type":"text/x-rst","patch_set":13,"id":"98207018_e8c8dc13","line":67,"in_reply_to":"16251bfa_5bef6797","updated":"2024-07-10 15:03:26.000000000","message":"That is fine by me. In that case the threshold field can be an integer.","commit_id":"2bac2f59abb1658162a1efbecb93b4cb53dcefed"},{"author":{"_account_id":29244,"name":"Gregory Thiemonge","email":"gthiemon@redhat.com","username":"gthiemonge"},"change_message_id":"b4f63ecc2a970790f42dca0ded66018f72d11484","unresolved":true,"context_lines":[{"line_number":77,"context_line":"The request of the *POST /v2/lbaas/ratelimitpolicies*"},{"line_number":78,"context_line":"and *PUT /v2/lbaas/ratelimitpolicies/{policy_id}* methods of the"},{"line_number":79,"context_line":"*Rate Limit Policy* API should have the attributes"},{"line_number":80,"context_line":"*name* (Optional), *description* (Optional), *listener_id*,"},{"line_number":81,"context_line":"*enabled* (Optional), *project_id* (Optional), *tags* (Optional). The response"},{"line_number":82,"context_line":"should contain all attributes in the data model."},{"line_number":83,"context_line":""}],"source_content_type":"text/x-rst","patch_set":13,"id":"39b5371b_dccad805","line":80,"range":{"start_line":80,"start_character":46,"end_line":80,"end_character":57},"updated":"2024-07-09 07:48:18.000000000","message":"Can the user change (PUT) the listener_id of an existing policy?","commit_id":"2bac2f59abb1658162a1efbecb93b4cb53dcefed"},{"author":{"_account_id":34429,"name":"Tom Weininger","email":"dienste@weinimo.de","username":"tweining"},"change_message_id":"188b57883d4f4c61e7d78af4094b313a433990a0","unresolved":false,"context_lines":[{"line_number":77,"context_line":"The request of the *POST /v2/lbaas/ratelimitpolicies*"},{"line_number":78,"context_line":"and *PUT /v2/lbaas/ratelimitpolicies/{policy_id}* methods of the"},{"line_number":79,"context_line":"*Rate Limit Policy* API should have the attributes"},{"line_number":80,"context_line":"*name* (Optional), *description* (Optional), *listener_id*,"},{"line_number":81,"context_line":"*enabled* (Optional), *project_id* (Optional), *tags* (Optional). The response"},{"line_number":82,"context_line":"should contain all attributes in the data model."},{"line_number":83,"context_line":""}],"source_content_type":"text/x-rst","patch_set":13,"id":"e5b21176_a46db498","line":80,"range":{"start_line":80,"start_character":46,"end_line":80,"end_character":57},"in_reply_to":"1476e876_44430286","updated":"2024-08-21 12:15:02.000000000","message":"I mark this as resolved because this is no longer linked to a text location. The proposal changed a lot since the beginning so these comments can be confusing now.\n\nFeel free to start a new discussion in the current text location about this.","commit_id":"2bac2f59abb1658162a1efbecb93b4cb53dcefed"},{"author":{"_account_id":34429,"name":"Tom Weininger","email":"dienste@weinimo.de","username":"tweining"},"change_message_id":"5594a20ab2ff851d64360bf4426815217bff779b","unresolved":true,"context_lines":[{"line_number":77,"context_line":"The request of the *POST /v2/lbaas/ratelimitpolicies*"},{"line_number":78,"context_line":"and *PUT /v2/lbaas/ratelimitpolicies/{policy_id}* methods of the"},{"line_number":79,"context_line":"*Rate Limit Policy* API should have the attributes"},{"line_number":80,"context_line":"*name* (Optional), *description* (Optional), *listener_id*,"},{"line_number":81,"context_line":"*enabled* (Optional), *project_id* (Optional), *tags* (Optional). The response"},{"line_number":82,"context_line":"should contain all attributes in the data model."},{"line_number":83,"context_line":""}],"source_content_type":"text/x-rst","patch_set":13,"id":"3ea0b734_cc3a9e38","line":80,"range":{"start_line":80,"start_character":46,"end_line":80,"end_character":57},"in_reply_to":"39b5371b_dccad805","updated":"2024-07-09 09:48:00.000000000","message":"That is a good point. My idea was that users can create the policies independent of the listeners that will use them. In other words: First a policy gets created, then during listener creation or update it gets added to the listener. According to this logic, `listener_id` should be an attribute of neither `PUT` nor `POST` of the ratelimitpolicies endpoint, but the listener `PUT` and `POST` endpoint should accept a new attribute rate_limit_policies, which would be a list of policy names or IDs. In DB terms, that would basically mean a many to many relationship.\n\nI just saw it does not work this way with `L7Policies` (and I used that as a template). When it gets created, a `listener_id` needs to be provided. I\u0027m not sure why that is that way. The approach proposed above seems more intuitive to me. Maybe I am missing some piece. Maybe it\u0027s the many to many relationship made the `L7Policies` go the other route. I think I\u0027ve never had to build a many to many relationship in a RDBMS in the past. Please let me know what you think.\n\nThe other way would be to allow only a single listener for each policy. From user perspective that would be less convenient probably as it would require more policies. Then the answer to your question would be no, I guess.","commit_id":"2bac2f59abb1658162a1efbecb93b4cb53dcefed"},{"author":{"_account_id":34429,"name":"Tom Weininger","email":"dienste@weinimo.de","username":"tweining"},"change_message_id":"4a5b62295d4316ba8040d348f043d6f292e6eee5","unresolved":true,"context_lines":[{"line_number":77,"context_line":"The request of the *POST /v2/lbaas/ratelimitpolicies*"},{"line_number":78,"context_line":"and *PUT /v2/lbaas/ratelimitpolicies/{policy_id}* methods of the"},{"line_number":79,"context_line":"*Rate Limit Policy* API should have the attributes"},{"line_number":80,"context_line":"*name* (Optional), *description* (Optional), *listener_id*,"},{"line_number":81,"context_line":"*enabled* (Optional), *project_id* (Optional), *tags* (Optional). The response"},{"line_number":82,"context_line":"should contain all attributes in the data model."},{"line_number":83,"context_line":""}],"source_content_type":"text/x-rst","patch_set":13,"id":"1476e876_44430286","line":80,"range":{"start_line":80,"start_character":46,"end_line":80,"end_character":57},"in_reply_to":"39e86abe_aff90f98","updated":"2024-07-15 11:40:00.000000000","message":"I adjusted the document. Now a listener may only have a single rate limiting policy, but a policy may be added to multiple listeners.","commit_id":"2bac2f59abb1658162a1efbecb93b4cb53dcefed"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"08282d04071e757ae3aa4d97e7230bb822297fc0","unresolved":true,"context_lines":[{"line_number":77,"context_line":"The request of the *POST /v2/lbaas/ratelimitpolicies*"},{"line_number":78,"context_line":"and *PUT /v2/lbaas/ratelimitpolicies/{policy_id}* methods of the"},{"line_number":79,"context_line":"*Rate Limit Policy* API should have the attributes"},{"line_number":80,"context_line":"*name* (Optional), *description* (Optional), *listener_id*,"},{"line_number":81,"context_line":"*enabled* (Optional), *project_id* (Optional), *tags* (Optional). The response"},{"line_number":82,"context_line":"should contain all attributes in the data model."},{"line_number":83,"context_line":""}],"source_content_type":"text/x-rst","patch_set":13,"id":"39e86abe_aff90f98","line":80,"range":{"start_line":80,"start_character":46,"end_line":80,"end_character":57},"in_reply_to":"3ea0b734_cc3a9e38","updated":"2024-07-10 03:39:06.000000000","message":"L7Policies are very specific to the requests, so it makes sense they are hard bound to the listener.\nI lean in the direction that rate limiting could be more generic and shared across listeners (aside form URLs of course). If we can design this to be shared across listeners, I think that is a good idea.\nPools can be shared in the current implementation.","commit_id":"2bac2f59abb1658162a1efbecb93b4cb53dcefed"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"08282d04071e757ae3aa4d97e7230bb822297fc0","unresolved":true,"context_lines":[{"line_number":78,"context_line":"and *PUT /v2/lbaas/ratelimitpolicies/{policy_id}* methods of the"},{"line_number":79,"context_line":"*Rate Limit Policy* API should have the attributes"},{"line_number":80,"context_line":"*name* (Optional), *description* (Optional), *listener_id*,"},{"line_number":81,"context_line":"*enabled* (Optional), *project_id* (Optional), *tags* (Optional). The response"},{"line_number":82,"context_line":"should contain all attributes in the data model."},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"The *GET /v2/lbaas/ratelimitpolicies* method should have the optional attribute"}],"source_content_type":"text/x-rst","patch_set":13,"id":"dc3e9cc0_13e41f32","line":81,"updated":"2024-07-10 03:39:06.000000000","message":"I think we are missing \"action\" here.\nI.e. \"Drop\", \"reject\" (429), queue, etc.\n\nA policy should define *how* we handle the request if a rule matches.\n\nA future feature may queue requests and simply delay the response to the attacker. Bummer for you if your requests start taking 10 seconds to respond.","commit_id":"2bac2f59abb1658162a1efbecb93b4cb53dcefed"},{"author":{"_account_id":34429,"name":"Tom Weininger","email":"dienste@weinimo.de","username":"tweining"},"change_message_id":"022b82d88b1b15f2eeda918f1899df709d2e494d","unresolved":true,"context_lines":[{"line_number":78,"context_line":"and *PUT /v2/lbaas/ratelimitpolicies/{policy_id}* methods of the"},{"line_number":79,"context_line":"*Rate Limit Policy* API should have the attributes"},{"line_number":80,"context_line":"*name* (Optional), *description* (Optional), *listener_id*,"},{"line_number":81,"context_line":"*enabled* (Optional), *project_id* (Optional), *tags* (Optional). The response"},{"line_number":82,"context_line":"should contain all attributes in the data model."},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"The *GET /v2/lbaas/ratelimitpolicies* method should have the optional attribute"}],"source_content_type":"text/x-rst","patch_set":13,"id":"dbe83b2d_6340511b","line":81,"in_reply_to":"dc3e9cc0_13e41f32","updated":"2024-07-10 15:03:26.000000000","message":"I\u0027m fine with adding `action` in order to allow users to control the action explicitly. I think we should use HAProxy terminology as orientation for naming. [1]\n\nMy suggestion:\n\nDENY: respond with 429\nREJECT: close connection without response\nSILENT_DROP: like REJECT, but no notification\nQUEUE: like in the \"leaky bucket\" algorithm\n\nI saw that other load balancers often use a \"leaky bucket\" algorithm, which works like a `QUEUE` basically. I don\u0027t think HAProxy implements it directly. HAProxy supports to \"tarpit the request\" [1], which is a bit like queuing the request, but it actually queues the response instead. Maybe it\u0027s close enough to use this for the `QUEUE` action. \n\n[1]: https://www.haproxy.com/documentation/haproxy-configuration-tutorials/traffic-policing/#queue-connections-to-servers","commit_id":"2bac2f59abb1658162a1efbecb93b4cb53dcefed"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"08282d04071e757ae3aa4d97e7230bb822297fc0","unresolved":true,"context_lines":[{"line_number":99,"context_line":""},{"line_number":100,"context_line":"The *POST /v2/lbaas/ratelimitpolicies/{policy_id}/rules* method accepts"},{"line_number":101,"context_line":"the request attributes *ratelimitpolicy_id*, *project_id* (Optional),"},{"line_number":102,"context_line":"*metric*, *threshold*, *interval* (Optional, defaults to 30),"},{"line_number":103,"context_line":"*tags* (Optional). The response will contain all attributes of the data model."},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"The *GET /v2/lbaas/ratelimitpolicies/{policy_id}/rules/{rule_id}* request"}],"source_content_type":"text/x-rst","patch_set":13,"id":"34eb9adb_46bb89b8","line":102,"updated":"2024-07-10 03:39:06.000000000","message":"Wouldn\u0027t URL be here?\nShouldn\u0027t this be a list of \"matchers\"? I.e. limit (and URL when applicable)? The policy should be the \"action\" taken when a rule is matched.","commit_id":"2bac2f59abb1658162a1efbecb93b4cb53dcefed"},{"author":{"_account_id":34429,"name":"Tom Weininger","email":"dienste@weinimo.de","username":"tweining"},"change_message_id":"022b82d88b1b15f2eeda918f1899df709d2e494d","unresolved":false,"context_lines":[{"line_number":99,"context_line":""},{"line_number":100,"context_line":"The *POST /v2/lbaas/ratelimitpolicies/{policy_id}/rules* method accepts"},{"line_number":101,"context_line":"the request attributes *ratelimitpolicy_id*, *project_id* (Optional),"},{"line_number":102,"context_line":"*metric*, *threshold*, *interval* (Optional, defaults to 30),"},{"line_number":103,"context_line":"*tags* (Optional). The response will contain all attributes of the data model."},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"The *GET /v2/lbaas/ratelimitpolicies/{policy_id}/rules/{rule_id}* request"}],"source_content_type":"text/x-rst","patch_set":13,"id":"a3635a0e_ddf7cad4","line":102,"in_reply_to":"34eb9adb_46bb89b8","updated":"2024-07-10 15:03:26.000000000","message":"Yes, the url should be here. The data model stores them as urls (a list), and we can do the same here too. So, it would be `urls` then.\n\nThe rule defines the conditions, and the policy how to react once a condition is met and the threshold reached. It makes sense to me.","commit_id":"2bac2f59abb1658162a1efbecb93b4cb53dcefed"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"08282d04071e757ae3aa4d97e7230bb822297fc0","unresolved":true,"context_lines":[{"line_number":122,"context_line":""},{"line_number":123,"context_line":"Notifications impact"},{"line_number":124,"context_line":"--------------------"},{"line_number":125,"context_line":"None."},{"line_number":126,"context_line":""},{"line_number":127,"context_line":"Other end user impact"},{"line_number":128,"context_line":"---------------------"}],"source_content_type":"text/x-rst","patch_set":13,"id":"6b6187bb_28443eb1","line":125,"updated":"2024-07-10 03:39:06.000000000","message":"The API interactions should create notifications. There will be impact here.","commit_id":"2bac2f59abb1658162a1efbecb93b4cb53dcefed"},{"author":{"_account_id":34429,"name":"Tom Weininger","email":"dienste@weinimo.de","username":"tweining"},"change_message_id":"9872ff7fec540af7b09019931ca8a82235c1c3c4","unresolved":false,"context_lines":[{"line_number":122,"context_line":""},{"line_number":123,"context_line":"Notifications impact"},{"line_number":124,"context_line":"--------------------"},{"line_number":125,"context_line":"None."},{"line_number":126,"context_line":""},{"line_number":127,"context_line":"Other end user impact"},{"line_number":128,"context_line":"---------------------"}],"source_content_type":"text/x-rst","patch_set":13,"id":"b55b3021_830bd304","line":125,"in_reply_to":"6b6187bb_28443eb1","updated":"2024-07-10 16:31:08.000000000","message":"We discussed this in today\u0027s upstream meeting. Conclusion: No impact here.","commit_id":"2bac2f59abb1658162a1efbecb93b4cb53dcefed"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"08282d04071e757ae3aa4d97e7230bb822297fc0","unresolved":true,"context_lines":[{"line_number":134,"context_line":"default configuration. Depending on the complexity of the rules and the"},{"line_number":135,"context_line":"implementation, some processing overhead may impact performance. Overall,"},{"line_number":136,"context_line":"however, fairness and performance can improve when using rate limiting."},{"line_number":137,"context_line":""},{"line_number":138,"context_line":"Other deployer impact"},{"line_number":139,"context_line":"---------------------"},{"line_number":140,"context_line":"None."}],"source_content_type":"text/x-rst","patch_set":13,"id":"b59b77d2_cc27fd13","line":137,"updated":"2024-07-10 03:39:06.000000000","message":"There is a network overhead of syncing the stick tables between the active/standby instances.","commit_id":"2bac2f59abb1658162a1efbecb93b4cb53dcefed"},{"author":{"_account_id":34429,"name":"Tom Weininger","email":"dienste@weinimo.de","username":"tweining"},"change_message_id":"022b82d88b1b15f2eeda918f1899df709d2e494d","unresolved":false,"context_lines":[{"line_number":134,"context_line":"default configuration. Depending on the complexity of the rules and the"},{"line_number":135,"context_line":"implementation, some processing overhead may impact performance. Overall,"},{"line_number":136,"context_line":"however, fairness and performance can improve when using rate limiting."},{"line_number":137,"context_line":""},{"line_number":138,"context_line":"Other deployer impact"},{"line_number":139,"context_line":"---------------------"},{"line_number":140,"context_line":"None."}],"source_content_type":"text/x-rst","patch_set":13,"id":"ab5c7b5a_f86207bc","line":137,"in_reply_to":"b59b77d2_cc27fd13","updated":"2024-07-10 15:03:26.000000000","message":"Done","commit_id":"2bac2f59abb1658162a1efbecb93b4cb53dcefed"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"08282d04071e757ae3aa4d97e7230bb822297fc0","unresolved":true,"context_lines":[{"line_number":135,"context_line":"implementation, some processing overhead may impact performance. Overall,"},{"line_number":136,"context_line":"however, fairness and performance can improve when using rate limiting."},{"line_number":137,"context_line":""},{"line_number":138,"context_line":"Other deployer impact"},{"line_number":139,"context_line":"---------------------"},{"line_number":140,"context_line":"None."},{"line_number":141,"context_line":""}],"source_content_type":"text/x-rst","patch_set":13,"id":"515d1b31_8c8f83f6","line":138,"updated":"2024-07-10 03:39:06.000000000","message":"Somewhere we need to capture the memory impact of enabling more stick tables in the amphora. Operators may need to increase the memory allocations to the amphora depending on the sizes of the stick tables.","commit_id":"2bac2f59abb1658162a1efbecb93b4cb53dcefed"},{"author":{"_account_id":34429,"name":"Tom Weininger","email":"dienste@weinimo.de","username":"tweining"},"change_message_id":"022b82d88b1b15f2eeda918f1899df709d2e494d","unresolved":false,"context_lines":[{"line_number":135,"context_line":"implementation, some processing overhead may impact performance. Overall,"},{"line_number":136,"context_line":"however, fairness and performance can improve when using rate limiting."},{"line_number":137,"context_line":""},{"line_number":138,"context_line":"Other deployer impact"},{"line_number":139,"context_line":"---------------------"},{"line_number":140,"context_line":"None."},{"line_number":141,"context_line":""}],"source_content_type":"text/x-rst","patch_set":13,"id":"bbf1a446_03dc3adf","line":138,"in_reply_to":"515d1b31_8c8f83f6","updated":"2024-07-10 15:03:26.000000000","message":"I added a general statement about this. Maybe we can give some recommendation in the release notes later.","commit_id":"2bac2f59abb1658162a1efbecb93b4cb53dcefed"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"21714b51570bb6e84a1e771821940a40a1655d44","unresolved":true,"context_lines":[{"line_number":62,"context_line":"Data model impact"},{"line_number":63,"context_line":"-----------------"},{"line_number":64,"context_line":"A new ``RateLimitPolicy`` model class contains data about policies."},{"line_number":65,"context_line":"Its attributes are"},{"line_number":66,"context_line":"``id`` (string), ``name`` (string),"},{"line_number":67,"context_line":"``description`` (string), ``rules`` (``RateLimitRule``\\s),"},{"line_number":68,"context_line":"``action`` (enum),"}],"source_content_type":"text/x-rst","patch_set":22,"id":"e63643d9_ee9a389c","line":65,"updated":"2024-08-14 17:30:02.000000000","message":"nit: This would be more readable as a list. As is, when it renders it gets compressed into one paragraph.","commit_id":"76532cc24ccf9baacdf7cf37762087d7c36738eb"},{"author":{"_account_id":34429,"name":"Tom Weininger","email":"dienste@weinimo.de","username":"tweining"},"change_message_id":"188b57883d4f4c61e7d78af4094b313a433990a0","unresolved":false,"context_lines":[{"line_number":62,"context_line":"Data model impact"},{"line_number":63,"context_line":"-----------------"},{"line_number":64,"context_line":"A new ``RateLimitPolicy`` model class contains data about policies."},{"line_number":65,"context_line":"Its attributes are"},{"line_number":66,"context_line":"``id`` (string), ``name`` (string),"},{"line_number":67,"context_line":"``description`` (string), ``rules`` (``RateLimitRule``\\s),"},{"line_number":68,"context_line":"``action`` (enum),"}],"source_content_type":"text/x-rst","patch_set":22,"id":"129d9094_2fff0fef","line":65,"in_reply_to":"e63643d9_ee9a389c","updated":"2024-08-21 12:15:02.000000000","message":"Done","commit_id":"76532cc24ccf9baacdf7cf37762087d7c36738eb"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"21714b51570bb6e84a1e771821940a40a1655d44","unresolved":true,"context_lines":[{"line_number":67,"context_line":"``description`` (string), ``rules`` (``RateLimitRule``\\s),"},{"line_number":68,"context_line":"``action`` (enum),"},{"line_number":69,"context_line":"``listener_id`` (string), ``listener`` (string), ``enabled`` (boolean),"},{"line_number":70,"context_line":"``provisioning_status`` (string),"},{"line_number":71,"context_line":"``project_id`` (string), ``created_at`` (DateTime),"},{"line_number":72,"context_line":"``updated_at`` (DateTime), ``tags`` (string)."},{"line_number":73,"context_line":"The ``rules`` attribute forms a"}],"source_content_type":"text/x-rst","patch_set":22,"id":"00641ee2_42af305b","line":70,"updated":"2024-08-14 17:30:02.000000000","message":"We typically have an operating status too (such as l7policy). For consistency I think we should include that here too.","commit_id":"76532cc24ccf9baacdf7cf37762087d7c36738eb"},{"author":{"_account_id":34429,"name":"Tom Weininger","email":"dienste@weinimo.de","username":"tweining"},"change_message_id":"188b57883d4f4c61e7d78af4094b313a433990a0","unresolved":false,"context_lines":[{"line_number":67,"context_line":"``description`` (string), ``rules`` (``RateLimitRule``\\s),"},{"line_number":68,"context_line":"``action`` (enum),"},{"line_number":69,"context_line":"``listener_id`` (string), ``listener`` (string), ``enabled`` (boolean),"},{"line_number":70,"context_line":"``provisioning_status`` (string),"},{"line_number":71,"context_line":"``project_id`` (string), ``created_at`` (DateTime),"},{"line_number":72,"context_line":"``updated_at`` (DateTime), ``tags`` (string)."},{"line_number":73,"context_line":"The ``rules`` attribute forms a"}],"source_content_type":"text/x-rst","patch_set":22,"id":"5d5f9a67_51537439","line":70,"in_reply_to":"00641ee2_42af305b","updated":"2024-08-21 12:15:02.000000000","message":"Done","commit_id":"76532cc24ccf9baacdf7cf37762087d7c36738eb"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"21714b51570bb6e84a1e771821940a40a1655d44","unresolved":true,"context_lines":[{"line_number":86,"context_line":"The new ``RateLimitRule`` model class defines a specific"},{"line_number":87,"context_line":"rate limiting rule. Its attributes are"},{"line_number":88,"context_line":"``id`` (string), ``name`` (string), ``project_id`` (string),"},{"line_number":89,"context_line":"``metric`` (enum), ``threshold`` (integer), ``action`` (enum),"},{"line_number":90,"context_line":"``interval`` (integer, defaults to 30), ``urls`` (ScalarListType)."},{"line_number":91,"context_line":"``metric`` can be either of ``\"REQUESTS\"``, ``\"REQUESTS_PER_URL\"``,"},{"line_number":92,"context_line":"``\"KBYTES\"``, ``\"PACKETS\"``."}],"source_content_type":"text/x-rst","patch_set":22,"id":"7ad7d83a_1333dca4","line":89,"updated":"2024-08-14 17:30:02.000000000","message":"Action moves to the Policy right?","commit_id":"76532cc24ccf9baacdf7cf37762087d7c36738eb"},{"author":{"_account_id":34429,"name":"Tom Weininger","email":"dienste@weinimo.de","username":"tweining"},"change_message_id":"188b57883d4f4c61e7d78af4094b313a433990a0","unresolved":false,"context_lines":[{"line_number":86,"context_line":"The new ``RateLimitRule`` model class defines a specific"},{"line_number":87,"context_line":"rate limiting rule. Its attributes are"},{"line_number":88,"context_line":"``id`` (string), ``name`` (string), ``project_id`` (string),"},{"line_number":89,"context_line":"``metric`` (enum), ``threshold`` (integer), ``action`` (enum),"},{"line_number":90,"context_line":"``interval`` (integer, defaults to 30), ``urls`` (ScalarListType)."},{"line_number":91,"context_line":"``metric`` can be either of ``\"REQUESTS\"``, ``\"REQUESTS_PER_URL\"``,"},{"line_number":92,"context_line":"``\"KBYTES\"``, ``\"PACKETS\"``."}],"source_content_type":"text/x-rst","patch_set":22,"id":"df9b7966_113a893e","line":89,"in_reply_to":"7ad7d83a_1333dca4","updated":"2024-08-21 12:15:02.000000000","message":"Done","commit_id":"76532cc24ccf9baacdf7cf37762087d7c36738eb"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"21714b51570bb6e84a1e771821940a40a1655d44","unresolved":true,"context_lines":[{"line_number":89,"context_line":"``metric`` (enum), ``threshold`` (integer), ``action`` (enum),"},{"line_number":90,"context_line":"``interval`` (integer, defaults to 30), ``urls`` (ScalarListType)."},{"line_number":91,"context_line":"``metric`` can be either of ``\"REQUESTS\"``, ``\"REQUESTS_PER_URL\"``,"},{"line_number":92,"context_line":"``\"KBYTES\"``, ``\"PACKETS\"``."},{"line_number":93,"context_line":"``interval`` denotes the time interval in seconds in"},{"line_number":94,"context_line":"which the metric gets measured for each client."},{"line_number":95,"context_line":"``threshold`` defines the threshold at which the rate gets limited."}],"source_content_type":"text/x-rst","patch_set":22,"id":"aa2a3ffa_ddc29dd8","line":92,"updated":"2024-08-14 17:30:02.000000000","message":"We should include operating, provisioning status, and tags here too for consistency with the l7rule format.","commit_id":"76532cc24ccf9baacdf7cf37762087d7c36738eb"},{"author":{"_account_id":34429,"name":"Tom Weininger","email":"dienste@weinimo.de","username":"tweining"},"change_message_id":"188b57883d4f4c61e7d78af4094b313a433990a0","unresolved":false,"context_lines":[{"line_number":89,"context_line":"``metric`` (enum), ``threshold`` (integer), ``action`` (enum),"},{"line_number":90,"context_line":"``interval`` (integer, defaults to 30), ``urls`` (ScalarListType)."},{"line_number":91,"context_line":"``metric`` can be either of ``\"REQUESTS\"``, ``\"REQUESTS_PER_URL\"``,"},{"line_number":92,"context_line":"``\"KBYTES\"``, ``\"PACKETS\"``."},{"line_number":93,"context_line":"``interval`` denotes the time interval in seconds in"},{"line_number":94,"context_line":"which the metric gets measured for each client."},{"line_number":95,"context_line":"``threshold`` defines the threshold at which the rate gets limited."}],"source_content_type":"text/x-rst","patch_set":22,"id":"01c799ba_16f18443","line":92,"in_reply_to":"aa2a3ffa_ddc29dd8","updated":"2024-08-21 12:15:02.000000000","message":"Done","commit_id":"76532cc24ccf9baacdf7cf37762087d7c36738eb"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"21714b51570bb6e84a1e771821940a40a1655d44","unresolved":true,"context_lines":[{"line_number":105,"context_line":"Listener"},{"line_number":106,"context_line":"~~~~~~~~"},{"line_number":107,"context_line":"The listener API gets a new ``rate_limit_policies`` (Optional) attribute."},{"line_number":108,"context_line":"Valid values are ``null`` (the default) or a list of dictionaries defining"},{"line_number":109,"context_line":"the policy IDs."},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"Rate Limit Policy"}],"source_content_type":"text/x-rst","patch_set":22,"id":"e1286ee5_be667105","line":108,"range":{"start_line":108,"start_character":53,"end_line":108,"end_character":65},"updated":"2024-08-14 17:30:02.000000000","message":"Wouldn\u0027t this just be a list of rate limit policy ids and not a dict?\nLike this https://github.com/openstack/octavia/blob/master/octavia/api/v2/types/listener.py#L49","commit_id":"76532cc24ccf9baacdf7cf37762087d7c36738eb"},{"author":{"_account_id":34429,"name":"Tom Weininger","email":"dienste@weinimo.de","username":"tweining"},"change_message_id":"188b57883d4f4c61e7d78af4094b313a433990a0","unresolved":false,"context_lines":[{"line_number":105,"context_line":"Listener"},{"line_number":106,"context_line":"~~~~~~~~"},{"line_number":107,"context_line":"The listener API gets a new ``rate_limit_policies`` (Optional) attribute."},{"line_number":108,"context_line":"Valid values are ``null`` (the default) or a list of dictionaries defining"},{"line_number":109,"context_line":"the policy IDs."},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"Rate Limit Policy"}],"source_content_type":"text/x-rst","patch_set":22,"id":"e90197c3_0aa70f92","line":108,"range":{"start_line":108,"start_character":53,"end_line":108,"end_character":65},"in_reply_to":"2e7d7eeb_5668f9fb","updated":"2024-08-21 12:15:02.000000000","message":"Done","commit_id":"76532cc24ccf9baacdf7cf37762087d7c36738eb"},{"author":{"_account_id":34429,"name":"Tom Weininger","email":"dienste@weinimo.de","username":"tweining"},"change_message_id":"95b95448bafb7f13484ecd067a47032f1ae369e2","unresolved":true,"context_lines":[{"line_number":105,"context_line":"Listener"},{"line_number":106,"context_line":"~~~~~~~~"},{"line_number":107,"context_line":"The listener API gets a new ``rate_limit_policies`` (Optional) attribute."},{"line_number":108,"context_line":"Valid values are ``null`` (the default) or a list of dictionaries defining"},{"line_number":109,"context_line":"the policy IDs."},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"Rate Limit Policy"}],"source_content_type":"text/x-rst","patch_set":22,"id":"2e7d7eeb_5668f9fb","line":108,"range":{"start_line":108,"start_character":53,"end_line":108,"end_character":65},"in_reply_to":"e1286ee5_be667105","updated":"2024-08-20 10:28:46.000000000","message":"In the API response example[1] of the GET listeners method it is as a list of dicts too:\n\n```\n        \"l7policies\": [\n            {\n                \"id\": \"5e618272-339d-4a80-8d14-dbc093091bb1\"\n            }\n        ],\n```\n\nWe probably mean the same thing.\n\n[1]: https://docs.openstack.org/api-ref/load-balancer/v2/index.html#show-listener-details\n\nEdit: Sorry, I got confused. Of course that is JSON, not Python. I\u0027ll adjust the spec. Thanks.","commit_id":"76532cc24ccf9baacdf7cf37762087d7c36738eb"}]}
