)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":34429,"name":"Tom Weininger","email":"dienste@weinimo.de","username":"tweining"},"change_message_id":"52c598f13cb4aecc50b1b7dffb6e1bde0a51b526","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":16,"id":"4042d9ab_0b49b46a","updated":"2023-05-03 14:16:37.000000000","message":"recheck not sure why merge failed in the CI","commit_id":"56a875ea1d2ac66f42457b0846929127593e7452"},{"author":{"_account_id":34429,"name":"Tom Weininger","email":"dienste@weinimo.de","username":"tweining"},"change_message_id":"ba2901c6b85502789074f2c9d75ca4c8bbda3c61","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":17,"id":"ac048396_1e73cfb6","updated":"2023-05-04 06:32:48.000000000","message":"Note that CI failures are because tox installs only the released octavia-lib version, not the one with the required changes.","commit_id":"15526feed8fa828034429bbb3199b618a6eef16a"},{"author":{"_account_id":34429,"name":"Tom Weininger","email":"dienste@weinimo.de","username":"tweining"},"change_message_id":"baf503f7c56099d4768625bcde0e017f61ebdcee","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":17,"id":"861669f5_d3d0a572","in_reply_to":"ac048396_1e73cfb6","updated":"2023-07-19 15:52:04.000000000","message":"Done","commit_id":"15526feed8fa828034429bbb3199b618a6eef16a"},{"author":{"_account_id":34429,"name":"Tom Weininger","email":"dienste@weinimo.de","username":"tweining"},"change_message_id":"fc8c7a56e1071280114e6362555fec8d3ee97b88","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":18,"id":"e4e59c15_37d94cfb","updated":"2023-05-05 08:15:29.000000000","message":"recheck !","commit_id":"e0243d68397786a03540f0b70d958c205e68d685"},{"author":{"_account_id":34429,"name":"Tom Weininger","email":"dienste@weinimo.de","username":"tweining"},"change_message_id":"dc9285628010a6d4ae498f7d25170be5d084fc66","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":18,"id":"38cd6b62_6723ef5a","updated":"2023-05-05 06:50:03.000000000","message":"recheck conflict resolved","commit_id":"e0243d68397786a03540f0b70d958c205e68d685"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"199f4da4fb931b60df6702f896b54e7ebb60284c","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":22,"id":"62d23a57_403106eb","updated":"2023-07-05 19:56:30.000000000","message":"Also don\u0027t forget to bump the requirements.txt version for the minimum octavia-lib that supports these new fields.","commit_id":"2b08eaf24c47f2de23dcff62371157e8f5724993"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"7133b80e8bc441403a15abfb0e32ac030f156e51","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":22,"id":"adcd894d_368f2d54","updated":"2023-06-30 20:12:58.000000000","message":"We are missing some API logic for validation.","commit_id":"2b08eaf24c47f2de23dcff62371157e8f5724993"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"f5cad0d77bb7651610123b9d8e1ceccf1fd006f8","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":22,"id":"cb2abd52_f3653501","updated":"2023-07-05 19:38:45.000000000","message":"recheck\nI would like fresh logs","commit_id":"2b08eaf24c47f2de23dcff62371157e8f5724993"},{"author":{"_account_id":34429,"name":"Tom Weininger","email":"dienste@weinimo.de","username":"tweining"},"change_message_id":"80f4c9368fa395a3b125d702d49c92e132ae0a3f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":22,"id":"cc8e727f_7efc0ba6","in_reply_to":"62d23a57_403106eb","updated":"2023-07-17 16:14:16.000000000","message":"Thanks. Done.","commit_id":"2b08eaf24c47f2de23dcff62371157e8f5724993"},{"author":{"_account_id":29244,"name":"Gregory Thiemonge","email":"gthiemon@redhat.com","username":"gthiemonge"},"change_message_id":"cc2f2826631677da2a72a5c5e08852d216ce0fc0","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":25,"id":"94d6a983_4cc5d063","updated":"2023-07-18 06:52:23.000000000","message":"I\u0027m trying to create a simple HTTPS listener with the fully-populated API and I get:\n\n```\nJul 18 02:46:18 gthiemon-devstack devstack@o-api.service[1526072]:   File \"/opt/stack/octavia/octavia/api/v2/controllers/load_balancer.py\", line 549, in post\nJul 18 02:46:18 gthiemon-devstack devstack@o-api.service[1526072]:     db_pools, db_lists \u003d self._graph_create(                          \nJul 18 02:46:18 gthiemon-devstack devstack@o-api.service[1526072]:   File \"/opt/stack/octavia/octavia/api/v2/controllers/load_balancer.py\", line 680, in _graph_create\nJul 18 02:46:18 gthiemon-devstack devstack@o-api.service[1526072]:     new_lists.append(listener.ListenersController()._graph_create(    \nJul 18 02:46:18 gthiemon-devstack devstack@o-api.service[1526072]:   File \"/opt/stack/octavia/octavia/api/v2/controllers/listener.py\", line 437, in _graph_create\nJul 18 02:46:18 gthiemon-devstack devstack@o-api.service[1526072]:     db_listener \u003d self._validate_create_listener(                     \nJul 18 02:46:18 gthiemon-devstack devstack@o-api.service[1526072]:   File \"/opt/stack/octavia/octavia/api/v2/controllers/listener.py\", line 327, in _validate_create_listener\nJul 18 02:46:18 gthiemon-devstack devstack@o-api.service[1526072]:     validate.check_hsts_options(listener_dict)                        \n\nJul 18 02:46:18 gthiemon-devstack devstack@o-api.service[1526072]:   File \"/opt/stack/octavia/octavia/common/validate.py\", line 544, in check_hsts_options\nJul 18 02:46:18 gthiemon-devstack devstack@o-api.service[1526072]:     if (listener[\u0027hsts_max_age\u0027] !\u003d wtypes.Unset and\nJul 18 02:46:18 gthiemon-devstack devstack@o-api.service[1526072]: KeyError: \u0027hsts_max_age\u0027\n```\n\nThe listener_dict contains:\n\n```\n{\u0027enabled\u0027: True, \u0027client_authentication\u0027: \u0027NONE\u0027, \u0027connection_limit\u0027: -1, \u0027tls_certificate_id\u0027: \u0027http://192.168.1.101/key-manager/v1/secrets/3057d141-48f3-4839-ae62-6174b91ceaa2\u0027, \u0027hsts_include_subdomains\u0027: False, \u0027hsts_preload\u0027: False, \u0027l7policies\u0027: [], \u0027protocol\u0027: \u0027TERMINATED_HTTPS\u0027, \u0027protocol_port\u0027: 80, \u0027default_pool_id\u0027: \u0027a88b7b35-451f-4832-afa6-11afb6a1171d\u0027, \u0027load_balancer_id\u0027: \u0027d667005a-5b52-4e4e-8c28-51ce6296ae2f\u0027, \u0027project_id\u0027: \u0027296e73b5369949e8a7bccdfae9988a23\u0027}\n```","commit_id":"68eda5114c9000f8ece5e4d31121d586b5f88dc1"},{"author":{"_account_id":34429,"name":"Tom Weininger","email":"dienste@weinimo.de","username":"tweining"},"change_message_id":"a5abb51249df1270756d8090af0a0039df72a81b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":25,"id":"ea6cbcec_4aa48094","updated":"2023-07-18 09:59:58.000000000","message":"Thanks for the reviews.","commit_id":"68eda5114c9000f8ece5e4d31121d586b5f88dc1"},{"author":{"_account_id":29244,"name":"Gregory Thiemonge","email":"gthiemon@redhat.com","username":"gthiemonge"},"change_message_id":"e775157818527fe5bc6f5cbbcceb489e7c2bb736","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":26,"id":"558f6277_0f7d1fd2","updated":"2023-07-18 12:53:21.000000000","message":"-1 because I think we can improve the validation in the PUT call","commit_id":"af2b72b7bfc7e666ef3cf488db31385ddee4830c"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"b7664df71eed60fe7e37d22519832f4c332ffc63","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":34,"id":"a3ec7bd7_f0427d9b","updated":"2023-08-17 21:00:45.000000000","message":"Just a few comments","commit_id":"c29f93f514250fa94be6b669c9ea729b2fc531f7"},{"author":{"_account_id":29244,"name":"Gregory Thiemonge","email":"gthiemon@redhat.com","username":"gthiemonge"},"change_message_id":"67a57714a1331dafaf066b1ba338b34220da1bed","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":34,"id":"1f5615e4_e74e7c63","updated":"2023-08-17 15:27:28.000000000","message":"for visibility","commit_id":"c29f93f514250fa94be6b669c9ea729b2fc531f7"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"50d8659459703840574c4ef30dccd70b9697c79e","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":37,"id":"5d8b4a5a_0d7d0c91","updated":"2023-08-22 20:40:26.000000000","message":"LGTM","commit_id":"773064d4a6a5c3bc4d46040c4cc09acc84a048a2"},{"author":{"_account_id":34429,"name":"Tom Weininger","email":"dienste@weinimo.de","username":"tweining"},"change_message_id":"b94e2c69ff6c1021a7225a6d85279f01f73c5d50","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":38,"id":"54cb30a8_0a310b80","updated":"2023-08-23 16:20:16.000000000","message":"Had W+1 before rebase already","commit_id":"c9075475128cf27262a1e4f26d9ee65f8208d4d2"}],"api-ref/source/parameters.yaml":[{"author":{"_account_id":29244,"name":"Gregory Thiemonge","email":"gthiemon@redhat.com","username":"gthiemonge"},"change_message_id":"11d10035389636310677fc5a9be3c9bdc2aca1ce","unresolved":true,"context_lines":[{"line_number":808,"context_line":"  in: body"},{"line_number":809,"context_line":"  required: false"},{"line_number":810,"context_line":"  type: string"},{"line_number":811,"context_line":"hsts_include_subdomains-optional:"},{"line_number":812,"context_line":"  description: |"},{"line_number":813,"context_line":"    Defines whether the ``includeSubDomains`` directive should be"},{"line_number":814,"context_line":"    added to the Strict-Transport-Security HTTP response"}],"source_content_type":"text/x-yaml","patch_set":21,"id":"67592f6d_13cd96fa","line":811,"range":{"start_line":811,"start_character":0,"end_line":811,"end_character":23},"updated":"2023-05-30 16:57:20.000000000","message":"it seems that this option (and hsts_preload) depends on hsts_max_age.\nshould we add that dependency in the description?","commit_id":"ae10cd02517ca964af560aafaad38761e5250cc8"},{"author":{"_account_id":34429,"name":"Tom Weininger","email":"dienste@weinimo.de","username":"tweining"},"change_message_id":"5f8e280269ee838bbe0ded6b1c98cf92136809d1","unresolved":false,"context_lines":[{"line_number":808,"context_line":"  in: body"},{"line_number":809,"context_line":"  required: false"},{"line_number":810,"context_line":"  type: string"},{"line_number":811,"context_line":"hsts_include_subdomains-optional:"},{"line_number":812,"context_line":"  description: |"},{"line_number":813,"context_line":"    Defines whether the ``includeSubDomains`` directive should be"},{"line_number":814,"context_line":"    added to the Strict-Transport-Security HTTP response"}],"source_content_type":"text/x-yaml","patch_set":21,"id":"5c4973b0_3517735f","line":811,"range":{"start_line":811,"start_character":0,"end_line":811,"end_character":23},"in_reply_to":"67592f6d_13cd96fa","updated":"2023-05-31 06:14:03.000000000","message":"Yes, makes sense. Thanks.","commit_id":"ae10cd02517ca964af560aafaad38761e5250cc8"},{"author":{"_account_id":29244,"name":"Gregory Thiemonge","email":"gthiemon@redhat.com","username":"gthiemonge"},"change_message_id":"cc2f2826631677da2a72a5c5e08852d216ce0fc0","unresolved":true,"context_lines":[{"line_number":808,"context_line":"  in: body"},{"line_number":809,"context_line":"  required: false"},{"line_number":810,"context_line":"  type: string"},{"line_number":811,"context_line":"hsts_include_subdomains-optional:"},{"line_number":812,"context_line":"  description: |"},{"line_number":813,"context_line":"    Defines whether the ``includeSubDomains`` directive should be"},{"line_number":814,"context_line":"    added to the Strict-Transport-Security HTTP response"}],"source_content_type":"text/x-yaml","patch_set":25,"id":"03fbc21b_40c56dee","line":811,"range":{"start_line":811,"start_character":0,"end_line":811,"end_character":32},"updated":"2023-07-18 06:52:23.000000000","message":"you need to define both:\n- hsts_include_subdomains (required: true)\n- hsts_include_subdomains-optional (required: false)","commit_id":"68eda5114c9000f8ece5e4d31121d586b5f88dc1"},{"author":{"_account_id":34429,"name":"Tom Weininger","email":"dienste@weinimo.de","username":"tweining"},"change_message_id":"a5abb51249df1270756d8090af0a0039df72a81b","unresolved":false,"context_lines":[{"line_number":808,"context_line":"  in: body"},{"line_number":809,"context_line":"  required: false"},{"line_number":810,"context_line":"  type: string"},{"line_number":811,"context_line":"hsts_include_subdomains-optional:"},{"line_number":812,"context_line":"  description: |"},{"line_number":813,"context_line":"    Defines whether the ``includeSubDomains`` directive should be"},{"line_number":814,"context_line":"    added to the Strict-Transport-Security HTTP response"}],"source_content_type":"text/x-yaml","patch_set":25,"id":"da6a0296_d7ad9026","line":811,"range":{"start_line":811,"start_character":0,"end_line":811,"end_character":32},"in_reply_to":"03fbc21b_40c56dee","updated":"2023-07-18 09:59:58.000000000","message":"Done","commit_id":"68eda5114c9000f8ece5e4d31121d586b5f88dc1"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"b7664df71eed60fe7e37d22519832f4c332ffc63","unresolved":true,"context_lines":[{"line_number":808,"context_line":"  in: body"},{"line_number":809,"context_line":"  required: false"},{"line_number":810,"context_line":"  type: string"},{"line_number":811,"context_line":"hsts_include_subdomains:"},{"line_number":812,"context_line":"  description: |"},{"line_number":813,"context_line":"    Defines whether the ``includeSubDomains`` directive should be"},{"line_number":814,"context_line":"    added to the Strict-Transport-Security HTTP response"}],"source_content_type":"text/x-yaml","patch_set":34,"id":"8dbe91b4_d44b00c4","line":811,"updated":"2023-08-17 21:00:45.000000000","message":"These are missing the \"min_version: 2.27\" parameter\nThis indicates the minimum Octavia API version required for the feature.\nSee line 730 for an example.","commit_id":"c29f93f514250fa94be6b669c9ea729b2fc531f7"},{"author":{"_account_id":34429,"name":"Tom Weininger","email":"dienste@weinimo.de","username":"tweining"},"change_message_id":"5cbb84a74b8a9d03c82ac715215cb24aac33ce80","unresolved":false,"context_lines":[{"line_number":808,"context_line":"  in: body"},{"line_number":809,"context_line":"  required: false"},{"line_number":810,"context_line":"  type: string"},{"line_number":811,"context_line":"hsts_include_subdomains:"},{"line_number":812,"context_line":"  description: |"},{"line_number":813,"context_line":"    Defines whether the ``includeSubDomains`` directive should be"},{"line_number":814,"context_line":"    added to the Strict-Transport-Security HTTP response"}],"source_content_type":"text/x-yaml","patch_set":34,"id":"d7420de2_18103288","line":811,"in_reply_to":"8dbe91b4_d44b00c4","updated":"2023-08-22 10:07:12.000000000","message":"Done","commit_id":"c29f93f514250fa94be6b669c9ea729b2fc531f7"}],"api-ref/source/v2/examples/listener-create-curl":[{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"b7664df71eed60fe7e37d22519832f4c332ffc63","unresolved":true,"context_lines":[{"line_number":1,"context_line":"curl -X POST -H \"Content-Type: application/json\" -H \"X-Auth-Token: \u003ctoken\u003e\" -d \u0027{\"listener\": {\"protocol\": \"TERMINATED_HTTPS\", \"description\": \"A great TLS listener\", \"admin_state_up\": true, \"connection_limit\": 200, \"protocol_port\": \"443\", \"loadbalancer_id\": \"607226db-27ef-4d41-ae89-f2a800e9c2db\", \"name\": \"great_tls_listener\", \"insert_headers\": {\"X-Forwarded-For\": \"true\", \"X-Forwarded-Port\": \"true\"}, \"default_tls_container_ref\": \"http://198.51.100.10:9311/v1/containers/a570068c-d295-4780-91d4-3046a325db51\", \"sni_container_refs\": [\"http://198.51.100.10:9311/v1/containers/a570068c-d295-4780-91d4-3046a325db51\", \"http://198.51.100.10:9311/v1/containers/aaebb31e-7761-4826-8cb4-2b829caca3ee\"], \"timeout_client_data\": 50000, \"timeout_member_connect\": 5000, \"timeout_member_data\": 50000, \"timeout_tcp_inspect\": 0, \"tags\": [\"test_tag\"], \"client_ca_tls_container_ref\": \"http://198.51.100.10:9311/v1/containers/35649991-49f3-4625-81ce-2465fe8932e5\", \"client_authentication\": \"MANDATORY\", \"client_crl_container_ref\": \"http://198.51.100.10:9311/v1/containers/e222b065-b93b-4e2a-9a02-804b7a118c3c\", \"allowed_cidrs\": [\"192.0.2.0/24\", \"198.51.100.0/24\"], \"tls_ciphers\": \"ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256\", \"tls_versions\": [\"TLSv1.2\", \"TLSv1.3\"], \"alpn_protocols\": [\"http/1.1\", \"http/1.0\"], \"hsts_include_subdomains\": false, \"hsts_max_age\": null, \"hsts_preload\": false}}\u0027 http://198.51.100.10:9876/v2/lbaas/listeners"}],"source_content_type":"application/octet-stream","patch_set":34,"id":"7601840c_10c69dd1","line":1,"range":{"start_line":1,"start_character":1338,"end_line":1,"end_character":1358},"updated":"2023-08-17 21:00:45.000000000","message":"This null is confusing. The API-ref for hsts_include_subdomains states that hsts_max_age must be set, but the examples have \"null\" for the hsts_max_age.\nAlso, the way I read the RFC, it needs to be 0 or more if set. So null should be invalid on create.\nnull could be used with an UPDATE call to disable hsts, but does not seem valid on create.","commit_id":"c29f93f514250fa94be6b669c9ea729b2fc531f7"},{"author":{"_account_id":34429,"name":"Tom Weininger","email":"dienste@weinimo.de","username":"tweining"},"change_message_id":"11bb50d956170e10ed3ea26c00309f843d5fe516","unresolved":false,"context_lines":[{"line_number":1,"context_line":"curl -X POST -H \"Content-Type: application/json\" -H \"X-Auth-Token: \u003ctoken\u003e\" -d \u0027{\"listener\": {\"protocol\": \"TERMINATED_HTTPS\", \"description\": \"A great TLS listener\", \"admin_state_up\": true, \"connection_limit\": 200, \"protocol_port\": \"443\", \"loadbalancer_id\": \"607226db-27ef-4d41-ae89-f2a800e9c2db\", \"name\": \"great_tls_listener\", \"insert_headers\": {\"X-Forwarded-For\": \"true\", \"X-Forwarded-Port\": \"true\"}, \"default_tls_container_ref\": \"http://198.51.100.10:9311/v1/containers/a570068c-d295-4780-91d4-3046a325db51\", \"sni_container_refs\": [\"http://198.51.100.10:9311/v1/containers/a570068c-d295-4780-91d4-3046a325db51\", \"http://198.51.100.10:9311/v1/containers/aaebb31e-7761-4826-8cb4-2b829caca3ee\"], \"timeout_client_data\": 50000, \"timeout_member_connect\": 5000, \"timeout_member_data\": 50000, \"timeout_tcp_inspect\": 0, \"tags\": [\"test_tag\"], \"client_ca_tls_container_ref\": \"http://198.51.100.10:9311/v1/containers/35649991-49f3-4625-81ce-2465fe8932e5\", \"client_authentication\": \"MANDATORY\", \"client_crl_container_ref\": \"http://198.51.100.10:9311/v1/containers/e222b065-b93b-4e2a-9a02-804b7a118c3c\", \"allowed_cidrs\": [\"192.0.2.0/24\", \"198.51.100.0/24\"], \"tls_ciphers\": \"ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256\", \"tls_versions\": [\"TLSv1.2\", \"TLSv1.3\"], \"alpn_protocols\": [\"http/1.1\", \"http/1.0\"], \"hsts_include_subdomains\": false, \"hsts_max_age\": null, \"hsts_preload\": false}}\u0027 http://198.51.100.10:9876/v2/lbaas/listeners"}],"source_content_type":"application/octet-stream","patch_set":34,"id":"213c3825_7bd239aa","line":1,"range":{"start_line":1,"start_character":1338,"end_line":1,"end_character":1358},"in_reply_to":"10e8ec25_b7844eb8","updated":"2023-08-22 13:47:59.000000000","message":"After looking at my implementation again more closely, and after adding another unit test, I saw that a null/None value is used for disabling the HSTS feature. Hence it is actually a valid value.","commit_id":"c29f93f514250fa94be6b669c9ea729b2fc531f7"},{"author":{"_account_id":34429,"name":"Tom Weininger","email":"dienste@weinimo.de","username":"tweining"},"change_message_id":"5cbb84a74b8a9d03c82ac715215cb24aac33ce80","unresolved":false,"context_lines":[{"line_number":1,"context_line":"curl -X POST -H \"Content-Type: application/json\" -H \"X-Auth-Token: \u003ctoken\u003e\" -d \u0027{\"listener\": {\"protocol\": \"TERMINATED_HTTPS\", \"description\": \"A great TLS listener\", \"admin_state_up\": true, \"connection_limit\": 200, \"protocol_port\": \"443\", \"loadbalancer_id\": \"607226db-27ef-4d41-ae89-f2a800e9c2db\", \"name\": \"great_tls_listener\", \"insert_headers\": {\"X-Forwarded-For\": \"true\", \"X-Forwarded-Port\": \"true\"}, \"default_tls_container_ref\": \"http://198.51.100.10:9311/v1/containers/a570068c-d295-4780-91d4-3046a325db51\", \"sni_container_refs\": [\"http://198.51.100.10:9311/v1/containers/a570068c-d295-4780-91d4-3046a325db51\", \"http://198.51.100.10:9311/v1/containers/aaebb31e-7761-4826-8cb4-2b829caca3ee\"], \"timeout_client_data\": 50000, \"timeout_member_connect\": 5000, \"timeout_member_data\": 50000, \"timeout_tcp_inspect\": 0, \"tags\": [\"test_tag\"], \"client_ca_tls_container_ref\": \"http://198.51.100.10:9311/v1/containers/35649991-49f3-4625-81ce-2465fe8932e5\", \"client_authentication\": \"MANDATORY\", \"client_crl_container_ref\": \"http://198.51.100.10:9311/v1/containers/e222b065-b93b-4e2a-9a02-804b7a118c3c\", \"allowed_cidrs\": [\"192.0.2.0/24\", \"198.51.100.0/24\"], \"tls_ciphers\": \"ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256\", \"tls_versions\": [\"TLSv1.2\", \"TLSv1.3\"], \"alpn_protocols\": [\"http/1.1\", \"http/1.0\"], \"hsts_include_subdomains\": false, \"hsts_max_age\": null, \"hsts_preload\": false}}\u0027 http://198.51.100.10:9876/v2/lbaas/listeners"}],"source_content_type":"application/octet-stream","patch_set":34,"id":"10e8ec25_b7844eb8","line":1,"range":{"start_line":1,"start_character":1338,"end_line":1,"end_character":1358},"in_reply_to":"7601840c_10c69dd1","updated":"2023-08-22 10:07:12.000000000","message":"`hsts_max_age` must be set only in order to activate the HSTS feature. Ie. `hsts_include_subdomains` has no effect unless `hsts_max_age` is set as well. IDK how to make that less confusing.\nRegarding the `null` value: I don\u0027t remember the exact reason for setting that value here and with the latest changes to the validation these examples are now outdated. I will update them. However, `null` (or `None` in Python) is commonly used to denote the absence of a value, hence it should not be treated as invalid IMO.","commit_id":"c29f93f514250fa94be6b669c9ea729b2fc531f7"}],"api-ref/source/v2/examples/listener-create-request.json":[{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"b7664df71eed60fe7e37d22519832f4c332ffc63","unresolved":true,"context_lines":[{"line_number":32,"context_line":"        \"tls_versions\": [\"TLSv1.2\", \"TLSv1.3\"],"},{"line_number":33,"context_line":"        \"alpn_protocols\": [\"http/1.1\", \"http/1.0\"],"},{"line_number":34,"context_line":"        \"hsts_include_subdomains\": true,"},{"line_number":35,"context_line":"        \"hsts_max_age\": null,"},{"line_number":36,"context_line":"        \"hsts_preload\": true"},{"line_number":37,"context_line":"    }"},{"line_number":38,"context_line":"}"}],"source_content_type":"application/json","patch_set":34,"id":"1dc29396_07968738","line":35,"range":{"start_line":35,"start_character":24,"end_line":35,"end_character":29},"updated":"2023-08-17 21:00:45.000000000","message":"Same, shouldn\u0027t null be invalid?","commit_id":"c29f93f514250fa94be6b669c9ea729b2fc531f7"},{"author":{"_account_id":34429,"name":"Tom Weininger","email":"dienste@weinimo.de","username":"tweining"},"change_message_id":"5cbb84a74b8a9d03c82ac715215cb24aac33ce80","unresolved":false,"context_lines":[{"line_number":32,"context_line":"        \"tls_versions\": [\"TLSv1.2\", \"TLSv1.3\"],"},{"line_number":33,"context_line":"        \"alpn_protocols\": [\"http/1.1\", \"http/1.0\"],"},{"line_number":34,"context_line":"        \"hsts_include_subdomains\": true,"},{"line_number":35,"context_line":"        \"hsts_max_age\": null,"},{"line_number":36,"context_line":"        \"hsts_preload\": true"},{"line_number":37,"context_line":"    }"},{"line_number":38,"context_line":"}"}],"source_content_type":"application/json","patch_set":34,"id":"bff5cd4d_00bce73d","line":35,"range":{"start_line":35,"start_character":24,"end_line":35,"end_character":29},"in_reply_to":"1dc29396_07968738","updated":"2023-08-22 10:07:12.000000000","message":"Done","commit_id":"c29f93f514250fa94be6b669c9ea729b2fc531f7"}],"api-ref/source/v2/examples/listener-create-response.json":[{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"b7664df71eed60fe7e37d22519832f4c332ffc63","unresolved":true,"context_lines":[{"line_number":47,"context_line":"        \"tls_versions\": [\"TLSv1.2\", \"TLSv1.3\"],"},{"line_number":48,"context_line":"        \"alpn_protocols\": [\"http/1.1\", \"http/1.0\"],"},{"line_number":49,"context_line":"        \"hsts_include_subdomains\": true,"},{"line_number":50,"context_line":"        \"hsts_max_age\": null,"},{"line_number":51,"context_line":"        \"hsts_preload\": true"},{"line_number":52,"context_line":"    }"},{"line_number":53,"context_line":"}"}],"source_content_type":"application/json","patch_set":34,"id":"eb35a0b9_657d3461","line":50,"range":{"start_line":50,"start_character":23,"end_line":50,"end_character":29},"updated":"2023-08-17 21:00:45.000000000","message":"Same","commit_id":"c29f93f514250fa94be6b669c9ea729b2fc531f7"},{"author":{"_account_id":34429,"name":"Tom Weininger","email":"dienste@weinimo.de","username":"tweining"},"change_message_id":"5cbb84a74b8a9d03c82ac715215cb24aac33ce80","unresolved":false,"context_lines":[{"line_number":47,"context_line":"        \"tls_versions\": [\"TLSv1.2\", \"TLSv1.3\"],"},{"line_number":48,"context_line":"        \"alpn_protocols\": [\"http/1.1\", \"http/1.0\"],"},{"line_number":49,"context_line":"        \"hsts_include_subdomains\": true,"},{"line_number":50,"context_line":"        \"hsts_max_age\": null,"},{"line_number":51,"context_line":"        \"hsts_preload\": true"},{"line_number":52,"context_line":"    }"},{"line_number":53,"context_line":"}"}],"source_content_type":"application/json","patch_set":34,"id":"68fcdee9_c81b7ba4","line":50,"range":{"start_line":50,"start_character":23,"end_line":50,"end_character":29},"in_reply_to":"eb35a0b9_657d3461","updated":"2023-08-22 10:07:12.000000000","message":"Done","commit_id":"c29f93f514250fa94be6b669c9ea729b2fc531f7"}],"api-ref/source/v2/examples/listener-show-response.json":[{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"b7664df71eed60fe7e37d22519832f4c332ffc63","unresolved":true,"context_lines":[{"line_number":47,"context_line":"        \"tls_versions\": [\"TLSv1.2\", \"TLSv1.3\"],"},{"line_number":48,"context_line":"        \"alpn_protocols\": [\"http/1.1\", \"http/1.0\"],"},{"line_number":49,"context_line":"        \"hsts_include_subdomains\": true,"},{"line_number":50,"context_line":"        \"hsts_max_age\": null,"},{"line_number":51,"context_line":"        \"hsts_preload\": true"},{"line_number":52,"context_line":"    }"},{"line_number":53,"context_line":"}"}],"source_content_type":"application/json","patch_set":34,"id":"ff6784bf_13eb058b","line":50,"range":{"start_line":50,"start_character":23,"end_line":50,"end_character":29},"updated":"2023-08-17 21:00:45.000000000","message":"Same","commit_id":"c29f93f514250fa94be6b669c9ea729b2fc531f7"},{"author":{"_account_id":34429,"name":"Tom Weininger","email":"dienste@weinimo.de","username":"tweining"},"change_message_id":"5cbb84a74b8a9d03c82ac715215cb24aac33ce80","unresolved":false,"context_lines":[{"line_number":47,"context_line":"        \"tls_versions\": [\"TLSv1.2\", \"TLSv1.3\"],"},{"line_number":48,"context_line":"        \"alpn_protocols\": [\"http/1.1\", \"http/1.0\"],"},{"line_number":49,"context_line":"        \"hsts_include_subdomains\": true,"},{"line_number":50,"context_line":"        \"hsts_max_age\": null,"},{"line_number":51,"context_line":"        \"hsts_preload\": true"},{"line_number":52,"context_line":"    }"},{"line_number":53,"context_line":"}"}],"source_content_type":"application/json","patch_set":34,"id":"9fd1f54d_2ec23419","line":50,"range":{"start_line":50,"start_character":23,"end_line":50,"end_character":29},"in_reply_to":"ff6784bf_13eb058b","updated":"2023-08-22 10:07:12.000000000","message":"Done","commit_id":"c29f93f514250fa94be6b669c9ea729b2fc531f7"}],"api-ref/source/v2/examples/listener-update-request.json":[{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"b7664df71eed60fe7e37d22519832f4c332ffc63","unresolved":true,"context_lines":[{"line_number":27,"context_line":"        \"tls_ciphers\": \"ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256\","},{"line_number":28,"context_line":"        \"tls_versions\": [\"TLSv1.2\", \"TLSv1.3\"],"},{"line_number":29,"context_line":"        \"alpn_protocols\": [\"http/1.1\", \"http/1.0\"],"},{"line_number":30,"context_line":"        \"hsts_include_subdomains\": true,"},{"line_number":31,"context_line":"        \"hsts_max_age\": null,"},{"line_number":32,"context_line":"        \"hsts_preload\": true"},{"line_number":33,"context_line":"    }"}],"source_content_type":"application/json","patch_set":34,"id":"10ea1c72_948a3b65","line":30,"range":{"start_line":30,"start_character":34,"end_line":30,"end_character":40},"updated":"2023-08-17 21:00:45.000000000","message":"The curl example has false for these two booleans. The examples should be consistent.\nI think this as true, with hsts_max_age of null would be invalid","commit_id":"c29f93f514250fa94be6b669c9ea729b2fc531f7"},{"author":{"_account_id":34429,"name":"Tom Weininger","email":"dienste@weinimo.de","username":"tweining"},"change_message_id":"5cbb84a74b8a9d03c82ac715215cb24aac33ce80","unresolved":false,"context_lines":[{"line_number":27,"context_line":"        \"tls_ciphers\": \"ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256\","},{"line_number":28,"context_line":"        \"tls_versions\": [\"TLSv1.2\", \"TLSv1.3\"],"},{"line_number":29,"context_line":"        \"alpn_protocols\": [\"http/1.1\", \"http/1.0\"],"},{"line_number":30,"context_line":"        \"hsts_include_subdomains\": true,"},{"line_number":31,"context_line":"        \"hsts_max_age\": null,"},{"line_number":32,"context_line":"        \"hsts_preload\": true"},{"line_number":33,"context_line":"    }"}],"source_content_type":"application/json","patch_set":34,"id":"cc55cd23_dcbd7ad7","line":30,"range":{"start_line":30,"start_character":34,"end_line":30,"end_character":40},"in_reply_to":"10ea1c72_948a3b65","updated":"2023-08-22 10:07:12.000000000","message":"Done","commit_id":"c29f93f514250fa94be6b669c9ea729b2fc531f7"}],"api-ref/source/v2/examples/listener-update-response.json":[{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"b7664df71eed60fe7e37d22519832f4c332ffc63","unresolved":true,"context_lines":[{"line_number":46,"context_line":"        \"tls_ciphers\": \"ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256\","},{"line_number":47,"context_line":"        \"tls_versions\": [\"TLSv1.2\", \"TLSv1.3\"],"},{"line_number":48,"context_line":"        \"alpn_protocols\": [\"http/1.1\", \"http/1.0\"],"},{"line_number":49,"context_line":"        \"hsts_include_subdomains\": true,"},{"line_number":50,"context_line":"        \"hsts_max_age\": null,"},{"line_number":51,"context_line":"        \"hsts_preload\": true"},{"line_number":52,"context_line":"    }"}],"source_content_type":"application/json","patch_set":34,"id":"4c191152_4ee97258","line":49,"updated":"2023-08-17 21:00:45.000000000","message":"Same comment here as on the request.","commit_id":"c29f93f514250fa94be6b669c9ea729b2fc531f7"},{"author":{"_account_id":34429,"name":"Tom Weininger","email":"dienste@weinimo.de","username":"tweining"},"change_message_id":"5cbb84a74b8a9d03c82ac715215cb24aac33ce80","unresolved":false,"context_lines":[{"line_number":46,"context_line":"        \"tls_ciphers\": \"ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256\","},{"line_number":47,"context_line":"        \"tls_versions\": [\"TLSv1.2\", \"TLSv1.3\"],"},{"line_number":48,"context_line":"        \"alpn_protocols\": [\"http/1.1\", \"http/1.0\"],"},{"line_number":49,"context_line":"        \"hsts_include_subdomains\": true,"},{"line_number":50,"context_line":"        \"hsts_max_age\": null,"},{"line_number":51,"context_line":"        \"hsts_preload\": true"},{"line_number":52,"context_line":"    }"}],"source_content_type":"application/json","patch_set":34,"id":"98e6bfe4_46b64f5b","line":49,"in_reply_to":"4c191152_4ee97258","updated":"2023-08-22 10:07:12.000000000","message":"Done","commit_id":"c29f93f514250fa94be6b669c9ea729b2fc531f7"}],"api-ref/source/v2/listener.inc":[{"author":{"_account_id":29244,"name":"Gregory Thiemonge","email":"gthiemon@redhat.com","username":"gthiemonge"},"change_message_id":"cc2f2826631677da2a72a5c5e08852d216ce0fc0","unresolved":true,"context_lines":[{"line_number":280,"context_line":"   - default_pool_id: default_pool_id"},{"line_number":281,"context_line":"   - default_tls_container_ref: default_tls_container_ref"},{"line_number":282,"context_line":"   - description: description"},{"line_number":283,"context_line":"   - hsts_include_subdomains: hsts_include_subdomains-optional"},{"line_number":284,"context_line":"   - hsts_max_age: hsts_max_age-optional"},{"line_number":285,"context_line":"   - hsts_preload: hsts_preload-optional"},{"line_number":286,"context_line":"   - id: listener-id"}],"source_content_type":"text/x-c++src","patch_set":25,"id":"4277a47d_823e7de9","line":283,"range":{"start_line":283,"start_character":53,"end_line":283,"end_character":62},"updated":"2023-07-18 06:52:23.000000000","message":"we should use the non -optional parameter for the responses","commit_id":"68eda5114c9000f8ece5e4d31121d586b5f88dc1"},{"author":{"_account_id":34429,"name":"Tom Weininger","email":"dienste@weinimo.de","username":"tweining"},"change_message_id":"a5abb51249df1270756d8090af0a0039df72a81b","unresolved":false,"context_lines":[{"line_number":280,"context_line":"   - default_pool_id: default_pool_id"},{"line_number":281,"context_line":"   - default_tls_container_ref: default_tls_container_ref"},{"line_number":282,"context_line":"   - description: description"},{"line_number":283,"context_line":"   - hsts_include_subdomains: hsts_include_subdomains-optional"},{"line_number":284,"context_line":"   - hsts_max_age: hsts_max_age-optional"},{"line_number":285,"context_line":"   - hsts_preload: hsts_preload-optional"},{"line_number":286,"context_line":"   - id: listener-id"}],"source_content_type":"text/x-c++src","patch_set":25,"id":"7cabdefa_d515095b","line":283,"range":{"start_line":283,"start_character":53,"end_line":283,"end_character":62},"in_reply_to":"4277a47d_823e7de9","updated":"2023-07-18 09:59:58.000000000","message":"Done","commit_id":"68eda5114c9000f8ece5e4d31121d586b5f88dc1"},{"author":{"_account_id":29244,"name":"Gregory Thiemonge","email":"gthiemon@redhat.com","username":"gthiemonge"},"change_message_id":"cc2f2826631677da2a72a5c5e08852d216ce0fc0","unresolved":true,"context_lines":[{"line_number":480,"context_line":"   - default_pool_id: default_pool_id"},{"line_number":481,"context_line":"   - default_tls_container_ref: default_tls_container_ref"},{"line_number":482,"context_line":"   - description: description"},{"line_number":483,"context_line":"   - hsts_include_subdomains: hsts_include_subdomains-optional"},{"line_number":484,"context_line":"   - hsts_max_age: hsts_max_age-optional"},{"line_number":485,"context_line":"   - hsts_preload: hsts_preload-optional"},{"line_number":486,"context_line":"   - id: listener-id"}],"source_content_type":"text/x-c++src","patch_set":25,"id":"c4d620be_87e3c701","line":483,"range":{"start_line":483,"start_character":54,"end_line":483,"end_character":62},"updated":"2023-07-18 06:52:23.000000000","message":"same here","commit_id":"68eda5114c9000f8ece5e4d31121d586b5f88dc1"},{"author":{"_account_id":34429,"name":"Tom Weininger","email":"dienste@weinimo.de","username":"tweining"},"change_message_id":"a5abb51249df1270756d8090af0a0039df72a81b","unresolved":false,"context_lines":[{"line_number":480,"context_line":"   - default_pool_id: default_pool_id"},{"line_number":481,"context_line":"   - default_tls_container_ref: default_tls_container_ref"},{"line_number":482,"context_line":"   - description: description"},{"line_number":483,"context_line":"   - hsts_include_subdomains: hsts_include_subdomains-optional"},{"line_number":484,"context_line":"   - hsts_max_age: hsts_max_age-optional"},{"line_number":485,"context_line":"   - hsts_preload: hsts_preload-optional"},{"line_number":486,"context_line":"   - id: listener-id"}],"source_content_type":"text/x-c++src","patch_set":25,"id":"feecafa5_13b8a934","line":483,"range":{"start_line":483,"start_character":54,"end_line":483,"end_character":62},"in_reply_to":"c4d620be_87e3c701","updated":"2023-07-18 09:59:58.000000000","message":"Done","commit_id":"68eda5114c9000f8ece5e4d31121d586b5f88dc1"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"b7664df71eed60fe7e37d22519832f4c332ffc63","unresolved":true,"context_lines":[{"line_number":56,"context_line":"   - default_pool_id: default_pool_id"},{"line_number":57,"context_line":"   - default_tls_container_ref: default_tls_container_ref"},{"line_number":58,"context_line":"   - description: description"},{"line_number":59,"context_line":"   - id: listener-id"},{"line_number":60,"context_line":"   - insert_headers: insert_headers"},{"line_number":61,"context_line":"   - l7policies: l7policy-ids"},{"line_number":62,"context_line":"   - listener: listener"}],"source_content_type":"text/x-c++src","patch_set":34,"id":"01cd5428_3a0a6e23","line":59,"updated":"2023-08-17 21:00:45.000000000","message":"The hsts parameters are missing here. In the Octavia API, all parameters are returned in a list call if not filtered.","commit_id":"c29f93f514250fa94be6b669c9ea729b2fc531f7"},{"author":{"_account_id":34429,"name":"Tom Weininger","email":"dienste@weinimo.de","username":"tweining"},"change_message_id":"5cbb84a74b8a9d03c82ac715215cb24aac33ce80","unresolved":false,"context_lines":[{"line_number":56,"context_line":"   - default_pool_id: default_pool_id"},{"line_number":57,"context_line":"   - default_tls_container_ref: default_tls_container_ref"},{"line_number":58,"context_line":"   - description: description"},{"line_number":59,"context_line":"   - id: listener-id"},{"line_number":60,"context_line":"   - insert_headers: insert_headers"},{"line_number":61,"context_line":"   - l7policies: l7policy-ids"},{"line_number":62,"context_line":"   - listener: listener"}],"source_content_type":"text/x-c++src","patch_set":34,"id":"c0c5d2b8_dd0cdffb","line":59,"in_reply_to":"01cd5428_3a0a6e23","updated":"2023-08-22 10:07:12.000000000","message":"Done","commit_id":"c29f93f514250fa94be6b669c9ea729b2fc531f7"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"b7664df71eed60fe7e37d22519832f4c332ffc63","unresolved":true,"context_lines":[{"line_number":80,"context_line":"Response Example"},{"line_number":81,"context_line":"----------------"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":".. literalinclude:: examples/listeners-list-response.json"},{"line_number":84,"context_line":"   :language: javascript"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"Create Listener"}],"source_content_type":"text/x-c++src","patch_set":34,"id":"ff70a9ae_f695336b","line":83,"updated":"2023-08-17 21:00:45.000000000","message":"hsts parameters are missing in this example.","commit_id":"c29f93f514250fa94be6b669c9ea729b2fc531f7"},{"author":{"_account_id":34429,"name":"Tom Weininger","email":"dienste@weinimo.de","username":"tweining"},"change_message_id":"5cbb84a74b8a9d03c82ac715215cb24aac33ce80","unresolved":false,"context_lines":[{"line_number":80,"context_line":"Response Example"},{"line_number":81,"context_line":"----------------"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":".. literalinclude:: examples/listeners-list-response.json"},{"line_number":84,"context_line":"   :language: javascript"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"Create Listener"}],"source_content_type":"text/x-c++src","patch_set":34,"id":"2e091604_51554f59","line":83,"in_reply_to":"ff70a9ae_f695336b","updated":"2023-08-22 10:07:12.000000000","message":"Done","commit_id":"c29f93f514250fa94be6b669c9ea729b2fc531f7"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"b7664df71eed60fe7e37d22519832f4c332ffc63","unresolved":true,"context_lines":[{"line_number":364,"context_line":"   - default_pool_id: default_pool_id"},{"line_number":365,"context_line":"   - default_tls_container_ref: default_tls_container_ref"},{"line_number":366,"context_line":"   - description: description"},{"line_number":367,"context_line":"   - hsts_include_subdomains: hsts_include_subdomains-optional"},{"line_number":368,"context_line":"   - hsts_max_age: hsts_max_age-optional"},{"line_number":369,"context_line":"   - hsts_preload: hsts_preload-optional"},{"line_number":370,"context_line":"   - id: listener-id"}],"source_content_type":"text/x-c++src","patch_set":34,"id":"44a8bb93_25a4ba70","line":367,"updated":"2023-08-17 21:00:45.000000000","message":"This is a response definition, so these should not be optional, the API will always return them.","commit_id":"c29f93f514250fa94be6b669c9ea729b2fc531f7"},{"author":{"_account_id":34429,"name":"Tom Weininger","email":"dienste@weinimo.de","username":"tweining"},"change_message_id":"5cbb84a74b8a9d03c82ac715215cb24aac33ce80","unresolved":false,"context_lines":[{"line_number":364,"context_line":"   - default_pool_id: default_pool_id"},{"line_number":365,"context_line":"   - default_tls_container_ref: default_tls_container_ref"},{"line_number":366,"context_line":"   - description: description"},{"line_number":367,"context_line":"   - hsts_include_subdomains: hsts_include_subdomains-optional"},{"line_number":368,"context_line":"   - hsts_max_age: hsts_max_age-optional"},{"line_number":369,"context_line":"   - hsts_preload: hsts_preload-optional"},{"line_number":370,"context_line":"   - id: listener-id"}],"source_content_type":"text/x-c++src","patch_set":34,"id":"771147f3_506a12a7","line":367,"in_reply_to":"44a8bb93_25a4ba70","updated":"2023-08-22 10:07:12.000000000","message":"Done","commit_id":"c29f93f514250fa94be6b669c9ea729b2fc531f7"}],"octavia/api/v2/controllers/listener.py":[{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"7133b80e8bc441403a15abfb0e32ac030f156e51","unresolved":true,"context_lines":[{"line_number":169,"context_line":"                raise exceptions.ValidationException("},{"line_number":170,"context_line":"                    detail\u003dmsg % {\u0027cidr\u0027: cidr, \u0027vips\u0027: vips})"},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"    def _validate_create_listener(self, lock_session, listener_dict):"},{"line_number":173,"context_line":"        \"\"\"Validate listener for wrong protocol or duplicate listeners"},{"line_number":174,"context_line":""},{"line_number":175,"context_line":"        Update the load balancer db when provisioning status changes."}],"source_content_type":"text/x-python","patch_set":22,"id":"7c9a54ad_2f6c822d","line":172,"updated":"2023-06-30 20:12:58.000000000","message":"We need to add validation here to make sure setting HSTS values is valid.\n\nI.e. specifying only the booleans, without the age\nI.e. setting HSTS on a UDP listener","commit_id":"2b08eaf24c47f2de23dcff62371157e8f5724993"},{"author":{"_account_id":34429,"name":"Tom Weininger","email":"dienste@weinimo.de","username":"tweining"},"change_message_id":"80f4c9368fa395a3b125d702d49c92e132ae0a3f","unresolved":false,"context_lines":[{"line_number":169,"context_line":"                raise exceptions.ValidationException("},{"line_number":170,"context_line":"                    detail\u003dmsg % {\u0027cidr\u0027: cidr, \u0027vips\u0027: vips})"},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"    def _validate_create_listener(self, lock_session, listener_dict):"},{"line_number":173,"context_line":"        \"\"\"Validate listener for wrong protocol or duplicate listeners"},{"line_number":174,"context_line":""},{"line_number":175,"context_line":"        Update the load balancer db when provisioning status changes."}],"source_content_type":"text/x-python","patch_set":22,"id":"9c435448_bcacef84","line":172,"in_reply_to":"7c9a54ad_2f6c822d","updated":"2023-07-17 16:14:16.000000000","message":"Added validation and unit tests.","commit_id":"2b08eaf24c47f2de23dcff62371157e8f5724993"},{"author":{"_account_id":29244,"name":"Gregory Thiemonge","email":"gthiemon@redhat.com","username":"gthiemonge"},"change_message_id":"e775157818527fe5bc6f5cbbcceb489e7c2bb736","unresolved":true,"context_lines":[{"line_number":324,"context_line":"            # Validate ALPN protocol list"},{"line_number":325,"context_line":"            validate.check_alpn_protocols(listener_dict[\u0027alpn_protocols\u0027])"},{"line_number":326,"context_line":""},{"line_number":327,"context_line":"        validate.check_hsts_options(listener_dict)"},{"line_number":328,"context_line":""},{"line_number":329,"context_line":"        try:"},{"line_number":330,"context_line":"            db_listener \u003d self.repositories.listener.create("}],"source_content_type":"text/x-python","patch_set":26,"id":"03351b6c_b4248528","line":327,"range":{"start_line":327,"start_character":17,"end_line":327,"end_character":35},"updated":"2023-07-18 12:53:21.000000000","message":"I think we should also check this in \"put\"\n\nRight now I\u0027m allowed to set preload and include-subdomains without setting max-age\n\nopenstack loadbalancer listener set --hsts-preload --hsts-include-subdomains  listener1","commit_id":"af2b72b7bfc7e666ef3cf488db31385ddee4830c"},{"author":{"_account_id":34429,"name":"Tom Weininger","email":"dienste@weinimo.de","username":"tweining"},"change_message_id":"baf503f7c56099d4768625bcde0e017f61ebdcee","unresolved":false,"context_lines":[{"line_number":324,"context_line":"            # Validate ALPN protocol list"},{"line_number":325,"context_line":"            validate.check_alpn_protocols(listener_dict[\u0027alpn_protocols\u0027])"},{"line_number":326,"context_line":""},{"line_number":327,"context_line":"        validate.check_hsts_options(listener_dict)"},{"line_number":328,"context_line":""},{"line_number":329,"context_line":"        try:"},{"line_number":330,"context_line":"            db_listener \u003d self.repositories.listener.create("}],"source_content_type":"text/x-python","patch_set":26,"id":"d9207042_afff74c4","line":327,"range":{"start_line":327,"start_character":17,"end_line":327,"end_character":35},"in_reply_to":"03351b6c_b4248528","updated":"2023-07-19 15:52:04.000000000","message":"Added validation for PUT requests as well.","commit_id":"af2b72b7bfc7e666ef3cf488db31385ddee4830c"}],"octavia/api/v2/types/listener.py":[{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"3f15f95f33d694b3c7c8fa339cf5b29eb33d41b1","unresolved":true,"context_lines":[{"line_number":63,"context_line":"    tls_ciphers \u003d wtypes.StringType()"},{"line_number":64,"context_line":"    tls_versions \u003d wtypes.wsattr(wtypes.ArrayType(wtypes.StringType()))"},{"line_number":65,"context_line":"    alpn_protocols \u003d wtypes.wsattr(wtypes.ArrayType(types.AlpnProtocolType()))"},{"line_number":66,"context_line":"    hsts_enabled \u003d wtypes.wsattr(bool)"},{"line_number":67,"context_line":"    hsts_header_opts \u003d wtypes.wsattr(wtypes.StringType())"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    @classmethod"}],"source_content_type":"text/x-python","patch_set":2,"id":"10d903ab_f7cd2c3d","line":66,"updated":"2023-04-19 16:22:49.000000000","message":"Do we need an enable? The HSTS RFC states that directives are required[1], so this doesn\u0027t make sense to me as a separate option.\n\n[1] https://www.rfc-editor.org/rfc/rfc6797#section-6.1.1","commit_id":"1c8501813d9738f87ff523c58168aa0e238ef922"},{"author":{"_account_id":34429,"name":"Tom Weininger","email":"dienste@weinimo.de","username":"tweining"},"change_message_id":"b6a7f0d2e59bea531afc79d302baccb009ed373d","unresolved":true,"context_lines":[{"line_number":63,"context_line":"    tls_ciphers \u003d wtypes.StringType()"},{"line_number":64,"context_line":"    tls_versions \u003d wtypes.wsattr(wtypes.ArrayType(wtypes.StringType()))"},{"line_number":65,"context_line":"    alpn_protocols \u003d wtypes.wsattr(wtypes.ArrayType(types.AlpnProtocolType()))"},{"line_number":66,"context_line":"    hsts_enabled \u003d wtypes.wsattr(bool)"},{"line_number":67,"context_line":"    hsts_header_opts \u003d wtypes.wsattr(wtypes.StringType())"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    @classmethod"}],"source_content_type":"text/x-python","patch_set":2,"id":"99ae808c_d8e29399","line":66,"in_reply_to":"10d903ab_f7cd2c3d","updated":"2023-04-20 14:39:58.000000000","message":"Only max-age is required. IIUC, you suggest we have an option for each HSTS directive and use `hsts_max_age` in order to decide whether to enable that feature or not, right?","commit_id":"1c8501813d9738f87ff523c58168aa0e238ef922"},{"author":{"_account_id":34429,"name":"Tom Weininger","email":"dienste@weinimo.de","username":"tweining"},"change_message_id":"7b53f198757bd5bd3947f099b11e3f05431c3613","unresolved":false,"context_lines":[{"line_number":63,"context_line":"    tls_ciphers \u003d wtypes.StringType()"},{"line_number":64,"context_line":"    tls_versions \u003d wtypes.wsattr(wtypes.ArrayType(wtypes.StringType()))"},{"line_number":65,"context_line":"    alpn_protocols \u003d wtypes.wsattr(wtypes.ArrayType(types.AlpnProtocolType()))"},{"line_number":66,"context_line":"    hsts_enabled \u003d wtypes.wsattr(bool)"},{"line_number":67,"context_line":"    hsts_header_opts \u003d wtypes.wsattr(wtypes.StringType())"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    @classmethod"}],"source_content_type":"text/x-python","patch_set":2,"id":"b82f7174_fcfb9dd2","line":66,"in_reply_to":"99ae808c_d8e29399","updated":"2023-04-27 15:27:07.000000000","message":"Done","commit_id":"1c8501813d9738f87ff523c58168aa0e238ef922"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"3f15f95f33d694b3c7c8fa339cf5b29eb33d41b1","unresolved":true,"context_lines":[{"line_number":64,"context_line":"    tls_versions \u003d wtypes.wsattr(wtypes.ArrayType(wtypes.StringType()))"},{"line_number":65,"context_line":"    alpn_protocols \u003d wtypes.wsattr(wtypes.ArrayType(types.AlpnProtocolType()))"},{"line_number":66,"context_line":"    hsts_enabled \u003d wtypes.wsattr(bool)"},{"line_number":67,"context_line":"    hsts_header_opts \u003d wtypes.wsattr(wtypes.StringType())"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    @classmethod"},{"line_number":70,"context_line":"    def from_data_model(cls, data_model, children\u003dFalse):"}],"source_content_type":"text/x-python","patch_set":2,"id":"252293e2_605c2adc","line":67,"updated":"2023-04-19 16:22:49.000000000","message":"I lean towards having defined options here. Otherwise validation is going to get messy. We don\u0027t want to allow free-form pass through settings as it opens injection risk.","commit_id":"1c8501813d9738f87ff523c58168aa0e238ef922"},{"author":{"_account_id":34429,"name":"Tom Weininger","email":"dienste@weinimo.de","username":"tweining"},"change_message_id":"7b53f198757bd5bd3947f099b11e3f05431c3613","unresolved":false,"context_lines":[{"line_number":64,"context_line":"    tls_versions \u003d wtypes.wsattr(wtypes.ArrayType(wtypes.StringType()))"},{"line_number":65,"context_line":"    alpn_protocols \u003d wtypes.wsattr(wtypes.ArrayType(types.AlpnProtocolType()))"},{"line_number":66,"context_line":"    hsts_enabled \u003d wtypes.wsattr(bool)"},{"line_number":67,"context_line":"    hsts_header_opts \u003d wtypes.wsattr(wtypes.StringType())"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    @classmethod"},{"line_number":70,"context_line":"    def from_data_model(cls, data_model, children\u003dFalse):"}],"source_content_type":"text/x-python","patch_set":2,"id":"9d1181a9_9785849a","line":67,"in_reply_to":"252293e2_605c2adc","updated":"2023-04-27 15:27:07.000000000","message":"Done","commit_id":"1c8501813d9738f87ff523c58168aa0e238ef922"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"7133b80e8bc441403a15abfb0e32ac030f156e51","unresolved":true,"context_lines":[{"line_number":161,"context_line":"    tls_versions \u003d wtypes.wsattr(wtypes.ArrayType(wtypes.StringType("},{"line_number":162,"context_line":"        max_length\u003d32)))"},{"line_number":163,"context_line":"    alpn_protocols \u003d wtypes.wsattr(wtypes.ArrayType(types.AlpnProtocolType()))"},{"line_number":164,"context_line":"    hsts_max_age \u003d wtypes.wsattr(wtypes.IntegerType())"},{"line_number":165,"context_line":"    hsts_include_subdomains \u003d wtypes.wsattr(bool, default\u003dFalse)"},{"line_number":166,"context_line":"    hsts_preload \u003d wtypes.wsattr(bool, default\u003dFalse)"},{"line_number":167,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"8138dd70_db59e172","line":164,"updated":"2023-06-30 20:12:58.000000000","message":"I think we should set a minimum value of 0 here. Per the RFC, zero is a valid value, but negative values do not make sense.","commit_id":"2b08eaf24c47f2de23dcff62371157e8f5724993"},{"author":{"_account_id":34429,"name":"Tom Weininger","email":"dienste@weinimo.de","username":"tweining"},"change_message_id":"80f4c9368fa395a3b125d702d49c92e132ae0a3f","unresolved":false,"context_lines":[{"line_number":161,"context_line":"    tls_versions \u003d wtypes.wsattr(wtypes.ArrayType(wtypes.StringType("},{"line_number":162,"context_line":"        max_length\u003d32)))"},{"line_number":163,"context_line":"    alpn_protocols \u003d wtypes.wsattr(wtypes.ArrayType(types.AlpnProtocolType()))"},{"line_number":164,"context_line":"    hsts_max_age \u003d wtypes.wsattr(wtypes.IntegerType())"},{"line_number":165,"context_line":"    hsts_include_subdomains \u003d wtypes.wsattr(bool, default\u003dFalse)"},{"line_number":166,"context_line":"    hsts_preload \u003d wtypes.wsattr(bool, default\u003dFalse)"},{"line_number":167,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"2fd05046_9cdb5fc2","line":164,"in_reply_to":"8138dd70_db59e172","updated":"2023-07-17 16:14:16.000000000","message":"Done","commit_id":"2b08eaf24c47f2de23dcff62371157e8f5724993"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"b7664df71eed60fe7e37d22519832f4c332ffc63","unresolved":true,"context_lines":[{"line_number":205,"context_line":"    tls_versions \u003d wtypes.wsattr(wtypes.ArrayType(wtypes.StringType("},{"line_number":206,"context_line":"        max_length\u003d32)))"},{"line_number":207,"context_line":"    alpn_protocols \u003d wtypes.wsattr(wtypes.ArrayType(types.AlpnProtocolType()))"},{"line_number":208,"context_line":"    hsts_max_age \u003d wtypes.wsattr(wtypes.IntegerType())"},{"line_number":209,"context_line":"    hsts_include_subdomains \u003d wtypes.wsattr(bool)"},{"line_number":210,"context_line":"    hsts_preload \u003d wtypes.wsattr(bool)"},{"line_number":211,"context_line":""}],"source_content_type":"text/x-python","patch_set":34,"id":"fc0ef97c_063e2c5e","line":208,"updated":"2023-08-17 21:00:45.000000000","message":"This should also have validation:\nwtypes.IntegerType(minimum\u003d0)","commit_id":"c29f93f514250fa94be6b669c9ea729b2fc531f7"},{"author":{"_account_id":34429,"name":"Tom Weininger","email":"dienste@weinimo.de","username":"tweining"},"change_message_id":"5cbb84a74b8a9d03c82ac715215cb24aac33ce80","unresolved":false,"context_lines":[{"line_number":205,"context_line":"    tls_versions \u003d wtypes.wsattr(wtypes.ArrayType(wtypes.StringType("},{"line_number":206,"context_line":"        max_length\u003d32)))"},{"line_number":207,"context_line":"    alpn_protocols \u003d wtypes.wsattr(wtypes.ArrayType(types.AlpnProtocolType()))"},{"line_number":208,"context_line":"    hsts_max_age \u003d wtypes.wsattr(wtypes.IntegerType())"},{"line_number":209,"context_line":"    hsts_include_subdomains \u003d wtypes.wsattr(bool)"},{"line_number":210,"context_line":"    hsts_preload \u003d wtypes.wsattr(bool)"},{"line_number":211,"context_line":""}],"source_content_type":"text/x-python","patch_set":34,"id":"a980d873_6477ca7b","line":208,"in_reply_to":"fc0ef97c_063e2c5e","updated":"2023-08-22 10:07:12.000000000","message":"Done","commit_id":"c29f93f514250fa94be6b669c9ea729b2fc531f7"}],"octavia/common/validate.py":[{"author":{"_account_id":29244,"name":"Gregory Thiemonge","email":"gthiemon@redhat.com","username":"gthiemonge"},"change_message_id":"2d672aeb6b878f4be6119d9ba22df505f6d9a08d","unresolved":true,"context_lines":[{"line_number":554,"context_line":"def check_hsts_options_put(listener: _ListenerPUT,"},{"line_number":555,"context_line":"                           db_listener: data_models.Listener):"},{"line_number":556,"context_line":"    if ((listener.hsts_include_subdomains or listener.hsts_preload) and"},{"line_number":557,"context_line":"            all(obj.hsts_max_age is None for obj in (db_listener,"},{"line_number":558,"context_line":"                                                     listener))):"},{"line_number":559,"context_line":"        raise exceptions.ValidationException("},{"line_number":560,"context_line":"            detail\u003d_(\u0027Cannot enable hsts_include_subdomains or hsts_preload \u0027"}],"source_content_type":"text/x-python","patch_set":34,"id":"6dbb91dc_ecfe4818","line":557,"range":{"start_line":557,"start_character":16,"end_line":557,"end_character":40},"updated":"2023-08-17 13:16:42.000000000","message":"this is not correct, when not set, listener.hsts_max_age is not None, it\u0027s Unset","commit_id":"c29f93f514250fa94be6b669c9ea729b2fc531f7"},{"author":{"_account_id":34429,"name":"Tom Weininger","email":"dienste@weinimo.de","username":"tweining"},"change_message_id":"5cbb84a74b8a9d03c82ac715215cb24aac33ce80","unresolved":false,"context_lines":[{"line_number":554,"context_line":"def check_hsts_options_put(listener: _ListenerPUT,"},{"line_number":555,"context_line":"                           db_listener: data_models.Listener):"},{"line_number":556,"context_line":"    if ((listener.hsts_include_subdomains or listener.hsts_preload) and"},{"line_number":557,"context_line":"            all(obj.hsts_max_age is None for obj in (db_listener,"},{"line_number":558,"context_line":"                                                     listener))):"},{"line_number":559,"context_line":"        raise exceptions.ValidationException("},{"line_number":560,"context_line":"            detail\u003d_(\u0027Cannot enable hsts_include_subdomains or hsts_preload \u0027"}],"source_content_type":"text/x-python","patch_set":34,"id":"9eb1f7af_3b8ff80d","line":557,"range":{"start_line":557,"start_character":16,"end_line":557,"end_character":40},"in_reply_to":"113d7bec_63157406","updated":"2023-08-22 10:07:12.000000000","message":"Done","commit_id":"c29f93f514250fa94be6b669c9ea729b2fc531f7"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"b7664df71eed60fe7e37d22519832f4c332ffc63","unresolved":true,"context_lines":[{"line_number":554,"context_line":"def check_hsts_options_put(listener: _ListenerPUT,"},{"line_number":555,"context_line":"                           db_listener: data_models.Listener):"},{"line_number":556,"context_line":"    if ((listener.hsts_include_subdomains or listener.hsts_preload) and"},{"line_number":557,"context_line":"            all(obj.hsts_max_age is None for obj in (db_listener,"},{"line_number":558,"context_line":"                                                     listener))):"},{"line_number":559,"context_line":"        raise exceptions.ValidationException("},{"line_number":560,"context_line":"            detail\u003d_(\u0027Cannot enable hsts_include_subdomains or hsts_preload \u0027"}],"source_content_type":"text/x-python","patch_set":34,"id":"113d7bec_63157406","line":557,"range":{"start_line":557,"start_character":16,"end_line":557,"end_character":40},"in_reply_to":"6dbb91dc_ecfe4818","updated":"2023-08-17 21:00:45.000000000","message":"+1","commit_id":"c29f93f514250fa94be6b669c9ea729b2fc531f7"}]}
