)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":29632,"name":"Carlos Eduardo","email":"ces.eduardo98@gmail.com","username":"silvacarlos"},"change_message_id":"59113f5d0c1d52035a97814f6d012599d547794c","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"c64762a2_bb4edae2","updated":"2026-03-31 20:51:24.000000000","message":"Thanks for working on this Patch. We have discussed this in earlier occasions but we denied this request and we re-evaluate it from time to time. Some services do accept \u0027latest\u0027 as a valid microversion, yes. At the end should also be intentional and know which version we are using in the requests. I think it\u0027s worth revisiting that now and asking for more opinions.","commit_id":"1f860d3b3541941a0a9efda6283f8061cc1b8402"},{"author":{"_account_id":38940,"name":"Oluwasola Akintewe","display_name":"nathan_akin","email":"solaakintewe@gmail.com","username":"nathan_akin"},"change_message_id":"62cfdf95add8e84b5af1edca71edc2df392582ab","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"4f2c7eff_56c08bed","in_reply_to":"c64762a2_bb4edae2","updated":"2026-04-01 10:43:44.000000000","message":"hello carloss thanks for the feedback. i understand  i\u0027ll add the lowercase conversion to handle case variations. on the design question, can we talk about this on the channel? i\u0027m happy to do that if it helps move the discussion forward","commit_id":"1f860d3b3541941a0a9efda6283f8061cc1b8402"},{"author":{"_account_id":16643,"name":"Goutham Pacha Ravi","email":"gouthampravi@gmail.com","username":"gouthamr"},"change_message_id":"a1adca12589347cd2616910a7b086d694fee694d","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"cbbb62c1_0b569c44","updated":"2026-04-02 22:34:51.000000000","message":"Hey @solaakintewe@gmail.com:\n\nAs we discussed at the Manila meeting today, it was intentional to not support this \"latest\" keyword. In the microversion paradigm, having an unpredictable behavior was never the intention. Allowing the \"latest\" keyword would do just that. \n\nI\u0027d be against allowing this because it can perpetuate bad behavior and cause user angst. If it exists, people will end up using it and shoot themselves in the foot, and could hate the API.\n\nThe API SIG guideline around this [1] says servers should support \"latest\" and resolve it to the maximum version. But it includes this warning:\n\n\"The latest value is mostly meant for integration testing and would be dangerous to rely on in client code since microversions are not following semver and therefore backward compatibility is not guaranteed.\"\n\n\nSo, some arguments For:\n\n  - Spec compliance — the API-SIG guideline says servers should support it; Nova, Cinder, and other projects do\n  - Integration testing convenience — tempest tests and developer tooling can use latest without knowing the current max version of the deployment\n  - Discoverability — a quick way to explore what the newest API behavior looks like without checking docs first\n\nArguments Against:\n\n  - Breaks client stability — a client using latest today gets 2.95 behavior; after a Manila upgrade it silently gets 2.96 behavior, which may drop fields,\n  change defaults, or require new parameters. The client breaks with no code change\n  - Microversions are not semver — each bump can be a breaking change for consumers of specific response fields. latest gives you no contract\n  - Encourages bad practice — once latest exists, lazy integrations will use it in production. The spec warning is rarely read. Nova has seen real incidents\n  from this\n  - No meaningful tool will use it — the official clients always negotiate a specific version. \"latest\" has no real consumer in the ecosystem\n  - Testing can use the version constant — tempest and manila-tempest-plugin already know the max version via the version discovery API (GET /). They don\u0027t\n  need a magic string\n\n\nSo, the API SIG spec says to support it, but the spec also says don\u0027t use it. The practical benefit is marginal — it saves one API call to discover the max version. The risk is that it becomes a nightmare in production. Most OpenStack projects added it early on when the API-SIG was being established, not because of strong\ndemand.\n\nIf Manila adds it, I would prevent it working by default; I\u0027d also like to justify it with anecdotal experience as to why/how it could have helped our integration testing.","commit_id":"cdcd6b9f9884c9ccb3c69c993af08e5ffd22233d"},{"author":{"_account_id":38059,"name":"Anoop Kumar Shukla","display_name":"Anoop Shukla","email":"anoop.shukla@netapp.com","username":"anoop2","status":"NetApp"},"change_message_id":"b58a86a0bd02b53b1eca385fb91a97c908ce03ed","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"bc3f1500_76e69790","updated":"2026-04-02 15:28:24.000000000","message":"LGTM.","commit_id":"cdcd6b9f9884c9ccb3c69c993af08e5ffd22233d"},{"author":{"_account_id":38940,"name":"Oluwasola Akintewe","display_name":"nathan_akin","email":"solaakintewe@gmail.com","username":"nathan_akin"},"change_message_id":"e7c9b9adbb294e7a387eaf601b8b17bdab8e4bb4","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":2,"id":"60f17eff_e8035a2f","in_reply_to":"cbbb62c1_0b569c44","updated":"2026-04-04 09:02:46.000000000","message":"Thank you for the detailed breakdown @gouthampravi@gmail.com, and for raising it at the meeting. I agree the \"Against\" arguments are strong, especially the silent breakage risk if clients use latest in production.\n\nPatchset 3 i just pushed addresses this by gating the behavior behind a new oslo.config option allow_latest_microversion. With the default off, Manila\u0027s behavior is unchanged for everyone, latest still returns a 400. Operators who explicitly want it for integration testing can opt in by setting the flag to True.\nThis way we get spec compliance and testing convenience without encouraging production use, since it requires a deliberate operator decision to enable.\n\nWould love your feedback on this","commit_id":"cdcd6b9f9884c9ccb3c69c993af08e5ffd22233d"}],"manila/api/openstack/api_version_request.py":[{"author":{"_account_id":29632,"name":"Carlos Eduardo","email":"ces.eduardo98@gmail.com","username":"silvacarlos"},"change_message_id":"59113f5d0c1d52035a97814f6d012599d547794c","unresolved":true,"context_lines":[{"line_number":250,"context_line":"        self._experimental \u003d experimental"},{"line_number":251,"context_line":""},{"line_number":252,"context_line":"        if version_string is not None:"},{"line_number":253,"context_line":"            if version_string \u003d\u003d \u0027latest\u0027:"},{"line_number":254,"context_line":"                version_string \u003d _MAX_API_VERSION"},{"line_number":255,"context_line":"            match \u003d re.match(r\"^([1-9]\\d*)\\.([1-9]\\d*|0)$\","},{"line_number":256,"context_line":"                             version_string)"}],"source_content_type":"text/x-python","patch_set":1,"id":"ceacb558_75597d8c","line":253,"range":{"start_line":253,"start_character":15,"end_line":253,"end_character":29},"updated":"2026-03-31 20:51:24.000000000","message":"if we are to accept this, we should process the string and make it lower, so we ensure we don\u0027t miss the match","commit_id":"1f860d3b3541941a0a9efda6283f8061cc1b8402"},{"author":{"_account_id":38940,"name":"Oluwasola Akintewe","display_name":"nathan_akin","email":"solaakintewe@gmail.com","username":"nathan_akin"},"change_message_id":"62cfdf95add8e84b5af1edca71edc2df392582ab","unresolved":false,"context_lines":[{"line_number":250,"context_line":"        self._experimental \u003d experimental"},{"line_number":251,"context_line":""},{"line_number":252,"context_line":"        if version_string is not None:"},{"line_number":253,"context_line":"            if version_string \u003d\u003d \u0027latest\u0027:"},{"line_number":254,"context_line":"                version_string \u003d _MAX_API_VERSION"},{"line_number":255,"context_line":"            match \u003d re.match(r\"^([1-9]\\d*)\\.([1-9]\\d*|0)$\","},{"line_number":256,"context_line":"                             version_string)"}],"source_content_type":"text/x-python","patch_set":1,"id":"9761d6ed_f3afc44a","line":253,"range":{"start_line":253,"start_character":15,"end_line":253,"end_character":29},"in_reply_to":"ceacb558_75597d8c","updated":"2026-04-01 10:43:44.000000000","message":"Done","commit_id":"1f860d3b3541941a0a9efda6283f8061cc1b8402"},{"author":{"_account_id":16643,"name":"Goutham Pacha Ravi","email":"gouthampravi@gmail.com","username":"gouthamr"},"change_message_id":"95ded26cf8e98b8bc789d618136e5ffee7234733","unresolved":true,"context_lines":[{"line_number":250,"context_line":"        self._experimental \u003d experimental"},{"line_number":251,"context_line":""},{"line_number":252,"context_line":"        if version_string is not None:"},{"line_number":253,"context_line":"            if version_string.lower() \u003d\u003d \u0027latest\u0027:"},{"line_number":254,"context_line":"                version_string \u003d _MAX_API_VERSION"},{"line_number":255,"context_line":"            match \u003d re.match(r\"^([1-9]\\d*)\\.([1-9]\\d*|0)$\","},{"line_number":256,"context_line":"                             version_string)"}],"source_content_type":"text/x-python","patch_set":2,"id":"6ae43ca3_42cf969e","line":253,"updated":"2026-03-31 21:18:52.000000000","message":"Agree that this comparison should be case-insensitive to handle mixed-case\ninput (e.g. \u0027Latest\u0027, \u0027LATEST\u0027). Nova uses a case-insensitive\ncheck. Suggest: if version_string.lower() \u003d\u003d \u0027latest\u0027:","commit_id":"cdcd6b9f9884c9ccb3c69c993af08e5ffd22233d"},{"author":{"_account_id":38940,"name":"Oluwasola Akintewe","display_name":"nathan_akin","email":"solaakintewe@gmail.com","username":"nathan_akin"},"change_message_id":"d8381cc54aeaf8997f0c3a679f471204e0662414","unresolved":false,"context_lines":[{"line_number":250,"context_line":"        self._experimental \u003d experimental"},{"line_number":251,"context_line":""},{"line_number":252,"context_line":"        if version_string is not None:"},{"line_number":253,"context_line":"            if version_string.lower() \u003d\u003d \u0027latest\u0027:"},{"line_number":254,"context_line":"                version_string \u003d _MAX_API_VERSION"},{"line_number":255,"context_line":"            match \u003d re.match(r\"^([1-9]\\d*)\\.([1-9]\\d*|0)$\","},{"line_number":256,"context_line":"                             version_string)"}],"source_content_type":"text/x-python","patch_set":2,"id":"8e7ddbcf_b2a5829e","line":253,"in_reply_to":"6ae43ca3_42cf969e","updated":"2026-04-02 09:03:18.000000000","message":"Done","commit_id":"cdcd6b9f9884c9ccb3c69c993af08e5ffd22233d"}],"manila/tests/api/openstack/test_api_version_request.py":[{"author":{"_account_id":16643,"name":"Goutham Pacha Ravi","email":"gouthampravi@gmail.com","username":"gouthamr"},"change_message_id":"95ded26cf8e98b8bc789d618136e5ffee7234733","unresolved":true,"context_lines":[{"line_number":177,"context_line":"                          request.matches_versioned_method,"},{"line_number":178,"context_line":"                          \u0027fake_method\u0027)"},{"line_number":179,"context_line":""},{"line_number":180,"context_line":"    @ddt.data(\u0027latest\u0027, \u0027Latest\u0027, \u0027LATEST\u0027)"},{"line_number":181,"context_line":"    def test_latest_version_string(self, version_str):"},{"line_number":182,"context_line":"        request \u003d api_version_request.APIVersionRequest(version_str)"},{"line_number":183,"context_line":"        self.assertEqual(api_version_request.max_api_version(), request)"}],"source_content_type":"text/x-python","patch_set":2,"id":"8ae5e444_cd7f1a08","line":180,"updated":"2026-03-31 21:18:52.000000000","message":"Consider using @ddt.data(\u0027latest\u0027, \u0027Latest\u0027, \u0027LATEST\u0027) to verify\ncase-insensitive variants once the code is updated.","commit_id":"cdcd6b9f9884c9ccb3c69c993af08e5ffd22233d"},{"author":{"_account_id":38940,"name":"Oluwasola Akintewe","display_name":"nathan_akin","email":"solaakintewe@gmail.com","username":"nathan_akin"},"change_message_id":"d8381cc54aeaf8997f0c3a679f471204e0662414","unresolved":false,"context_lines":[{"line_number":177,"context_line":"                          request.matches_versioned_method,"},{"line_number":178,"context_line":"                          \u0027fake_method\u0027)"},{"line_number":179,"context_line":""},{"line_number":180,"context_line":"    @ddt.data(\u0027latest\u0027, \u0027Latest\u0027, \u0027LATEST\u0027)"},{"line_number":181,"context_line":"    def test_latest_version_string(self, version_str):"},{"line_number":182,"context_line":"        request \u003d api_version_request.APIVersionRequest(version_str)"},{"line_number":183,"context_line":"        self.assertEqual(api_version_request.max_api_version(), request)"}],"source_content_type":"text/x-python","patch_set":2,"id":"959bd1af_76eccbf5","line":180,"in_reply_to":"8ae5e444_cd7f1a08","updated":"2026-04-02 09:03:18.000000000","message":"Done","commit_id":"cdcd6b9f9884c9ccb3c69c993af08e5ffd22233d"}]}
