)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"0166b27721f3f2578af43d1ece42582c34ccf134","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"a9e23ec2_9c4ec545","updated":"2026-03-27 15:34:43.000000000","message":"I\u0027m not sure this is a great idea. You\u0027ve said:\n\n\u003e Most OpenStack projects have already migrated away from these utilities, making them largely obsolete.\n\nBut I don\u0027t know if that\u0027s true. Based on codesearch.o.o, the `TimeFixture` fixture appears to be [quite widely used](https://codesearch.opendev.org/?q\u003dTimeFixture\u0026i\u003dnope\u0026literal\u003dnope\u0026files\u003d\u0026excludeFiles\u003d\u0026repos\u003d). Removing it will have a large impact and I don\u0027t know who\u0027s going to do the legwork of actually updating all those users. Are you absolutely sure you want to do this?","commit_id":"e8ce6b3ef51b0afb2cb98743ba361b34de1f085d"},{"author":{"_account_id":28522,"name":"Hervé Beraud","email":"herveberaud.pro@gmail.com","username":"hberaud"},"change_message_id":"acbb0fee48f2b7fe687f7fa849b53e57c5a7a4b7","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"72686f8e_cc02919b","in_reply_to":"56c4512c_131ca5fa","updated":"2026-03-30 07:55:30.000000000","message":"Indeed you are right about the current usages, my initial assumptions were based on the list of migrated into the LP bug ticket.\n\nHence, you are right we need to rework the wrapper, I\u0027ll try to follow one the approaches you propose (surely the \"a\" one).","commit_id":"e8ce6b3ef51b0afb2cb98743ba361b34de1f085d"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"8098333421013a6c26baf4f26a85573ae7386316","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"56c4512c_131ca5fa","in_reply_to":"a9e23ec2_9c4ec545","updated":"2026-03-27 15:39:10.000000000","message":"Perhaps as an alternative, you could keep the fixture but either (a) rework it as a wrapper around `MockFixture` or (b) start a move towards making all the override logic private so that eventually we\u0027ll remove e.g. `set_time_override` in favour of `_set_time_override` that only `MockFixture` will use.\n\n```\ndef set_time_override(override_time: datetime.datetime | None \u003d None) -\u003e None:\n    ...\n    warnings.warn(...)\n    _set_time_override(override_time)\n\n\ndef _set_time_override(override_time: datetime.datetime | None \u003d None) -\u003e None:\n    ...\n```\n\nThoughts?","commit_id":"e8ce6b3ef51b0afb2cb98743ba361b34de1f085d"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"8a9b8c66301acf804602212a779370f717ba992b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"0b44f1f1_23cff748","updated":"2026-04-03 08:32:05.000000000","message":"Apologies for the confusion. Hopefully my comments clarify what I was asking for here.","commit_id":"7f9ab1c3f86d8f28178c57d2d6ccbfebacfae856"},{"author":{"_account_id":28522,"name":"Hervé Beraud","email":"herveberaud.pro@gmail.com","username":"hberaud"},"change_message_id":"0f65e0a2be3be4651f410c5fdc646d615070b4ff","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"623ea27f_82298a5b","updated":"2026-03-30 13:42:30.000000000","message":"I think all comments have been addressed, let me know if you have additional concerns","commit_id":"7f9ab1c3f86d8f28178c57d2d6ccbfebacfae856"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"ef42b398935771ae4a13ffbd02cfd55027ff1119","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"27d7b168_f0e17354","updated":"2026-04-01 19:53:46.000000000","message":"lgtm, agree on the stephen comments (which are fixed now) and this is much better now.","commit_id":"7f9ab1c3f86d8f28178c57d2d6ccbfebacfae856"},{"author":{"_account_id":28522,"name":"Hervé Beraud","email":"herveberaud.pro@gmail.com","username":"hberaud"},"change_message_id":"17e47f610fbed237672ad23eec13046322a38b04","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"83138c4d_5c873a69","updated":"2026-04-08 08:22:27.000000000","message":"recheck","commit_id":"c6e13c83ac707a6aea6dce9ec565a7053278a2b2"},{"author":{"_account_id":28522,"name":"Hervé Beraud","email":"herveberaud.pro@gmail.com","username":"hberaud"},"change_message_id":"c1866a108701dfa02c8f830b20c40b6543a1d812","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"c20057d6_c292250a","updated":"2026-04-09 07:16:24.000000000","message":"recheck","commit_id":"c6e13c83ac707a6aea6dce9ec565a7053278a2b2"},{"author":{"_account_id":31245,"name":"Daniel Bengtsson","email":"dbengt@redhat.com","username":"damani42"},"change_message_id":"a802e7e32d1bba8e1126b85f72c7320f9bd6f6bd","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"59639592_cfb062f0","updated":"2026-04-15 11:22:58.000000000","message":"Looks good to merge.","commit_id":"5f1802ac55155ccba7af0e9c915e6625f484e785"},{"author":{"_account_id":28522,"name":"Hervé Beraud","email":"herveberaud.pro@gmail.com","username":"hberaud"},"change_message_id":"dd7285662771b8e23e5114297ebbfac98c2145ef","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"7f5c55e9_2653fb74","updated":"2026-04-10 07:27:14.000000000","message":"recheck\nThe latest CI/CD error do not seems relevant and related to my change, the gates are suffering from pulling hacking.","commit_id":"5f1802ac55155ccba7af0e9c915e6625f484e785"}],"oslo_utils/fixture.py":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"0166b27721f3f2578af43d1ece42582c34ccf134","unresolved":true,"context_lines":[{"line_number":33,"context_line":"    \"TimeFixture\","},{"line_number":34,"context_line":"    message\u003d\"TimeFixture is deprecated. Use unittest.mock.patch() or \""},{"line_number":35,"context_line":"    \"pytest\u0027s monkeypatch to mock timeutils.utcnow instead.\","},{"line_number":36,"context_line":")"},{"line_number":37,"context_line":"class TimeFixture(fixtures.Fixture):"},{"line_number":38,"context_line":"    \"\"\"A fixture for overriding the time returned by timeutils.utcnow()."},{"line_number":39,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"0516c47a_a03da751","line":36,"updated":"2026-03-27 15:34:43.000000000","message":"Can we just do this with `warnings` instead of `debtcollector`? debtcollector is a large dependency for a simple warning like this.","commit_id":"e8ce6b3ef51b0afb2cb98743ba361b34de1f085d"},{"author":{"_account_id":28522,"name":"Hervé Beraud","email":"herveberaud.pro@gmail.com","username":"hberaud"},"change_message_id":"0f65e0a2be3be4651f410c5fdc646d615070b4ff","unresolved":false,"context_lines":[{"line_number":33,"context_line":"    \"TimeFixture\","},{"line_number":34,"context_line":"    message\u003d\"TimeFixture is deprecated. Use unittest.mock.patch() or \""},{"line_number":35,"context_line":"    \"pytest\u0027s monkeypatch to mock timeutils.utcnow instead.\","},{"line_number":36,"context_line":")"},{"line_number":37,"context_line":"class TimeFixture(fixtures.Fixture):"},{"line_number":38,"context_line":"    \"\"\"A fixture for overriding the time returned by timeutils.utcnow()."},{"line_number":39,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"5bd6a425_6b3bc77e","line":36,"in_reply_to":"0516c47a_a03da751","updated":"2026-03-30 13:42:30.000000000","message":"Done","commit_id":"e8ce6b3ef51b0afb2cb98743ba361b34de1f085d"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"0166b27721f3f2578af43d1ece42582c34ccf134","unresolved":true,"context_lines":[{"line_number":40,"context_line":"    :param override_time: datetime instance or list thereof. If not given,"},{"line_number":41,"context_line":"        defaults to the current UTC time."},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    .. deprecated::"},{"line_number":44,"context_line":"       Use unittest.mock.patch() or pytest\u0027s monkeypatch to mock"},{"line_number":45,"context_line":"       timeutils.utcnow instead. This class will be removed in a future"},{"line_number":46,"context_line":"       release."},{"line_number":47,"context_line":"    \"\"\""},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    def __init__(self, override_time: datetime.datetime | None \u003d None) -\u003e None:"}],"source_content_type":"text/x-python","patch_set":3,"id":"df1d5138_3ed1976f","line":46,"range":{"start_line":43,"start_character":19,"end_line":46,"end_character":15},"updated":"2026-03-27 15:34:43.000000000","message":"This is an oslo lib so we don\u0027t need to talk about pytest (no one bar horizon should be using it).\n\n```suggestion\n    .. deprecated::\n\n       This fixture will be removed in a future release. Consider mocking\n       timeutils.utcnow instead.\n```","commit_id":"e8ce6b3ef51b0afb2cb98743ba361b34de1f085d"},{"author":{"_account_id":28522,"name":"Hervé Beraud","email":"herveberaud.pro@gmail.com","username":"hberaud"},"change_message_id":"0f65e0a2be3be4651f410c5fdc646d615070b4ff","unresolved":false,"context_lines":[{"line_number":40,"context_line":"    :param override_time: datetime instance or list thereof. If not given,"},{"line_number":41,"context_line":"        defaults to the current UTC time."},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    .. deprecated::"},{"line_number":44,"context_line":"       Use unittest.mock.patch() or pytest\u0027s monkeypatch to mock"},{"line_number":45,"context_line":"       timeutils.utcnow instead. This class will be removed in a future"},{"line_number":46,"context_line":"       release."},{"line_number":47,"context_line":"    \"\"\""},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    def __init__(self, override_time: datetime.datetime | None \u003d None) -\u003e None:"}],"source_content_type":"text/x-python","patch_set":3,"id":"76c20a96_80a8a1d2","line":46,"range":{"start_line":43,"start_character":19,"end_line":46,"end_character":15},"in_reply_to":"df1d5138_3ed1976f","updated":"2026-03-30 13:42:30.000000000","message":"Done","commit_id":"e8ce6b3ef51b0afb2cb98743ba361b34de1f085d"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"8a9b8c66301acf804602212a779370f717ba992b","unresolved":true,"context_lines":[{"line_number":46,"context_line":"    def __init__(self, override_time: datetime.datetime | None \u003d None) -\u003e None:"},{"line_number":47,"context_line":"        super().__init__()"},{"line_number":48,"context_line":"        if override_time is None:"},{"line_number":49,"context_line":"            override_time \u003d datetime.datetime.now("},{"line_number":50,"context_line":"                datetime.timezone.utc"},{"line_number":51,"context_line":"            ).replace(tzinfo\u003dNone)"},{"line_number":52,"context_line":"        self._current_time \u003d override_time"}],"source_content_type":"text/x-python","patch_set":5,"id":"2c10b2b3_960b2479","line":49,"updated":"2026-04-03 08:32:05.000000000","message":"Previously we were \"mocking\" `oslo_utils.time_utils.utcnow`. We\u0027re now mocking `datetime.datetime.now`. That\u0027s potentially a large difference. We should definitely call it out in the release notes. We might also want to split this change into two so that we can back it out if it turns out to have a more significant impact (it shouldn\u0027t but it might)","commit_id":"7f9ab1c3f86d8f28178c57d2d6ccbfebacfae856"},{"author":{"_account_id":28522,"name":"Hervé Beraud","email":"herveberaud.pro@gmail.com","username":"hberaud"},"change_message_id":"a36be5831a3eaedf63955f75212dd023e4f059a2","unresolved":true,"context_lines":[{"line_number":46,"context_line":"    def __init__(self, override_time: datetime.datetime | None \u003d None) -\u003e None:"},{"line_number":47,"context_line":"        super().__init__()"},{"line_number":48,"context_line":"        if override_time is None:"},{"line_number":49,"context_line":"            override_time \u003d datetime.datetime.now("},{"line_number":50,"context_line":"                datetime.timezone.utc"},{"line_number":51,"context_line":"            ).replace(tzinfo\u003dNone)"},{"line_number":52,"context_line":"        self._current_time \u003d override_time"}],"source_content_type":"text/x-python","patch_set":5,"id":"c0c0fad3_5c97017d","line":49,"in_reply_to":"2c10b2b3_960b2479","updated":"2026-04-07 07:28:46.000000000","message":"What do you mean by splitting this change into two? Doing a follow up patch?\nIf your answer is yes, how do you see it?\n1. First patch: deprecation of the timeutils methods\n2. Second patch the refactor of `TimeFixture`\n\nIs this what you have in mind?","commit_id":"7f9ab1c3f86d8f28178c57d2d6ccbfebacfae856"},{"author":{"_account_id":28522,"name":"Hervé Beraud","email":"herveberaud.pro@gmail.com","username":"hberaud"},"change_message_id":"f1c870fc39af8bf13c3e99d22a9059eadea7ed3b","unresolved":false,"context_lines":[{"line_number":46,"context_line":"    def __init__(self, override_time: datetime.datetime | None \u003d None) -\u003e None:"},{"line_number":47,"context_line":"        super().__init__()"},{"line_number":48,"context_line":"        if override_time is None:"},{"line_number":49,"context_line":"            override_time \u003d datetime.datetime.now("},{"line_number":50,"context_line":"                datetime.timezone.utc"},{"line_number":51,"context_line":"            ).replace(tzinfo\u003dNone)"},{"line_number":52,"context_line":"        self._current_time \u003d override_time"}],"source_content_type":"text/x-python","patch_set":5,"id":"1593f339_5ad00541","line":49,"in_reply_to":"65ef49e5_d744d60f","updated":"2026-04-09 13:37:05.000000000","message":"I splitted this patch in 3 changes, this way we can better isolate things if needed.","commit_id":"7f9ab1c3f86d8f28178c57d2d6ccbfebacfae856"},{"author":{"_account_id":28522,"name":"Hervé Beraud","email":"herveberaud.pro@gmail.com","username":"hberaud"},"change_message_id":"c255c3d49bdb1e1912dfa9c3ab40eb2a2aad8027","unresolved":true,"context_lines":[{"line_number":46,"context_line":"    def __init__(self, override_time: datetime.datetime | None \u003d None) -\u003e None:"},{"line_number":47,"context_line":"        super().__init__()"},{"line_number":48,"context_line":"        if override_time is None:"},{"line_number":49,"context_line":"            override_time \u003d datetime.datetime.now("},{"line_number":50,"context_line":"                datetime.timezone.utc"},{"line_number":51,"context_line":"            ).replace(tzinfo\u003dNone)"},{"line_number":52,"context_line":"        self._current_time \u003d override_time"}],"source_content_type":"text/x-python","patch_set":5,"id":"65ef49e5_d744d60f","line":49,"in_reply_to":"9f4ea744_83546025","updated":"2026-04-09 08:41:09.000000000","message":"Ack, will rework that once I get the confirmation that the gate is fixed for this patch.","commit_id":"7f9ab1c3f86d8f28178c57d2d6ccbfebacfae856"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"6dcd82e833d8f0bb5254937c54fb2ede4849a216","unresolved":true,"context_lines":[{"line_number":46,"context_line":"    def __init__(self, override_time: datetime.datetime | None \u003d None) -\u003e None:"},{"line_number":47,"context_line":"        super().__init__()"},{"line_number":48,"context_line":"        if override_time is None:"},{"line_number":49,"context_line":"            override_time \u003d datetime.datetime.now("},{"line_number":50,"context_line":"                datetime.timezone.utc"},{"line_number":51,"context_line":"            ).replace(tzinfo\u003dNone)"},{"line_number":52,"context_line":"        self._current_time \u003d override_time"}],"source_content_type":"text/x-python","patch_set":5,"id":"9f4ea744_83546025","line":49,"in_reply_to":"c0c0fad3_5c97017d","updated":"2026-04-08 15:07:35.000000000","message":"Yes, exactly.","commit_id":"7f9ab1c3f86d8f28178c57d2d6ccbfebacfae856"}],"oslo_utils/timeutils.py":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"0166b27721f3f2578af43d1ece42582c34ccf134","unresolved":true,"context_lines":[{"line_number":111,"context_line":"        .. versionchanged:: 1.6"},{"line_number":112,"context_line":"           Added *with_timezone* parameter."},{"line_number":113,"context_line":"        \"\"\"  # noqa: E501"},{"line_number":114,"context_line":"        if self.override_time:"},{"line_number":115,"context_line":"            if isinstance(self.override_time, datetime.datetime):"},{"line_number":116,"context_line":"                return self.override_time"},{"line_number":117,"context_line":"            return self.override_time.pop(0)"}],"source_content_type":"text/x-python","patch_set":3,"id":"6f7b95a2_3283bbcd","line":114,"updated":"2026-03-27 15:34:43.000000000","message":"Can we add a note here to drop this when we drop the fixture?\n\nAlso, do we want to place `override_time` behind a property so we can raise a warning if anyone tried to write to it? e.g.\n\n\n```python\n        @property\n        def override_time(self) -\u003e None | datetime.datetime | list[datetime.datetime]:\n            return self._override_time\n            \n        @override_time.setter\n        def override_time(\n            self, value: None | datetime.datetime | list[datetime.datetime]\n        ) -\u003e None:\n            warnings.warn(...)\n            self._override_time \u003d None\n```\n\nobviously our own uses of it should reference `_override_time` directly to avoid triggering the warning twice.","commit_id":"e8ce6b3ef51b0afb2cb98743ba361b34de1f085d"},{"author":{"_account_id":28522,"name":"Hervé Beraud","email":"herveberaud.pro@gmail.com","username":"hberaud"},"change_message_id":"0f65e0a2be3be4651f410c5fdc646d615070b4ff","unresolved":false,"context_lines":[{"line_number":111,"context_line":"        .. versionchanged:: 1.6"},{"line_number":112,"context_line":"           Added *with_timezone* parameter."},{"line_number":113,"context_line":"        \"\"\"  # noqa: E501"},{"line_number":114,"context_line":"        if self.override_time:"},{"line_number":115,"context_line":"            if isinstance(self.override_time, datetime.datetime):"},{"line_number":116,"context_line":"                return self.override_time"},{"line_number":117,"context_line":"            return self.override_time.pop(0)"}],"source_content_type":"text/x-python","patch_set":3,"id":"d11e7974_dc494667","line":114,"in_reply_to":"6f7b95a2_3283bbcd","updated":"2026-03-30 13:42:30.000000000","message":"Done","commit_id":"e8ce6b3ef51b0afb2cb98743ba361b34de1f085d"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"0166b27721f3f2578af43d1ece42582c34ccf134","unresolved":true,"context_lines":[{"line_number":183,"context_line":""},{"line_number":184,"context_line":"    return timestamp"},{"line_number":185,"context_line":""},{"line_number":186,"context_line":""},{"line_number":187,"context_line":"@removals.remove(  # type: ignore[untyped-decorator]"},{"line_number":188,"context_line":"    message\u003d\"set_time_override is deprecated. Use unittest.mock.patch() or \""},{"line_number":189,"context_line":"    \"pytest\u0027s monkeypatch to mock timeutils.utcnow instead.\""},{"line_number":190,"context_line":")"},{"line_number":191,"context_line":"def set_time_override(override_time: datetime.datetime | None \u003d None) -\u003e None:"},{"line_number":192,"context_line":"    \"\"\"Overrides utils.utcnow."},{"line_number":193,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"a94f14d1_e4ae3b94","line":190,"range":{"start_line":186,"start_character":1,"end_line":190,"end_character":1},"updated":"2026-03-27 15:34:43.000000000","message":"As in the other file, can we just raise a deprecation warning inside the function?","commit_id":"e8ce6b3ef51b0afb2cb98743ba361b34de1f085d"},{"author":{"_account_id":28522,"name":"Hervé Beraud","email":"herveberaud.pro@gmail.com","username":"hberaud"},"change_message_id":"0f65e0a2be3be4651f410c5fdc646d615070b4ff","unresolved":false,"context_lines":[{"line_number":183,"context_line":""},{"line_number":184,"context_line":"    return timestamp"},{"line_number":185,"context_line":""},{"line_number":186,"context_line":""},{"line_number":187,"context_line":"@removals.remove(  # type: ignore[untyped-decorator]"},{"line_number":188,"context_line":"    message\u003d\"set_time_override is deprecated. Use unittest.mock.patch() or \""},{"line_number":189,"context_line":"    \"pytest\u0027s monkeypatch to mock timeutils.utcnow instead.\""},{"line_number":190,"context_line":")"},{"line_number":191,"context_line":"def set_time_override(override_time: datetime.datetime | None \u003d None) -\u003e None:"},{"line_number":192,"context_line":"    \"\"\"Overrides utils.utcnow."},{"line_number":193,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"d2c77f42_5fd3d926","line":190,"range":{"start_line":186,"start_character":1,"end_line":190,"end_character":1},"in_reply_to":"a94f14d1_e4ae3b94","updated":"2026-03-30 13:42:30.000000000","message":"Done","commit_id":"e8ce6b3ef51b0afb2cb98743ba361b34de1f085d"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"0166b27721f3f2578af43d1ece42582c34ccf134","unresolved":true,"context_lines":[{"line_number":201,"context_line":"    .. deprecated::"},{"line_number":202,"context_line":"       Use unittest.mock.patch() or pytest\u0027s monkeypatch to mock"},{"line_number":203,"context_line":"       timeutils.utcnow instead. This function will be removed in a future"},{"line_number":204,"context_line":"       release."},{"line_number":205,"context_line":"    \"\"\""},{"line_number":206,"context_line":"    utcnow.override_time \u003d override_time or datetime.datetime.now("},{"line_number":207,"context_line":"        datetime.timezone.utc"}],"source_content_type":"text/x-python","patch_set":3,"id":"7fcd76b8_0894c163","line":204,"updated":"2026-03-27 15:34:43.000000000","message":"Can we simplify this a la what I noted in the previous file.","commit_id":"e8ce6b3ef51b0afb2cb98743ba361b34de1f085d"},{"author":{"_account_id":28522,"name":"Hervé Beraud","email":"herveberaud.pro@gmail.com","username":"hberaud"},"change_message_id":"0f65e0a2be3be4651f410c5fdc646d615070b4ff","unresolved":false,"context_lines":[{"line_number":201,"context_line":"    .. deprecated::"},{"line_number":202,"context_line":"       Use unittest.mock.patch() or pytest\u0027s monkeypatch to mock"},{"line_number":203,"context_line":"       timeutils.utcnow instead. This function will be removed in a future"},{"line_number":204,"context_line":"       release."},{"line_number":205,"context_line":"    \"\"\""},{"line_number":206,"context_line":"    utcnow.override_time \u003d override_time or datetime.datetime.now("},{"line_number":207,"context_line":"        datetime.timezone.utc"}],"source_content_type":"text/x-python","patch_set":3,"id":"227bf84e_4607e8f7","line":204,"in_reply_to":"7fcd76b8_0894c163","updated":"2026-03-30 13:42:30.000000000","message":"Done","commit_id":"e8ce6b3ef51b0afb2cb98743ba361b34de1f085d"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"0166b27721f3f2578af43d1ece42582c34ccf134","unresolved":true,"context_lines":[{"line_number":208,"context_line":"    ).replace(tzinfo\u003dNone)"},{"line_number":209,"context_line":""},{"line_number":210,"context_line":""},{"line_number":211,"context_line":"@removals.remove(  # type: ignore[untyped-decorator]"},{"line_number":212,"context_line":"    message\u003d\"advance_time_delta is deprecated. Use unittest.mock.patch() or \""},{"line_number":213,"context_line":"    \"pytest\u0027s monkeypatch to mock timeutils.utcnow instead.\""},{"line_number":214,"context_line":")"},{"line_number":215,"context_line":"def advance_time_delta(timedelta: datetime.timedelta) -\u003e None:"},{"line_number":216,"context_line":"    \"\"\"Advance overridden time using a datetime.timedelta."},{"line_number":217,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"ebed48dc_6ed6e58a","line":214,"range":{"start_line":211,"start_character":0,"end_line":214,"end_character":1},"updated":"2026-03-27 15:34:43.000000000","message":"ditto\n\n(and so on below)","commit_id":"e8ce6b3ef51b0afb2cb98743ba361b34de1f085d"},{"author":{"_account_id":28522,"name":"Hervé Beraud","email":"herveberaud.pro@gmail.com","username":"hberaud"},"change_message_id":"0f65e0a2be3be4651f410c5fdc646d615070b4ff","unresolved":false,"context_lines":[{"line_number":208,"context_line":"    ).replace(tzinfo\u003dNone)"},{"line_number":209,"context_line":""},{"line_number":210,"context_line":""},{"line_number":211,"context_line":"@removals.remove(  # type: ignore[untyped-decorator]"},{"line_number":212,"context_line":"    message\u003d\"advance_time_delta is deprecated. Use unittest.mock.patch() or \""},{"line_number":213,"context_line":"    \"pytest\u0027s monkeypatch to mock timeutils.utcnow instead.\""},{"line_number":214,"context_line":")"},{"line_number":215,"context_line":"def advance_time_delta(timedelta: datetime.timedelta) -\u003e None:"},{"line_number":216,"context_line":"    \"\"\"Advance overridden time using a datetime.timedelta."},{"line_number":217,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"4dc2924b_68cc47d4","line":214,"range":{"start_line":211,"start_character":0,"end_line":214,"end_character":1},"in_reply_to":"ebed48dc_6ed6e58a","updated":"2026-03-30 13:42:30.000000000","message":"Done","commit_id":"e8ce6b3ef51b0afb2cb98743ba361b34de1f085d"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"0166b27721f3f2578af43d1ece42582c34ccf134","unresolved":true,"context_lines":[{"line_number":217,"context_line":""},{"line_number":218,"context_line":"    See :py:class:`oslo_utils.fixture.TimeFixture`."},{"line_number":219,"context_line":""},{"line_number":220,"context_line":"    .. deprecated::"},{"line_number":221,"context_line":"       Use unittest.mock.patch() or pytest\u0027s monkeypatch to mock"},{"line_number":222,"context_line":"       timeutils.utcnow instead. This function will be removed in a future"},{"line_number":223,"context_line":"       release."},{"line_number":224,"context_line":"    \"\"\""},{"line_number":225,"context_line":"    if utcnow.override_time is None:"},{"line_number":226,"context_line":"        raise RuntimeError(\u0027override_time must be configured\u0027)"}],"source_content_type":"text/x-python","patch_set":3,"id":"16ac8b7e_4a830b23","line":223,"range":{"start_line":220,"start_character":1,"end_line":223,"end_character":15},"updated":"2026-03-27 15:34:43.000000000","message":"ditto\n\n(and so on below)","commit_id":"e8ce6b3ef51b0afb2cb98743ba361b34de1f085d"},{"author":{"_account_id":28522,"name":"Hervé Beraud","email":"herveberaud.pro@gmail.com","username":"hberaud"},"change_message_id":"0f65e0a2be3be4651f410c5fdc646d615070b4ff","unresolved":false,"context_lines":[{"line_number":217,"context_line":""},{"line_number":218,"context_line":"    See :py:class:`oslo_utils.fixture.TimeFixture`."},{"line_number":219,"context_line":""},{"line_number":220,"context_line":"    .. deprecated::"},{"line_number":221,"context_line":"       Use unittest.mock.patch() or pytest\u0027s monkeypatch to mock"},{"line_number":222,"context_line":"       timeutils.utcnow instead. This function will be removed in a future"},{"line_number":223,"context_line":"       release."},{"line_number":224,"context_line":"    \"\"\""},{"line_number":225,"context_line":"    if utcnow.override_time is None:"},{"line_number":226,"context_line":"        raise RuntimeError(\u0027override_time must be configured\u0027)"}],"source_content_type":"text/x-python","patch_set":3,"id":"c838691b_ebb6093e","line":223,"range":{"start_line":220,"start_character":1,"end_line":223,"end_character":15},"in_reply_to":"16ac8b7e_4a830b23","updated":"2026-03-30 13:42:30.000000000","message":"Done","commit_id":"e8ce6b3ef51b0afb2cb98743ba361b34de1f085d"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"8a9b8c66301acf804602212a779370f717ba992b","unresolved":true,"context_lines":[{"line_number":148,"context_line":""},{"line_number":149,"context_line":"        .. versionchanged:: 1.6"},{"line_number":150,"context_line":"           Added *with_timezone* parameter."},{"line_number":151,"context_line":"        \"\"\"  # noqa: E501"},{"line_number":152,"context_line":"        if self._override_time:"},{"line_number":153,"context_line":"            if isinstance(self._override_time, datetime.datetime):"},{"line_number":154,"context_line":"                return self._override_time"}],"source_content_type":"text/x-python","patch_set":5,"id":"2c0c921a_06810e92","line":151,"updated":"2026-04-03 08:32:05.000000000","message":"My previous comment RE: deprecating the `_override_time` attribute instead of the entire class was based on the expectation that you would leave the fixture mocking this class. Given that you\u0027ve instead opted to rework the fixture to use `datetime` instead of this, does it still make sense to keep this entire class around? I\u0027m thinking we should now be deprecating the entire class instead, as you were doing in the previous patchset, since it doesn\u0027t serve a purpose over calling `datetime.datetime` directly as we\u0027ve done below...","commit_id":"7f9ab1c3f86d8f28178c57d2d6ccbfebacfae856"},{"author":{"_account_id":28522,"name":"Hervé Beraud","email":"herveberaud.pro@gmail.com","username":"hberaud"},"change_message_id":"2a4c27624733ee4d0fdac817a863ede46898b290","unresolved":false,"context_lines":[{"line_number":148,"context_line":""},{"line_number":149,"context_line":"        .. versionchanged:: 1.6"},{"line_number":150,"context_line":"           Added *with_timezone* parameter."},{"line_number":151,"context_line":"        \"\"\"  # noqa: E501"},{"line_number":152,"context_line":"        if self._override_time:"},{"line_number":153,"context_line":"            if isinstance(self._override_time, datetime.datetime):"},{"line_number":154,"context_line":"                return self._override_time"}],"source_content_type":"text/x-python","patch_set":5,"id":"5d7d55de_fe962e88","line":151,"in_reply_to":"2c0c921a_06810e92","updated":"2026-04-07 08:16:28.000000000","message":"Done","commit_id":"7f9ab1c3f86d8f28178c57d2d6ccbfebacfae856"}],"releasenotes/notes/deprecate-time-override-functions-0ab966b00cd14eb9.yaml":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"0166b27721f3f2578af43d1ece42582c34ccf134","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":3,"id":"75f32c6e_ab704b95","line":37,"range":{"start_line":17,"start_character":1,"end_line":37,"end_character":1},"updated":"2026-03-27 15:34:43.000000000","message":"This is to much detail to give in a release note, IMO. I\u0027d drop it and simply say you should mock timeutils.utcnow()","commit_id":"e8ce6b3ef51b0afb2cb98743ba361b34de1f085d"},{"author":{"_account_id":28522,"name":"Hervé Beraud","email":"herveberaud.pro@gmail.com","username":"hberaud"},"change_message_id":"0f65e0a2be3be4651f410c5fdc646d615070b4ff","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"32b2b112_01a8aa0d","line":37,"range":{"start_line":17,"start_character":1,"end_line":37,"end_character":1},"in_reply_to":"75f32c6e_ab704b95","updated":"2026-03-30 13:42:30.000000000","message":"Done","commit_id":"e8ce6b3ef51b0afb2cb98743ba361b34de1f085d"},{"author":{"_account_id":31245,"name":"Daniel Bengtsson","email":"dbengt@redhat.com","username":"damani42"},"change_message_id":"19614651027934539e3042e85aa7667b52d848ed","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":4,"id":"22143891_43e55399","line":18,"updated":"2026-03-30 12:08:53.000000000","message":"I think it still feels a bit too detailed for a release note. We could simplify this to focus on what is deprecated and what users should do instead, e.g. just mock timeutils.utcnow() and note that TimeFixture remains supported.","commit_id":"690cd9b9a5a7cee17c6505daab7847ab8a3aa4f2"},{"author":{"_account_id":28522,"name":"Hervé Beraud","email":"herveberaud.pro@gmail.com","username":"hberaud"},"change_message_id":"0f65e0a2be3be4651f410c5fdc646d615070b4ff","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"e01e6a6a_9e689313","line":18,"in_reply_to":"22143891_43e55399","updated":"2026-03-30 13:42:30.000000000","message":"Done","commit_id":"690cd9b9a5a7cee17c6505daab7847ab8a3aa4f2"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"8a9b8c66301acf804602212a779370f717ba992b","unresolved":true,"context_lines":[{"line_number":5,"context_line":"    deprecated: ``set_time_override()``, ``clear_time_override()``,"},{"line_number":6,"context_line":"    ``advance_time_delta()``, and ``advance_time_seconds()``."},{"line_number":7,"context_line":""},{"line_number":8,"context_line":"    Mock ``timeutils.utcnow()`` instead."}],"source_content_type":"text/x-yaml","patch_set":5,"id":"7f5ba125_7d8c5817","line":8,"updated":"2026-04-03 08:32:05.000000000","message":"```suggestion\n    Mock ``timeutils.utcnow()`` instead or use the existing ``TimeFixture`` fixture.\nupgrade:\n  - |\n    The ``TimeFixture`` fixture has been reworked to use ``unittest.mock`` to mock\n    ``datetime.datetime.now`` instead of ``oslo_utils.timeutils.utcnow``. This may\n    have a knock-on impact for some end-users.\n```","commit_id":"7f9ab1c3f86d8f28178c57d2d6ccbfebacfae856"},{"author":{"_account_id":28522,"name":"Hervé Beraud","email":"herveberaud.pro@gmail.com","username":"hberaud"},"change_message_id":"a36be5831a3eaedf63955f75212dd023e4f059a2","unresolved":false,"context_lines":[{"line_number":5,"context_line":"    deprecated: ``set_time_override()``, ``clear_time_override()``,"},{"line_number":6,"context_line":"    ``advance_time_delta()``, and ``advance_time_seconds()``."},{"line_number":7,"context_line":""},{"line_number":8,"context_line":"    Mock ``timeutils.utcnow()`` instead."}],"source_content_type":"text/x-yaml","patch_set":5,"id":"ba2b5178_d8543fc8","line":8,"in_reply_to":"7f5ba125_7d8c5817","updated":"2026-04-07 07:28:46.000000000","message":"Fix applied.","commit_id":"7f9ab1c3f86d8f28178c57d2d6ccbfebacfae856"}]}
