)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"ab11272098cc7c53a7706ccf941665d63de17a13","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"9a657f36_cfbc3fe8","updated":"2025-07-28 06:52:43.000000000","message":"setting -w till I added the tempest tests.","commit_id":"9f437b7d1ec58fe0dcf15aa894cc3a2ba50a596f"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"64ca241ffc0e84974cc42664b85f7a375786dee3","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"241ed4b0_3ab9186a","updated":"2025-08-07 20:05:15.000000000","message":"LGTM Chandan, thanks for the improvement.","commit_id":"95d975f33961ba0be80a09c446faec479e3db27e"}],"releasenotes/notes/drop-python-dateutil-dependency-2118404-f5a8b2c1e9d4a6b3.yaml":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"05778199c57cceb9d6470e049d887e09aa58a3de","unresolved":true,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"fixes:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Removed the ``python-dateutil`` dependency from Watcher to reduce the"},{"line_number":5,"context_line":"    number of external dependencies and improve maintainability."}],"source_content_type":"text/x-yaml","patch_set":4,"id":"37756d8e_b494195a","line":2,"range":{"start_line":2,"start_character":0,"end_line":2,"end_character":5},"updated":"2025-08-06 14:54:43.000000000","message":"this is more an other or upgrade note but i guess this is ok.","commit_id":"95d975f33961ba0be80a09c446faec479e3db27e"}],"watcher/api/controllers/v1/audit.py":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"5d00f03103ef07ce67005b72f67ced86bebd443f","unresolved":true,"context_lines":[{"line_number":636,"context_line":"        end_time_value \u003d audit_dict.get(\u0027end_time\u0027)"},{"line_number":637,"context_line":"        if start_time_value:"},{"line_number":638,"context_line":"            audit_dict[\u0027start_time\u0027] \u003d start_time_value.replace("},{"line_number":639,"context_line":"                tzinfo\u003dtz.tzlocal()).astimezone("},{"line_number":640,"context_line":"                    tz.tzutc()).replace(tzinfo\u003dNone)"},{"line_number":641,"context_line":"        if end_time_value:"},{"line_number":642,"context_line":"            audit_dict[\u0027end_time\u0027] \u003d end_time_value.replace("}],"source_content_type":"text/x-python","patch_set":1,"id":"0a42a7d6_f6229f95","side":"PARENT","line":639,"range":{"start_line":639,"start_character":23,"end_line":639,"end_character":35},"updated":"2025-07-24 17:14:21.000000000","message":"this was a bug as it assumed the start time was in local time which is incorrect.","commit_id":"374750847f3ca2284b455792c414808a55e181ff"},{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"2e5fe7a12ee0eb2d77d972dd986edfc37f609fdf","unresolved":true,"context_lines":[{"line_number":636,"context_line":"        end_time_value \u003d audit_dict.get(\u0027end_time\u0027)"},{"line_number":637,"context_line":"        if start_time_value:"},{"line_number":638,"context_line":"            audit_dict[\u0027start_time\u0027] \u003d start_time_value.replace("},{"line_number":639,"context_line":"                tzinfo\u003dtz.tzlocal()).astimezone("},{"line_number":640,"context_line":"                    tz.tzutc()).replace(tzinfo\u003dNone)"},{"line_number":641,"context_line":"        if end_time_value:"},{"line_number":642,"context_line":"            audit_dict[\u0027end_time\u0027] \u003d end_time_value.replace("}],"source_content_type":"text/x-python","patch_set":1,"id":"f2138274_15de411b","side":"PARENT","line":639,"range":{"start_line":639,"start_character":23,"end_line":639,"end_character":35},"in_reply_to":"0a42a7d6_f6229f95","updated":"2025-07-28 06:48:23.000000000","message":"Thank you @seanmooney8202@yahoo.ie for highlighting, Does this bug needs to be reported and handled in a seperate patch?","commit_id":"374750847f3ca2284b455792c414808a55e181ff"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"05778199c57cceb9d6470e049d887e09aa58a3de","unresolved":false,"context_lines":[{"line_number":636,"context_line":"        end_time_value \u003d audit_dict.get(\u0027end_time\u0027)"},{"line_number":637,"context_line":"        if start_time_value:"},{"line_number":638,"context_line":"            audit_dict[\u0027start_time\u0027] \u003d start_time_value.replace("},{"line_number":639,"context_line":"                tzinfo\u003dtz.tzlocal()).astimezone("},{"line_number":640,"context_line":"                    tz.tzutc()).replace(tzinfo\u003dNone)"},{"line_number":641,"context_line":"        if end_time_value:"},{"line_number":642,"context_line":"            audit_dict[\u0027end_time\u0027] \u003d end_time_value.replace("}],"source_content_type":"text/x-python","patch_set":1,"id":"6daa1c75_5bbf2b5e","side":"PARENT","line":639,"range":{"start_line":639,"start_character":23,"end_line":639,"end_character":35},"in_reply_to":"1eef65cc_fe10da20","updated":"2025-08-06 14:54:43.000000000","message":"Done","commit_id":"374750847f3ca2284b455792c414808a55e181ff"},{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"033eb2537f8a535c0358e0607e8a4d286e64dc49","unresolved":true,"context_lines":[{"line_number":636,"context_line":"        end_time_value \u003d audit_dict.get(\u0027end_time\u0027)"},{"line_number":637,"context_line":"        if start_time_value:"},{"line_number":638,"context_line":"            audit_dict[\u0027start_time\u0027] \u003d start_time_value.replace("},{"line_number":639,"context_line":"                tzinfo\u003dtz.tzlocal()).astimezone("},{"line_number":640,"context_line":"                    tz.tzutc()).replace(tzinfo\u003dNone)"},{"line_number":641,"context_line":"        if end_time_value:"},{"line_number":642,"context_line":"            audit_dict[\u0027end_time\u0027] \u003d end_time_value.replace("}],"source_content_type":"text/x-python","patch_set":1,"id":"1eef65cc_fe10da20","side":"PARENT","line":639,"range":{"start_line":639,"start_character":23,"end_line":639,"end_character":35},"in_reply_to":"9099f887_743214e8","updated":"2025-07-28 12:13:27.000000000","message":"Based on discussion on IRC and https://docs.openstack.org/api-ref/resource-optimization/#create-audit\n```\nstart_time: The local time after which audit can be executed in accordance with interval. It will be converted to UTC time by Watcher.\n```\nIt is a known issue and It needs to be addressed via seperate spec. It would be a good item to be fixed as a part of API tech debt v1.\nHere is the link to the conversation: https://meetings.opendev.org/irclogs/%23openstack-watcher/%23openstack-watcher.2025-07-28.log.html#openstack-watcher.2025-07-28.log.html#t2025-07-28T10:40:04","commit_id":"374750847f3ca2284b455792c414808a55e181ff"},{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"2a3de10597a2de0b5274530334e6204c3016a379","unresolved":true,"context_lines":[{"line_number":636,"context_line":"        end_time_value \u003d audit_dict.get(\u0027end_time\u0027)"},{"line_number":637,"context_line":"        if start_time_value:"},{"line_number":638,"context_line":"            audit_dict[\u0027start_time\u0027] \u003d start_time_value.replace("},{"line_number":639,"context_line":"                tzinfo\u003dtz.tzlocal()).astimezone("},{"line_number":640,"context_line":"                    tz.tzutc()).replace(tzinfo\u003dNone)"},{"line_number":641,"context_line":"        if end_time_value:"},{"line_number":642,"context_line":"            audit_dict[\u0027end_time\u0027] \u003d end_time_value.replace("}],"source_content_type":"text/x-python","patch_set":1,"id":"9099f887_743214e8","side":"PARENT","line":639,"range":{"start_line":639,"start_character":23,"end_line":639,"end_character":35},"in_reply_to":"ed28717e_e6b38173","updated":"2025-07-28 07:24:49.000000000","message":"@seanmooney8202@yahoo.ie I was checking the `openstack optimize audit create` help doc. It mentions start and end time to be local.\n```\n--start-time \u003cstart_time\u003e\n                        CONTINUOUS audit local start time. Format: YYYY-MM-DD hh:mm:ss\n  --end-time \u003cend_time\u003e\n                        CONTINUOUS audit local end time. Format: YYYY-MM-DD hh:mm:ss\n  --force               Launch audit even if action plan is ongoing. default is False\n```\nI think the code is correct as time is local as per the code and help string?\nOr we want to allow user to pass the timezone in local but with in the code convert it in utc? Need suggestion here.","commit_id":"374750847f3ca2284b455792c414808a55e181ff"},{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"ab11272098cc7c53a7706ccf941665d63de17a13","unresolved":true,"context_lines":[{"line_number":636,"context_line":"        end_time_value \u003d audit_dict.get(\u0027end_time\u0027)"},{"line_number":637,"context_line":"        if start_time_value:"},{"line_number":638,"context_line":"            audit_dict[\u0027start_time\u0027] \u003d start_time_value.replace("},{"line_number":639,"context_line":"                tzinfo\u003dtz.tzlocal()).astimezone("},{"line_number":640,"context_line":"                    tz.tzutc()).replace(tzinfo\u003dNone)"},{"line_number":641,"context_line":"        if end_time_value:"},{"line_number":642,"context_line":"            audit_dict[\u0027end_time\u0027] \u003d end_time_value.replace("}],"source_content_type":"text/x-python","patch_set":1,"id":"ed28717e_e6b38173","side":"PARENT","line":639,"range":{"start_line":639,"start_character":23,"end_line":639,"end_character":35},"in_reply_to":"f2138274_15de411b","updated":"2025-07-28 06:52:43.000000000","message":"Currently I have added the fix in the same patch. I am going to add tempest test coverage for this till then setting workflow -1.","commit_id":"374750847f3ca2284b455792c414808a55e181ff"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"5d00f03103ef07ce67005b72f67ced86bebd443f","unresolved":true,"context_lines":[{"line_number":640,"context_line":"        if end_time_value:"},{"line_number":641,"context_line":"            audit_dict[\u0027end_time\u0027] \u003d end_time_value.replace("},{"line_number":642,"context_line":"                tzinfo\u003ddatetime.datetime.now().astimezone().tzinfo).astimezone("},{"line_number":643,"context_line":"                    datetime.timezone.utc).replace(tzinfo\u003dNone)"},{"line_number":644,"context_line":""},{"line_number":645,"context_line":"        new_audit \u003d objects.Audit(context, **audit_dict)"},{"line_number":646,"context_line":"        new_audit.create()"}],"source_content_type":"text/x-python","patch_set":1,"id":"58866427_176a15aa","line":643,"updated":"2025-07-24 17:14:21.000000000","message":"just youse oslo_utils.timeutils.parse_isotime()  or datetime.fromisoformat()\n\n\nyou shoudl not be manually replacing the tzinfo like this.\n\nwe can call astimezone(datetime.timezone.utc) on the datetiem object when we constucti it to make sure it in utc format but all strings receided in the api shoudl be assumed to be in utc not local time.\n\nhttps://docs.python.org/3/library/datetime.html#datetime.datetime.fromisoformat\n\nif a date time is not in utc per the timezone offseet need to be encoded in the sring follow the iso 8601 format.\n\nwe have to assume utc otherwise.\n\nreplacign the timezone information was not correct before we can do that but we shoudl not after we have ensured its in utc.","commit_id":"9f437b7d1ec58fe0dcf15aa894cc3a2ba50a596f"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"5d00f03103ef07ce67005b72f67ced86bebd443f","unresolved":true,"context_lines":[{"line_number":686,"context_line":"            if patch_path in (\u0027start_time\u0027, \u0027end_time\u0027):"},{"line_number":687,"context_line":"                patch_value \u003d api_utils.get_patch_value(patch, patch_path)"},{"line_number":688,"context_line":"                # convert string format to UTC time"},{"line_number":689,"context_line":"                new_patch_value \u003d wutils.parse_isodatetime("},{"line_number":690,"context_line":"                    patch_value).replace("},{"line_number":691,"context_line":"                        tzinfo\u003ddatetime.datetime.now().astimezone().tzinfo"},{"line_number":692,"context_line":"                    ).astimezone(datetime.timezone.utc).replace(tzinfo\u003dNone)"},{"line_number":693,"context_line":"                api_utils.set_patch_value(patch, patch_path, new_patch_value)"},{"line_number":694,"context_line":""},{"line_number":695,"context_line":"            audit \u003d Audit(**api_utils.apply_jsonpatch(audit_dict, patch))"}],"source_content_type":"text/x-python","patch_set":1,"id":"11bc0828_cbf9d460","line":692,"range":{"start_line":689,"start_character":34,"end_line":692,"end_character":76},"updated":"2025-07-24 17:14:21.000000000","message":"why are you using wutils.parse_isodatetime\n\nthat can also be removed.\n\nfirstly you can just use datetime.fromisoformat() to take a sting and produce the date tiem obejct\n\nsecondly in the bug you said you woudl use oslo_utils.timeutils.parse_isotime() \nand your not.","commit_id":"9f437b7d1ec58fe0dcf15aa894cc3a2ba50a596f"},{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"e6fdff1b13e8defcd1dc81e388f8fe3c9105dc4e","unresolved":true,"context_lines":[{"line_number":686,"context_line":"            if patch_path in (\u0027start_time\u0027, \u0027end_time\u0027):"},{"line_number":687,"context_line":"                patch_value \u003d api_utils.get_patch_value(patch, patch_path)"},{"line_number":688,"context_line":"                # convert string format to UTC time"},{"line_number":689,"context_line":"                new_patch_value \u003d wutils.parse_isodatetime("},{"line_number":690,"context_line":"                    patch_value).replace("},{"line_number":691,"context_line":"                        tzinfo\u003ddatetime.datetime.now().astimezone().tzinfo"},{"line_number":692,"context_line":"                    ).astimezone(datetime.timezone.utc).replace(tzinfo\u003dNone)"},{"line_number":693,"context_line":"                api_utils.set_patch_value(patch, patch_path, new_patch_value)"},{"line_number":694,"context_line":""},{"line_number":695,"context_line":"            audit \u003d Audit(**api_utils.apply_jsonpatch(audit_dict, patch))"}],"source_content_type":"text/x-python","patch_set":1,"id":"07f1409b_ee934c59","line":692,"range":{"start_line":689,"start_character":34,"end_line":692,"end_character":76},"in_reply_to":"11bc0828_cbf9d460","updated":"2025-07-25 02:34:17.000000000","message":"Thank you for highlighting the use of datetime.fromisoformat(). I dropped oslo_utils usage as I was trying to experiment to go with datetime library. \n\nI will include the oslo_utils and datetime usage in new patchset.","commit_id":"9f437b7d1ec58fe0dcf15aa894cc3a2ba50a596f"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"64ca241ffc0e84974cc42664b85f7a375786dee3","unresolved":true,"context_lines":[{"line_number":635,"context_line":"        start_time_value \u003d audit_dict.get(\u0027start_time\u0027)"},{"line_number":636,"context_line":"        end_time_value \u003d audit_dict.get(\u0027end_time\u0027)"},{"line_number":637,"context_line":"        if start_time_value:"},{"line_number":638,"context_line":"            audit_dict[\u0027start_time\u0027] \u003d start_time_value.astimezone("},{"line_number":639,"context_line":"                timezone.utc).replace(tzinfo\u003dNone)"},{"line_number":640,"context_line":"        if end_time_value:"},{"line_number":641,"context_line":"            audit_dict[\u0027end_time\u0027] \u003d end_time_value.astimezone("},{"line_number":642,"context_line":"                timezone.utc).replace(tzinfo\u003dNone)"}],"source_content_type":"text/x-python","patch_set":4,"id":"77c89cb8_1f464046","line":639,"range":{"start_line":638,"start_character":0,"end_line":639,"end_character":49},"updated":"2025-08-07 20:05:15.000000000","message":"+1, works in my env","commit_id":"95d975f33961ba0be80a09c446faec479e3db27e"}]}
