)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"cff49c041c139c3581c4420861693ac64f0ca716","unresolved":true,"context_lines":[{"line_number":7,"context_line":"Skip actions automatically based on pre_condition results"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This patch is implementing skipping automatically actions based on the"},{"line_number":10,"context_line":"result of action pre_condition method. This will allow to manage"},{"line_number":11,"context_line":"properly situations as migration actions for vms which does not longer"},{"line_number":12,"context_line":"exist. This patch includes:"},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"- Adding a new state SKIPPED to the Action objects."},{"line_number":15,"context_line":"- Add a new Exception ActionSkipped. An action which raises it from the"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":8,"id":"4da25f8e_159a0167","line":12,"range":{"start_line":10,"start_character":39,"end_line":12,"end_character":27},"updated":"2025-08-21 14:45:11.000000000","message":"nit:\n\nThis will allow to watcher manage\nproperly situations such as migration actions for VMs which no longer\nexists. This patch includes:","commit_id":"6d35be11ecdd8ff7e43040d0988a0273008c53da"}],"/PATCHSET_LEVEL":[{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"aee7e021b5e523e4f323bb6de60bd4ccaf3a05ef","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":1,"id":"af7b5975_0dafee5e","updated":"2025-07-17 08:20:20.000000000","message":"From codewise, overall it looks good.\n\nI think updating an action via patch api will come in next review in this series.","commit_id":"c7336da68b2be710b3e5fb72938e1e200503bca4"},{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"3a02f957b3dea6afff0c8360744218bc276939d8","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"202f29eb_fbbbee33","updated":"2025-07-17 15:20:52.000000000","message":"over all looks good.","commit_id":"c7336da68b2be710b3e5fb72938e1e200503bca4"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"9efb4677e56a25f0ee6e1ff4c06f2704d362b11d","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"5897d8b5_372b85c7","in_reply_to":"006c979d_12740e49","updated":"2025-07-22 06:41:56.000000000","message":"Done","commit_id":"c7336da68b2be710b3e5fb72938e1e200503bca4"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"23dcf79757325c035056051b65ebe84928170a98","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":1,"id":"006c979d_12740e49","in_reply_to":"af7b5975_0dafee5e","updated":"2025-07-17 12:47:46.000000000","message":"Yes, it will be the next patch in the series.","commit_id":"c7336da68b2be710b3e5fb72938e1e200503bca4"},{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"449eadc489d52796deac331fcd87e59f23fa0923","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":2,"id":"8e453de2_6cd1ff6d","updated":"2025-07-18 06:12:06.000000000","message":"recheck after skipping tempest tests https://review.opendev.org/c/openstack/watcher-tempest-plugin/+/955302","commit_id":"95f4869344e250ef2ac45655bc39148ed0a0ee50"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"9efb4677e56a25f0ee6e1ff4c06f2704d362b11d","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"01f4f6d7_b2749f06","in_reply_to":"8e453de2_6cd1ff6d","updated":"2025-07-22 06:41:56.000000000","message":"Done","commit_id":"95f4869344e250ef2ac45655bc39148ed0a0ee50"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"f1678fc9e52c412812fd83d6da02b8d80b6a3deb","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"904efe12_9c7e4755","updated":"2025-08-18 21:15:27.000000000","message":"-1: some minor concerns that are open for discussion. It looks good at first look.","commit_id":"fbf2cad06002b47489f42ab06cd10e0c1fcf2605"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"0318e33df7d0efb8ddeb6d8ef8269f9d5662107d","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"e1028835_dbcd2d07","updated":"2025-08-19 08:47:54.000000000","message":"Thanks for your review","commit_id":"fbf2cad06002b47489f42ab06cd10e0c1fcf2605"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"cae9da977d5f4800432740f8583b889a5d222065","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"109cfb64_d196f24a","updated":"2025-08-26 12:13:03.000000000","message":"+2: my main concern on avoiding SKIPPED actions in revert is now being adressed in [1]\nWe should be good to proceed witht this. Thanks Alfredo\n\n[1] https://review.opendev.org/c/openstack/watcher/+/958469","commit_id":"6d35be11ecdd8ff7e43040d0988a0273008c53da"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"b9f75018a2bc2f588acbff42a871e4cc00f8a6aa","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"c6256377_c6313e16","updated":"2025-08-21 14:53:02.000000000","message":"I\u0027m updating my vote here because I think that we can improve for revert and abort. I think that we can agree on a follow up, since this change is getting bigger","commit_id":"6d35be11ecdd8ff7e43040d0988a0273008c53da"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"fd133a54572dcd276df24ea359f524d966b7eab5","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"1ef993c5_ff32bd64","updated":"2025-08-20 17:21:17.000000000","message":"Thanks Alfredo, this LGTM!","commit_id":"6d35be11ecdd8ff7e43040d0988a0273008c53da"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"0aa51a60d2cf958d5c8655548ecebd71e95e74a6","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"eadd5c8e_51259b93","updated":"2025-08-25 19:39:35.000000000","message":"We can discuss more in https://review.opendev.org/c/openstack/watcher/+/958469 to address the gaps found here.","commit_id":"6d35be11ecdd8ff7e43040d0988a0273008c53da"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"50ccbcbeb4afaa2af6e5eee80b43cf2e64746b85","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"cdce1d29_1e09535e","updated":"2025-08-26 12:01:26.000000000","message":"doug submitted a followup to adress the outstandign comment so upgrading to +2","commit_id":"6d35be11ecdd8ff7e43040d0988a0273008c53da"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"fc9c863b5d2288cca9f523c4217a3b3caf73e2e4","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"8eef1605_549ccf0b","updated":"2025-08-25 18:41:29.000000000","message":"i agree with doug\n\nthey are workign on a followup for the change they saw ill read my +2 once that is up and i have reviewed it.","commit_id":"6d35be11ecdd8ff7e43040d0988a0273008c53da"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"cff49c041c139c3581c4420861693ac64f0ca716","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"005c4285_b7200292","updated":"2025-08-21 14:45:11.000000000","message":"im more +1.5 then two but we could adress my issue in a followup so ill review the last patch and make a decsion after that.","commit_id":"6d35be11ecdd8ff7e43040d0988a0273008c53da"}],"api-ref/source/watcher-api-v1-actions.inc":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"cff49c041c139c3581c4420861693ac64f0ca716","unresolved":true,"context_lines":[{"line_number":25,"context_line":"   ``Watcher Applier``."},{"line_number":26,"context_line":"-  **SKIPPED** : the ``Action`` will not be executed because a predefined"},{"line_number":27,"context_line":"   skipping condition is found by ``Watcher Applier`` or is explicitly"},{"line_number":28,"context_line":"   skipped by the ``Administrator``."},{"line_number":29,"context_line":"-  **ONGOING** : the ``Action`` is currently being processed by the"},{"line_number":30,"context_line":"   ``Watcher Applier``."},{"line_number":31,"context_line":"-  **SUCCEEDED** : the ``Action`` has been executed successfully"}],"source_content_type":"text/x-c++src","patch_set":8,"id":"e750aa0a_77c209ec","line":28,"updated":"2025-08-21 14:45:11.000000000","message":"nit the second half is only true after the next patch so it would have been better to append it in that. ill review both and loop back and appove the last two toghter.","commit_id":"6d35be11ecdd8ff7e43040d0988a0273008c53da"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"0aa51a60d2cf958d5c8655548ecebd71e95e74a6","unresolved":false,"context_lines":[{"line_number":25,"context_line":"   ``Watcher Applier``."},{"line_number":26,"context_line":"-  **SKIPPED** : the ``Action`` will not be executed because a predefined"},{"line_number":27,"context_line":"   skipping condition is found by ``Watcher Applier`` or is explicitly"},{"line_number":28,"context_line":"   skipped by the ``Administrator``."},{"line_number":29,"context_line":"-  **ONGOING** : the ``Action`` is currently being processed by the"},{"line_number":30,"context_line":"   ``Watcher Applier``."},{"line_number":31,"context_line":"-  **SUCCEEDED** : the ``Action`` has been executed successfully"}],"source_content_type":"text/x-c++src","patch_set":8,"id":"18bd75e9_49ff4761","line":28,"in_reply_to":"e750aa0a_77c209ec","updated":"2025-08-25 19:39:35.000000000","message":"Acknowledged","commit_id":"6d35be11ecdd8ff7e43040d0988a0273008c53da"}],"doc/source/architecture.rst":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"cff49c041c139c3581c4420861693ac64f0ca716","unresolved":true,"context_lines":[{"line_number":384,"context_line":""},{"line_number":385,"context_line":"-   **preconditions()**: this method will make sure that all conditions are met"},{"line_number":386,"context_line":"    before executing the action (for example, it makes sure that an instance"},{"line_number":387,"context_line":"    still exists before trying to migrate it). If certain predefined conditions"},{"line_number":388,"context_line":"    are found in this phase, the Action is set to **SKIPPED** state and will"},{"line_number":389,"context_line":"    not be executed."},{"line_number":390,"context_line":"-   **execute()**: this method is what triggers real commands on other"},{"line_number":391,"context_line":"    OpenStack services (such as Nova, ...) in order to change target resource"},{"line_number":392,"context_line":"    state. If the action is successfully executed, a notification message is"}],"source_content_type":"text/x-rst","patch_set":8,"id":"39997ee0_6fe3cb68","line":389,"range":{"start_line":387,"start_character":47,"end_line":389,"end_character":20},"updated":"2025-08-21 14:45:11.000000000","message":"minor wording issues but we can address in a final follow up patch.\n```suggestion\n    still exists before trying to migrate it). If action specific pre conditions\n    are not met in this phase, the Action is set to **SKIPPED** state and will\n    not be executed.\n```","commit_id":"6d35be11ecdd8ff7e43040d0988a0273008c53da"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"0aa51a60d2cf958d5c8655548ecebd71e95e74a6","unresolved":false,"context_lines":[{"line_number":384,"context_line":""},{"line_number":385,"context_line":"-   **preconditions()**: this method will make sure that all conditions are met"},{"line_number":386,"context_line":"    before executing the action (for example, it makes sure that an instance"},{"line_number":387,"context_line":"    still exists before trying to migrate it). If certain predefined conditions"},{"line_number":388,"context_line":"    are found in this phase, the Action is set to **SKIPPED** state and will"},{"line_number":389,"context_line":"    not be executed."},{"line_number":390,"context_line":"-   **execute()**: this method is what triggers real commands on other"},{"line_number":391,"context_line":"    OpenStack services (such as Nova, ...) in order to change target resource"},{"line_number":392,"context_line":"    state. If the action is successfully executed, a notification message is"}],"source_content_type":"text/x-rst","patch_set":8,"id":"db2918b3_7f8f03da","line":389,"range":{"start_line":387,"start_character":47,"end_line":389,"end_character":20},"in_reply_to":"39997ee0_6fe3cb68","updated":"2025-08-25 19:39:35.000000000","message":"Acknowledged","commit_id":"6d35be11ecdd8ff7e43040d0988a0273008c53da"}],"watcher/applier/action_plan/default.py":[{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"f1678fc9e52c412812fd83d6da02b8d80b6a3deb","unresolved":true,"context_lines":[{"line_number":80,"context_line":"            skipped_actions \u003d objects.Action.list("},{"line_number":81,"context_line":"                self.ctx, filters\u003dskipped_filter, eager\u003dTrue)"},{"line_number":82,"context_line":"            if skipped_actions:"},{"line_number":83,"context_line":"                status_message \u003d (_(\"Actions were skipped: %s\") %"},{"line_number":84,"context_line":"                                  \", \".join([a.uuid for a in skipped_actions]))"},{"line_number":85,"context_line":"                action_plan.status_message \u003d status_message"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"            action_plan.state \u003d ap_state"}],"source_content_type":"text/x-python","patch_set":5,"id":"2fe038aa_f8c6c230","line":84,"range":{"start_line":83,"start_character":0,"end_line":84,"end_character":79},"updated":"2025-08-18 21:15:27.000000000","message":"The status_message field would only hold 6 or 7 uuids, due to its length. I think that we can omit the uuids here. Also, we should only add a status_message if there is no other message in the fiels, otherwise we could be overriding some important error message from before? (even if there is none at this moment)","commit_id":"fbf2cad06002b47489f42ab06cd10e0c1fcf2605"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"cff49c041c139c3581c4420861693ac64f0ca716","unresolved":true,"context_lines":[{"line_number":80,"context_line":"            skipped_actions \u003d objects.Action.list("},{"line_number":81,"context_line":"                self.ctx, filters\u003dskipped_filter, eager\u003dTrue)"},{"line_number":82,"context_line":"            if skipped_actions:"},{"line_number":83,"context_line":"                status_message \u003d (_(\"Actions were skipped: %s\") %"},{"line_number":84,"context_line":"                                  \", \".join([a.uuid for a in skipped_actions]))"},{"line_number":85,"context_line":"                action_plan.status_message \u003d status_message"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"            action_plan.state \u003d ap_state"}],"source_content_type":"text/x-python","patch_set":5,"id":"7d305c21_39c44211","line":84,"range":{"start_line":83,"start_character":0,"end_line":84,"end_character":79},"in_reply_to":"06cc9e05_cc5ec36e","updated":"2025-08-21 14:45:11.000000000","message":"i agree with doug we shoudl not list all the uuids in the action plan status\n\nthe user can look those up instead separately by listing the action by action_plan uuid\n\nin the futrue we can add state as a query arg to \n\nhttps://docs.openstack.org/api-ref/resource-optimization/#list-action\nand detail ist.\n\nthat would need a new api microversion however but we can impvoe this workflwo next cycle.","commit_id":"fbf2cad06002b47489f42ab06cd10e0c1fcf2605"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"259e120cb7694e982a7807da8a0dc7108414ba50","unresolved":true,"context_lines":[{"line_number":80,"context_line":"            skipped_actions \u003d objects.Action.list("},{"line_number":81,"context_line":"                self.ctx, filters\u003dskipped_filter, eager\u003dTrue)"},{"line_number":82,"context_line":"            if skipped_actions:"},{"line_number":83,"context_line":"                status_message \u003d (_(\"Actions were skipped: %s\") %"},{"line_number":84,"context_line":"                                  \", \".join([a.uuid for a in skipped_actions]))"},{"line_number":85,"context_line":"                action_plan.status_message \u003d status_message"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"            action_plan.state \u003d ap_state"}],"source_content_type":"text/x-python","patch_set":5,"id":"6bcf3e25_83243966","line":84,"range":{"start_line":83,"start_character":0,"end_line":84,"end_character":79},"in_reply_to":"2b5b9d73_90da48ae","updated":"2025-08-19 14:46:53.000000000","message":"In skipped_actions I\u0027m not checking because this is the first oportunity of skipping it. There is no way it\u0027s populated before this. The same happens in the execute(), if code goes there, it means it passed the pre_condition, so status_message is empty. I\u0027m checking previous value only in post_condition which is the only one where it may override previous message.","commit_id":"fbf2cad06002b47489f42ab06cd10e0c1fcf2605"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"ccd8ace86dc4f8b6213b1792fa85f3a9c2c4e166","unresolved":true,"context_lines":[{"line_number":80,"context_line":"            skipped_actions \u003d objects.Action.list("},{"line_number":81,"context_line":"                self.ctx, filters\u003dskipped_filter, eager\u003dTrue)"},{"line_number":82,"context_line":"            if skipped_actions:"},{"line_number":83,"context_line":"                status_message \u003d (_(\"Actions were skipped: %s\") %"},{"line_number":84,"context_line":"                                  \", \".join([a.uuid for a in skipped_actions]))"},{"line_number":85,"context_line":"                action_plan.status_message \u003d status_message"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"            action_plan.state \u003d ap_state"}],"source_content_type":"text/x-python","patch_set":5,"id":"fae120a6_f7642f4f","line":84,"range":{"start_line":83,"start_character":0,"end_line":84,"end_character":79},"in_reply_to":"2fe038aa_f8c6c230","updated":"2025-08-19 11:07:48.000000000","message":"You mean we should append the message if there is already a message?","commit_id":"fbf2cad06002b47489f42ab06cd10e0c1fcf2605"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"ae6d515bbcc5c85ebe13820cc3d8ef4d52b82f53","unresolved":true,"context_lines":[{"line_number":80,"context_line":"            skipped_actions \u003d objects.Action.list("},{"line_number":81,"context_line":"                self.ctx, filters\u003dskipped_filter, eager\u003dTrue)"},{"line_number":82,"context_line":"            if skipped_actions:"},{"line_number":83,"context_line":"                status_message \u003d (_(\"Actions were skipped: %s\") %"},{"line_number":84,"context_line":"                                  \", \".join([a.uuid for a in skipped_actions]))"},{"line_number":85,"context_line":"                action_plan.status_message \u003d status_message"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"            action_plan.state \u003d ap_state"}],"source_content_type":"text/x-python","patch_set":5,"id":"570dd4d8_9bd1608d","line":84,"range":{"start_line":83,"start_character":0,"end_line":84,"end_character":79},"in_reply_to":"487fcfee_43dea654","updated":"2025-08-20 08:15:53.000000000","message":"Right, actually Doug mentioned to ommit the IDs in the message to avoid that, which is the simpler approach I think. A user can easily find the actions that have been skipped just by listing all the actions in the actionplan from dashboard or cli (it\u0027d be cool to have an option in watcherclient to filter by state, btw). I forgot to remove the uuids in my last PS, I will do in next.","commit_id":"fbf2cad06002b47489f42ab06cd10e0c1fcf2605"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"5c6861dfaba4cff6f7b0c5234d1d2bd5606599ba","unresolved":true,"context_lines":[{"line_number":80,"context_line":"            skipped_actions \u003d objects.Action.list("},{"line_number":81,"context_line":"                self.ctx, filters\u003dskipped_filter, eager\u003dTrue)"},{"line_number":82,"context_line":"            if skipped_actions:"},{"line_number":83,"context_line":"                status_message \u003d (_(\"Actions were skipped: %s\") %"},{"line_number":84,"context_line":"                                  \", \".join([a.uuid for a in skipped_actions]))"},{"line_number":85,"context_line":"                action_plan.status_message \u003d status_message"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"            action_plan.state \u003d ap_state"}],"source_content_type":"text/x-python","patch_set":5,"id":"ff4ba2c6_ba11f38a","line":84,"range":{"start_line":83,"start_character":0,"end_line":84,"end_character":79},"in_reply_to":"570dd4d8_9bd1608d","updated":"2025-08-20 11:20:22.000000000","message":"About append or override in status_message. I may create a new method `append_status_message(current, new)` in https://github.com/openstack/watcher/blob/master/watcher/common/utils.py, that:\n\n- Adds new message in a new line after current if there is any current.\n- Checks length and cut the entire message to the max length value (255 characters iirc). If current + new is \u003e 255, only the first 255 will be added.\n\nSince then, we may use this helper function to add any status_message to any object, wdyt?","commit_id":"fbf2cad06002b47489f42ab06cd10e0c1fcf2605"},{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"93399d9924ed8d4f8c8b59d7833ca461a275b63e","unresolved":true,"context_lines":[{"line_number":80,"context_line":"            skipped_actions \u003d objects.Action.list("},{"line_number":81,"context_line":"                self.ctx, filters\u003dskipped_filter, eager\u003dTrue)"},{"line_number":82,"context_line":"            if skipped_actions:"},{"line_number":83,"context_line":"                status_message \u003d (_(\"Actions were skipped: %s\") %"},{"line_number":84,"context_line":"                                  \", \".join([a.uuid for a in skipped_actions]))"},{"line_number":85,"context_line":"                action_plan.status_message \u003d status_message"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"            action_plan.state \u003d ap_state"}],"source_content_type":"text/x-python","patch_set":5,"id":"487fcfee_43dea654","line":84,"range":{"start_line":83,"start_character":0,"end_line":84,"end_character":79},"in_reply_to":"6bcf3e25_83243966","updated":"2025-08-20 07:40:04.000000000","message":"ack, thanks Alfredo, we don\u0027t need appending, but we still should be careful with the join of action uuids here. We could check if there are more than say, 5 skipped actions and do the join plus some message like `and others` to avoid running over the size limit for the field, or set the message like `Multiple actions were skipped","commit_id":"fbf2cad06002b47489f42ab06cd10e0c1fcf2605"},{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"051ff06604c9cd07062c0363cefa784792b33dc1","unresolved":true,"context_lines":[{"line_number":80,"context_line":"            skipped_actions \u003d objects.Action.list("},{"line_number":81,"context_line":"                self.ctx, filters\u003dskipped_filter, eager\u003dTrue)"},{"line_number":82,"context_line":"            if skipped_actions:"},{"line_number":83,"context_line":"                status_message \u003d (_(\"Actions were skipped: %s\") %"},{"line_number":84,"context_line":"                                  \", \".join([a.uuid for a in skipped_actions]))"},{"line_number":85,"context_line":"                action_plan.status_message \u003d status_message"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"            action_plan.state \u003d ap_state"}],"source_content_type":"text/x-python","patch_set":5,"id":"2b5b9d73_90da48ae","line":84,"range":{"start_line":83,"start_character":0,"end_line":84,"end_character":79},"in_reply_to":"fae120a6_f7642f4f","updated":"2025-08-19 14:19:59.000000000","message":"+1 to checking before adding the message. If we append (and do it mulitple times) we risk running over the column size and getting an error when trying to write it to the db. IIUC this depends on the db configuration (whether `SQL_STRICT_MODE` is enabled https://dev.mysql.com/doc/refman/8.4/en/sql-mode.html#sql-mode-strict)","commit_id":"fbf2cad06002b47489f42ab06cd10e0c1fcf2605"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"fd133a54572dcd276df24ea359f524d966b7eab5","unresolved":true,"context_lines":[{"line_number":80,"context_line":"            skipped_actions \u003d objects.Action.list("},{"line_number":81,"context_line":"                self.ctx, filters\u003dskipped_filter, eager\u003dTrue)"},{"line_number":82,"context_line":"            if skipped_actions:"},{"line_number":83,"context_line":"                status_message \u003d (_(\"Actions were skipped: %s\") %"},{"line_number":84,"context_line":"                                  \", \".join([a.uuid for a in skipped_actions]))"},{"line_number":85,"context_line":"                action_plan.status_message \u003d status_message"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"            action_plan.state \u003d ap_state"}],"source_content_type":"text/x-python","patch_set":5,"id":"06cc9e05_cc5ec36e","line":84,"range":{"start_line":83,"start_character":0,"end_line":84,"end_character":79},"in_reply_to":"ff4ba2c6_ba11f38a","updated":"2025-08-20 17:21:17.000000000","message":"we just need to guarantee that it doesn\u0027t explode. A more complete implementation can be added afterwards I think. We may need to discuss what we should put in this status_message, since IMO there are some priority in the information added to this field. Maybe we should discuss more about that for a follow up change. For now, we should be good on adding information about the Skipped actions only. If we add more logic here, it may get harder to merge this feature, as everybody will need to agree with the approach.\nRemoving the uuids is better, as Alfredo mention, the user can list the action plan details and see which ones where skipped (and the reason in status_messages).\nSince we don\u0027t add any error message in status_message field yet, this looks good for me.","commit_id":"fbf2cad06002b47489f42ab06cd10e0c1fcf2605"}],"watcher/applier/workflow_engine/base.py":[{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"f1678fc9e52c412812fd83d6da02b8d80b6a3deb","unresolved":true,"context_lines":[{"line_number":178,"context_line":"            self.engine.notify_cancel_start(action_plan.uuid)"},{"line_number":179,"context_line":"            raise"},{"line_number":180,"context_line":"        except exception.ActionSkipped as e:"},{"line_number":181,"context_line":"            LOG.exception(e)"},{"line_number":182,"context_line":"            status_message \u003d (_("},{"line_number":183,"context_line":"                \"Action was skipped automatically: %s\") % str(e))"},{"line_number":184,"context_line":"            db_action \u003d self.engine.notify(self._db_action,"}],"source_content_type":"text/x-python","patch_set":5,"id":"6af3c9b3_4daa3026","line":181,"range":{"start_line":181,"start_character":0,"end_line":181,"end_character":28},"updated":"2025-08-18 21:15:27.000000000","message":"I don\u0027t think that we should not log as exception here, since it is an expected one. We could replace with an INFO instead, wdyt?","commit_id":"fbf2cad06002b47489f42ab06cd10e0c1fcf2605"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"259e120cb7694e982a7807da8a0dc7108414ba50","unresolved":false,"context_lines":[{"line_number":178,"context_line":"            self.engine.notify_cancel_start(action_plan.uuid)"},{"line_number":179,"context_line":"            raise"},{"line_number":180,"context_line":"        except exception.ActionSkipped as e:"},{"line_number":181,"context_line":"            LOG.exception(e)"},{"line_number":182,"context_line":"            status_message \u003d (_("},{"line_number":183,"context_line":"                \"Action was skipped automatically: %s\") % str(e))"},{"line_number":184,"context_line":"            db_action \u003d self.engine.notify(self._db_action,"}],"source_content_type":"text/x-python","patch_set":5,"id":"25bc77ca_7b5182b1","line":181,"range":{"start_line":181,"start_character":0,"end_line":181,"end_character":28},"in_reply_to":"293191a5_5c3fe9f7","updated":"2025-08-19 14:46:53.000000000","message":"Done","commit_id":"fbf2cad06002b47489f42ab06cd10e0c1fcf2605"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"0318e33df7d0efb8ddeb6d8ef8269f9d5662107d","unresolved":true,"context_lines":[{"line_number":178,"context_line":"            self.engine.notify_cancel_start(action_plan.uuid)"},{"line_number":179,"context_line":"            raise"},{"line_number":180,"context_line":"        except exception.ActionSkipped as e:"},{"line_number":181,"context_line":"            LOG.exception(e)"},{"line_number":182,"context_line":"            status_message \u003d (_("},{"line_number":183,"context_line":"                \"Action was skipped automatically: %s\") % str(e))"},{"line_number":184,"context_line":"            db_action \u003d self.engine.notify(self._db_action,"}],"source_content_type":"text/x-python","patch_set":5,"id":"293191a5_5c3fe9f7","line":181,"range":{"start_line":181,"start_character":0,"end_line":181,"end_character":28},"in_reply_to":"6af3c9b3_4daa3026","updated":"2025-08-19 08:47:54.000000000","message":"good point. I agree.","commit_id":"fbf2cad06002b47489f42ab06cd10e0c1fcf2605"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"f1678fc9e52c412812fd83d6da02b8d80b6a3deb","unresolved":true,"context_lines":[{"line_number":187,"context_line":"            notifications.action.send_update("},{"line_number":188,"context_line":"                self.engine.context, db_action,"},{"line_number":189,"context_line":"                old_state\u003dobjects.action.State.PENDING)"},{"line_number":190,"context_line":"        except Exception as e:"},{"line_number":191,"context_line":"            LOG.exception(e)"},{"line_number":192,"context_line":"            status_message \u003d (_("},{"line_number":193,"context_line":"                \"Action failed in pre_condition: %s\") % str(e))"}],"source_content_type":"text/x-python","patch_set":5,"id":"4d07057f_bfce887d","line":190,"range":{"start_line":190,"start_character":8,"end_line":190,"end_character":30},"updated":"2025-08-18 21:15:27.000000000","message":"not sure why this general exception doesn\u0027t raise anything, since it is a failure. Doesn\u0027t match with previous try/except. Doesn\u0027t a raise in here avoid calling execute()?","commit_id":"fbf2cad06002b47489f42ab06cd10e0c1fcf2605"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"0318e33df7d0efb8ddeb6d8ef8269f9d5662107d","unresolved":true,"context_lines":[{"line_number":187,"context_line":"            notifications.action.send_update("},{"line_number":188,"context_line":"                self.engine.context, db_action,"},{"line_number":189,"context_line":"                old_state\u003dobjects.action.State.PENDING)"},{"line_number":190,"context_line":"        except Exception as e:"},{"line_number":191,"context_line":"            LOG.exception(e)"},{"line_number":192,"context_line":"            status_message \u003d (_("},{"line_number":193,"context_line":"                \"Action failed in pre_condition: %s\") % str(e))"}],"source_content_type":"text/x-python","patch_set":5,"id":"db77b9fe_a87d1acf","line":190,"range":{"start_line":190,"start_character":8,"end_line":190,"end_character":30},"in_reply_to":"4d07057f_bfce887d","updated":"2025-08-19 08:47:54.000000000","message":"Not really. in this exception watcher is setting the action as FAILED and that\u0027s what actually avoids executing it after this patch (lines 206-207).\n\nThe tricky part is related to how watcher uses taskflow. We don\u0027t rely on the workflow control provided by it but manage it by ourselves. My understanding is that, the taskflow does not provide the workflow that watcher was willing (i.e. failing a task would avoid the execution of the remaining ones), at least by default so i guess it was decided to implement the workflow in watcher code.\n\nIn the case of ActionPlanCancelled, we raise it because we catch it and manage it in https://github.com/openstack/watcher/blob/90f0c2264c4243b4bfa493e4aa371c5315ce163c/watcher/applier/action_plan/default.py#L84-L92","commit_id":"fbf2cad06002b47489f42ab06cd10e0c1fcf2605"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"fd133a54572dcd276df24ea359f524d966b7eab5","unresolved":false,"context_lines":[{"line_number":187,"context_line":"            notifications.action.send_update("},{"line_number":188,"context_line":"                self.engine.context, db_action,"},{"line_number":189,"context_line":"                old_state\u003dobjects.action.State.PENDING)"},{"line_number":190,"context_line":"        except Exception as e:"},{"line_number":191,"context_line":"            LOG.exception(e)"},{"line_number":192,"context_line":"            status_message \u003d (_("},{"line_number":193,"context_line":"                \"Action failed in pre_condition: %s\") % str(e))"}],"source_content_type":"text/x-python","patch_set":5,"id":"51759755_c0cec973","line":190,"range":{"start_line":190,"start_character":8,"end_line":190,"end_character":30},"in_reply_to":"aaa1b4a0_fc761a13","updated":"2025-08-20 17:21:17.000000000","message":"Acknowledged","commit_id":"fbf2cad06002b47489f42ab06cd10e0c1fcf2605"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"d727d91bf291d354f89137f391a61caf1a4ffbab","unresolved":true,"context_lines":[{"line_number":187,"context_line":"            notifications.action.send_update("},{"line_number":188,"context_line":"                self.engine.context, db_action,"},{"line_number":189,"context_line":"                old_state\u003dobjects.action.State.PENDING)"},{"line_number":190,"context_line":"        except Exception as e:"},{"line_number":191,"context_line":"            LOG.exception(e)"},{"line_number":192,"context_line":"            status_message \u003d (_("},{"line_number":193,"context_line":"                \"Action failed in pre_condition: %s\") % str(e))"}],"source_content_type":"text/x-python","patch_set":5,"id":"aaa1b4a0_fc761a13","line":190,"range":{"start_line":190,"start_character":8,"end_line":190,"end_character":30},"in_reply_to":"db77b9fe_a87d1acf","updated":"2025-08-19 11:39:39.000000000","message":"the same is valid for other exceptions here: https://github.com/openstack/watcher/blob/90f0c2264c4243b4bfa493e4aa371c5315ce163c/watcher/applier/action_plan/default.py#L94\nI am not saying that you should fix this, but for sure these implementations don\u0027t follow a pattern which makes it less reliable :(","commit_id":"fbf2cad06002b47489f42ab06cd10e0c1fcf2605"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"f1678fc9e52c412812fd83d6da02b8d80b6a3deb","unresolved":true,"context_lines":[{"line_number":275,"context_line":"        action_object \u003d objects.Action.get_by_uuid("},{"line_number":276,"context_line":"            self.engine.context, self._db_action.uuid, eager\u003dTrue)"},{"line_number":277,"context_line":"        if action_object.state in [objects.action.State.SKIPPED,"},{"line_number":278,"context_line":"                                   objects.action.State.FAILED]:"},{"line_number":279,"context_line":"            return True"},{"line_number":280,"context_line":"        try:"},{"line_number":281,"context_line":"            self.do_post_execute()"}],"source_content_type":"text/x-python","patch_set":5,"id":"701eb77f_bd2094ba","line":278,"range":{"start_line":278,"start_character":35,"end_line":278,"end_character":62},"updated":"2025-08-18 21:15:27.000000000","message":"I know that we don\u0027t have actions that really implement post_condition, but I think that a FAILED action could use the post_condition to clean things up.","commit_id":"fbf2cad06002b47489f42ab06cd10e0c1fcf2605"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"d727d91bf291d354f89137f391a61caf1a4ffbab","unresolved":true,"context_lines":[{"line_number":275,"context_line":"        action_object \u003d objects.Action.get_by_uuid("},{"line_number":276,"context_line":"            self.engine.context, self._db_action.uuid, eager\u003dTrue)"},{"line_number":277,"context_line":"        if action_object.state in [objects.action.State.SKIPPED,"},{"line_number":278,"context_line":"                                   objects.action.State.FAILED]:"},{"line_number":279,"context_line":"            return True"},{"line_number":280,"context_line":"        try:"},{"line_number":281,"context_line":"            self.do_post_execute()"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba6f94e4_67e9eb4d","line":278,"range":{"start_line":278,"start_character":35,"end_line":278,"end_character":62},"in_reply_to":"4d6682e2_577d14fe","updated":"2025-08-19 11:39:39.000000000","message":"I would focus on the skipped, since by adding the FAILED in this logic, you are changing the previous behavior (and we know that today there is no actions implementing post_condition())","commit_id":"fbf2cad06002b47489f42ab06cd10e0c1fcf2605"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"0318e33df7d0efb8ddeb6d8ef8269f9d5662107d","unresolved":true,"context_lines":[{"line_number":275,"context_line":"        action_object \u003d objects.Action.get_by_uuid("},{"line_number":276,"context_line":"            self.engine.context, self._db_action.uuid, eager\u003dTrue)"},{"line_number":277,"context_line":"        if action_object.state in [objects.action.State.SKIPPED,"},{"line_number":278,"context_line":"                                   objects.action.State.FAILED]:"},{"line_number":279,"context_line":"            return True"},{"line_number":280,"context_line":"        try:"},{"line_number":281,"context_line":"            self.do_post_execute()"}],"source_content_type":"text/x-python","patch_set":5,"id":"4d6682e2_577d14fe","line":278,"range":{"start_line":278,"start_character":35,"end_line":278,"end_character":62},"in_reply_to":"701eb77f_bd2094ba","updated":"2025-08-19 08:47:54.000000000","message":"I\u0027m unsure, tbh, but it\u0027s a good point to discuss. I\u0027ll bring the question in the irc meeting.","commit_id":"fbf2cad06002b47489f42ab06cd10e0c1fcf2605"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"259e120cb7694e982a7807da8a0dc7108414ba50","unresolved":false,"context_lines":[{"line_number":275,"context_line":"        action_object \u003d objects.Action.get_by_uuid("},{"line_number":276,"context_line":"            self.engine.context, self._db_action.uuid, eager\u003dTrue)"},{"line_number":277,"context_line":"        if action_object.state in [objects.action.State.SKIPPED,"},{"line_number":278,"context_line":"                                   objects.action.State.FAILED]:"},{"line_number":279,"context_line":"            return True"},{"line_number":280,"context_line":"        try:"},{"line_number":281,"context_line":"            self.do_post_execute()"}],"source_content_type":"text/x-python","patch_set":5,"id":"7f59aa24_3729701a","line":278,"range":{"start_line":278,"start_character":35,"end_line":278,"end_character":62},"in_reply_to":"ba6f94e4_67e9eb4d","updated":"2025-08-19 14:46:53.000000000","message":"good point. Done.","commit_id":"fbf2cad06002b47489f42ab06cd10e0c1fcf2605"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"f1678fc9e52c412812fd83d6da02b8d80b6a3deb","unresolved":true,"context_lines":[{"line_number":276,"context_line":"            self.engine.context, self._db_action.uuid, eager\u003dTrue)"},{"line_number":277,"context_line":"        if action_object.state in [objects.action.State.SKIPPED,"},{"line_number":278,"context_line":"                                   objects.action.State.FAILED]:"},{"line_number":279,"context_line":"            return True"},{"line_number":280,"context_line":"        try:"},{"line_number":281,"context_line":"            self.do_post_execute()"},{"line_number":282,"context_line":"        except Exception as e:"}],"source_content_type":"text/x-python","patch_set":5,"id":"7dd30c2e_2856dfe7","line":279,"range":{"start_line":279,"start_character":0,"end_line":279,"end_character":23},"updated":"2025-08-18 21:15:27.000000000","message":"I don\u0027t think that we need to return a boolean, actually I didn\u0027t found in the documentation.","commit_id":"fbf2cad06002b47489f42ab06cd10e0c1fcf2605"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"259e120cb7694e982a7807da8a0dc7108414ba50","unresolved":false,"context_lines":[{"line_number":276,"context_line":"            self.engine.context, self._db_action.uuid, eager\u003dTrue)"},{"line_number":277,"context_line":"        if action_object.state in [objects.action.State.SKIPPED,"},{"line_number":278,"context_line":"                                   objects.action.State.FAILED]:"},{"line_number":279,"context_line":"            return True"},{"line_number":280,"context_line":"        try:"},{"line_number":281,"context_line":"            self.do_post_execute()"},{"line_number":282,"context_line":"        except Exception as e:"}],"source_content_type":"text/x-python","patch_set":5,"id":"bfd2a33f_a3677594","line":279,"range":{"start_line":279,"start_character":0,"end_line":279,"end_character":23},"in_reply_to":"62afae52_8fde5e8a","updated":"2025-08-19 14:46:53.000000000","message":"Done","commit_id":"fbf2cad06002b47489f42ab06cd10e0c1fcf2605"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"d727d91bf291d354f89137f391a61caf1a4ffbab","unresolved":true,"context_lines":[{"line_number":276,"context_line":"            self.engine.context, self._db_action.uuid, eager\u003dTrue)"},{"line_number":277,"context_line":"        if action_object.state in [objects.action.State.SKIPPED,"},{"line_number":278,"context_line":"                                   objects.action.State.FAILED]:"},{"line_number":279,"context_line":"            return True"},{"line_number":280,"context_line":"        try:"},{"line_number":281,"context_line":"            self.do_post_execute()"},{"line_number":282,"context_line":"        except Exception as e:"}],"source_content_type":"text/x-python","patch_set":5,"id":"62afae52_8fde5e8a","line":279,"range":{"start_line":279,"start_character":0,"end_line":279,"end_character":23},"in_reply_to":"70934491_08885cd9","updated":"2025-08-19 11:39:39.000000000","message":"right, but 952538 is not yet merged. I think that this entire workflow needs to be reviewed and discussed before changing it, so I was expectiong to not change things that are not needed in that change. I think that you can keep this for now, since it may be harmless. thanks","commit_id":"fbf2cad06002b47489f42ab06cd10e0c1fcf2605"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"0318e33df7d0efb8ddeb6d8ef8269f9d5662107d","unresolved":true,"context_lines":[{"line_number":276,"context_line":"            self.engine.context, self._db_action.uuid, eager\u003dTrue)"},{"line_number":277,"context_line":"        if action_object.state in [objects.action.State.SKIPPED,"},{"line_number":278,"context_line":"                                   objects.action.State.FAILED]:"},{"line_number":279,"context_line":"            return True"},{"line_number":280,"context_line":"        try:"},{"line_number":281,"context_line":"            self.do_post_execute()"},{"line_number":282,"context_line":"        except Exception as e:"}],"source_content_type":"text/x-python","patch_set":5,"id":"70934491_08885cd9","line":279,"range":{"start_line":279,"start_character":0,"end_line":279,"end_character":23},"in_reply_to":"7dd30c2e_2856dfe7","updated":"2025-08-19 08:47:54.000000000","message":"I was aligning it with what is being implemented in  https://review.opendev.org/c/openstack/watcher/+/952538","commit_id":"fbf2cad06002b47489f42ab06cd10e0c1fcf2605"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"f1678fc9e52c412812fd83d6da02b8d80b6a3deb","unresolved":true,"context_lines":[{"line_number":283,"context_line":"            LOG.exception(e)"},{"line_number":284,"context_line":"            status_message \u003d (_("},{"line_number":285,"context_line":"                \"Action failed in post_condition: %s\") % str(e))"},{"line_number":286,"context_line":"            db_action \u003d self.engine.notify(self._db_action,"},{"line_number":287,"context_line":"                                           objects.action.State.FAILED,"},{"line_number":288,"context_line":"                                           status_message\u003dstatus_message)"},{"line_number":289,"context_line":"            notifications.action.send_execution_notification("},{"line_number":290,"context_line":"                self.engine.context, db_action,"},{"line_number":291,"context_line":"                fields.NotificationAction.EXECUTION,"}],"source_content_type":"text/x-python","patch_set":5,"id":"3f1b5930_bcace488","line":288,"range":{"start_line":286,"start_character":0,"end_line":288,"end_character":73},"updated":"2025-08-18 21:15:27.000000000","message":"If we consider calling post_execute() for FAILED actions, we may want to consider not overriding the previous error message, from the execute()?","commit_id":"fbf2cad06002b47489f42ab06cd10e0c1fcf2605"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"259e120cb7694e982a7807da8a0dc7108414ba50","unresolved":false,"context_lines":[{"line_number":283,"context_line":"            LOG.exception(e)"},{"line_number":284,"context_line":"            status_message \u003d (_("},{"line_number":285,"context_line":"                \"Action failed in post_condition: %s\") % str(e))"},{"line_number":286,"context_line":"            db_action \u003d self.engine.notify(self._db_action,"},{"line_number":287,"context_line":"                                           objects.action.State.FAILED,"},{"line_number":288,"context_line":"                                           status_message\u003dstatus_message)"},{"line_number":289,"context_line":"            notifications.action.send_execution_notification("},{"line_number":290,"context_line":"                self.engine.context, db_action,"},{"line_number":291,"context_line":"                fields.NotificationAction.EXECUTION,"}],"source_content_type":"text/x-python","patch_set":5,"id":"6ce8208d_05ea2899","line":288,"range":{"start_line":286,"start_character":0,"end_line":288,"end_character":73},"in_reply_to":"2e0f4577_1e527d3b","updated":"2025-08-19 14:46:53.000000000","message":"Done. This will only add a status_message if it\u0027s empty. Otherwise it keeps the existing one.","commit_id":"fbf2cad06002b47489f42ab06cd10e0c1fcf2605"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"0318e33df7d0efb8ddeb6d8ef8269f9d5662107d","unresolved":true,"context_lines":[{"line_number":283,"context_line":"            LOG.exception(e)"},{"line_number":284,"context_line":"            status_message \u003d (_("},{"line_number":285,"context_line":"                \"Action failed in post_condition: %s\") % str(e))"},{"line_number":286,"context_line":"            db_action \u003d self.engine.notify(self._db_action,"},{"line_number":287,"context_line":"                                           objects.action.State.FAILED,"},{"line_number":288,"context_line":"                                           status_message\u003dstatus_message)"},{"line_number":289,"context_line":"            notifications.action.send_execution_notification("},{"line_number":290,"context_line":"                self.engine.context, db_action,"},{"line_number":291,"context_line":"                fields.NotificationAction.EXECUTION,"}],"source_content_type":"text/x-python","patch_set":5,"id":"8cb7d95d_70efb274","line":288,"range":{"start_line":286,"start_character":0,"end_line":288,"end_character":73},"in_reply_to":"3f1b5930_bcace488","updated":"2025-08-19 08:47:54.000000000","message":"right. But then, what should we do if an action succeeded in pre_condition and fails in post_execute()","commit_id":"fbf2cad06002b47489f42ab06cd10e0c1fcf2605"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"fd133a54572dcd276df24ea359f524d966b7eab5","unresolved":false,"context_lines":[{"line_number":283,"context_line":"            LOG.exception(e)"},{"line_number":284,"context_line":"            status_message \u003d (_("},{"line_number":285,"context_line":"                \"Action failed in post_condition: %s\") % str(e))"},{"line_number":286,"context_line":"            db_action \u003d self.engine.notify(self._db_action,"},{"line_number":287,"context_line":"                                           objects.action.State.FAILED,"},{"line_number":288,"context_line":"                                           status_message\u003dstatus_message)"},{"line_number":289,"context_line":"            notifications.action.send_execution_notification("},{"line_number":290,"context_line":"                self.engine.context, db_action,"},{"line_number":291,"context_line":"                fields.NotificationAction.EXECUTION,"}],"source_content_type":"text/x-python","patch_set":5,"id":"fc6a7ce0_bba58177","line":288,"range":{"start_line":286,"start_character":0,"end_line":288,"end_character":73},"in_reply_to":"6ce8208d_05ea2899","updated":"2025-08-20 17:21:17.000000000","message":"Ack, we should discuss more about how to properly populate this field, to not override important information. But for now, we are good, since this is the first patch that is using it. Thanks","commit_id":"fbf2cad06002b47489f42ab06cd10e0c1fcf2605"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"d727d91bf291d354f89137f391a61caf1a4ffbab","unresolved":true,"context_lines":[{"line_number":283,"context_line":"            LOG.exception(e)"},{"line_number":284,"context_line":"            status_message \u003d (_("},{"line_number":285,"context_line":"                \"Action failed in post_condition: %s\") % str(e))"},{"line_number":286,"context_line":"            db_action \u003d self.engine.notify(self._db_action,"},{"line_number":287,"context_line":"                                           objects.action.State.FAILED,"},{"line_number":288,"context_line":"                                           status_message\u003dstatus_message)"},{"line_number":289,"context_line":"            notifications.action.send_execution_notification("},{"line_number":290,"context_line":"                self.engine.context, db_action,"},{"line_number":291,"context_line":"                fields.NotificationAction.EXECUTION,"}],"source_content_type":"text/x-python","patch_set":5,"id":"2e0f4577_1e527d3b","line":288,"range":{"start_line":286,"start_character":0,"end_line":288,"end_character":73},"in_reply_to":"8cb7d95d_70efb274","updated":"2025-08-19 11:39:39.000000000","message":"Something that needs to be discussed, but it was not part of the spec, so we don\u0027t really need to add this. I would say that the first error message is the most important one, so for imho, we should only set a new message if the field is empty.","commit_id":"fbf2cad06002b47489f42ab06cd10e0c1fcf2605"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"cff49c041c139c3581c4420861693ac64f0ca716","unresolved":true,"context_lines":[{"line_number":220,"context_line":"                LOG.error(\u0027The workflow engine has failed \u0027"},{"line_number":221,"context_line":"                          \u0027to execute the action: %s\u0027, self.name)"},{"line_number":222,"context_line":"                status_message \u003d (_("},{"line_number":223,"context_line":"                    \"Action failed in execute: %s\") % str(e))"},{"line_number":224,"context_line":"                db_action \u003d self.engine.notify(self._db_action,"},{"line_number":225,"context_line":"                                               objects.action.State.FAILED,"},{"line_number":226,"context_line":"                                               status_message\u003dstatus_message)"}],"source_content_type":"text/x-python","patch_set":8,"id":"f4c9c78a_4e9e5088","line":223,"updated":"2025-08-21 14:45:11.000000000","message":"the only  reaosn im not -1 is becasue the logic in the code is not the same as the logic your asserting in the test.\n\non the ohter hand here and above the excption could exceed 255 if the traceback was incldued.\n\n\nit should not be i this case but we need to be carful with that in the future.","commit_id":"6d35be11ecdd8ff7e43040d0988a0273008c53da"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"0aa51a60d2cf958d5c8655548ecebd71e95e74a6","unresolved":true,"context_lines":[{"line_number":220,"context_line":"                LOG.error(\u0027The workflow engine has failed \u0027"},{"line_number":221,"context_line":"                          \u0027to execute the action: %s\u0027, self.name)"},{"line_number":222,"context_line":"                status_message \u003d (_("},{"line_number":223,"context_line":"                    \"Action failed in execute: %s\") % str(e))"},{"line_number":224,"context_line":"                db_action \u003d self.engine.notify(self._db_action,"},{"line_number":225,"context_line":"                                               objects.action.State.FAILED,"},{"line_number":226,"context_line":"                                               status_message\u003dstatus_message)"}],"source_content_type":"text/x-python","patch_set":8,"id":"cebac26b_76815f73","line":223,"in_reply_to":"f4c9c78a_4e9e5088","updated":"2025-08-25 19:39:35.000000000","message":"we need to discuss more about the proper usage of this status_message field for other flows (other than SKIPPED). This feature should be focusing only in the skipped actions, which was the discussion around the spec. I am ok on using the status_message here now, but we should build a proper solution for getting the better usage of this field in future, and avoid replacing important messages in different parts of the code.","commit_id":"6d35be11ecdd8ff7e43040d0988a0273008c53da"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"b9f75018a2bc2f588acbff42a871e4cc00f8a6aa","unresolved":true,"context_lines":[{"line_number":300,"context_line":"        # NOTE: check if revert cause by cancel action plan or"},{"line_number":301,"context_line":"        # some other exception occurred during action plan execution"},{"line_number":302,"context_line":"        # if due to some other exception keep the flow intact."},{"line_number":303,"context_line":"        if action_plan.state not in CANCEL_STATE:"},{"line_number":304,"context_line":"            self.do_revert()"},{"line_number":305,"context_line":"            return"},{"line_number":306,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"f6f491a2_5b7b085c","line":303,"updated":"2025-08-21 14:53:02.000000000","message":"I think that we should consider that SKIPPED actions must not execute the do_revert here, since nothing was changed. This could raise some exceptions if executed by a SKIPPED action and move it to FAILED in the end.","commit_id":"6d35be11ecdd8ff7e43040d0988a0273008c53da"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"0aa51a60d2cf958d5c8655548ecebd71e95e74a6","unresolved":false,"context_lines":[{"line_number":300,"context_line":"        # NOTE: check if revert cause by cancel action plan or"},{"line_number":301,"context_line":"        # some other exception occurred during action plan execution"},{"line_number":302,"context_line":"        # if due to some other exception keep the flow intact."},{"line_number":303,"context_line":"        if action_plan.state not in CANCEL_STATE:"},{"line_number":304,"context_line":"            self.do_revert()"},{"line_number":305,"context_line":"            return"},{"line_number":306,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"b7605d57_c462fd62","line":303,"in_reply_to":"f6f491a2_5b7b085c","updated":"2025-08-25 19:39:35.000000000","message":"Adding SKIPEED check in a follow up change.","commit_id":"6d35be11ecdd8ff7e43040d0988a0273008c53da"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"fc9c863b5d2288cca9f523c4217a3b3caf73e2e4","unresolved":true,"context_lines":[{"line_number":300,"context_line":"        # NOTE: check if revert cause by cancel action plan or"},{"line_number":301,"context_line":"        # some other exception occurred during action plan execution"},{"line_number":302,"context_line":"        # if due to some other exception keep the flow intact."},{"line_number":303,"context_line":"        if action_plan.state not in CANCEL_STATE:"},{"line_number":304,"context_line":"            self.do_revert()"},{"line_number":305,"context_line":"            return"},{"line_number":306,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"204c09d4_61b41f96","line":303,"in_reply_to":"f6f491a2_5b7b085c","updated":"2025-08-25 18:41:29.000000000","message":"i agree","commit_id":"6d35be11ecdd8ff7e43040d0988a0273008c53da"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"b9f75018a2bc2f588acbff42a871e4cc00f8a6aa","unresolved":true,"context_lines":[{"line_number":344,"context_line":"                priority\u003dfields.NotificationPriority.ERROR)"},{"line_number":345,"context_line":""},{"line_number":346,"context_line":"    def abort(self, *args, **kwargs):"},{"line_number":347,"context_line":"        return self.do_abort(*args, **kwargs)"}],"source_content_type":"text/x-python","patch_set":8,"id":"25be6eea_2b2196a9","line":347,"updated":"2025-08-21 14:53:02.000000000","message":"Not sure why PENDING is not checked here but SKIPPED actions we could avoid calling abort and just return? an exception raised here will move the Action to FAILED","commit_id":"6d35be11ecdd8ff7e43040d0988a0273008c53da"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"0aa51a60d2cf958d5c8655548ecebd71e95e74a6","unresolved":true,"context_lines":[{"line_number":344,"context_line":"                priority\u003dfields.NotificationPriority.ERROR)"},{"line_number":345,"context_line":""},{"line_number":346,"context_line":"    def abort(self, *args, **kwargs):"},{"line_number":347,"context_line":"        return self.do_abort(*args, **kwargs)"}],"source_content_type":"text/x-python","patch_set":8,"id":"a0d69225_a8a08ac8","line":347,"in_reply_to":"25be6eea_2b2196a9","updated":"2025-08-25 19:39:35.000000000","message":"Checking the code, it seems that abort is only called for objects.action.State.ONGOING actions. So we should be ok here.\nhttps://opendev.org/openstack/watcher/src/commit/4d8f86b4329c25ed049c01c408a82c83f9c5c6c6/watcher/applier/workflow_engine/base.py#L278","commit_id":"6d35be11ecdd8ff7e43040d0988a0273008c53da"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"fc9c863b5d2288cca9f523c4217a3b3caf73e2e4","unresolved":true,"context_lines":[{"line_number":344,"context_line":"                priority\u003dfields.NotificationPriority.ERROR)"},{"line_number":345,"context_line":""},{"line_number":346,"context_line":"    def abort(self, *args, **kwargs):"},{"line_number":347,"context_line":"        return self.do_abort(*args, **kwargs)"}],"source_content_type":"text/x-python","patch_set":8,"id":"8495d332_346836f2","line":347,"in_reply_to":"25be6eea_2b2196a9","updated":"2025-08-25 18:41:29.000000000","message":"i guess today if its in pending it can never call abort\nbut we shoudl not call abort in skipped either.","commit_id":"6d35be11ecdd8ff7e43040d0988a0273008c53da"}],"watcher/common/exception.py":[{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"aee7e021b5e523e4f323bb6de60bd4ccaf3a05ef","unresolved":true,"context_lines":[{"line_number":283,"context_line":""},{"line_number":284,"context_line":""},{"line_number":285,"context_line":"class ActionSkipped(WatcherException):"},{"line_number":286,"context_line":"    pass"},{"line_number":287,"context_line":""},{"line_number":288,"context_line":""},{"line_number":289,"context_line":"class ActionPlanNotFound(ResourceNotFound):"}],"source_content_type":"text/x-python","patch_set":1,"id":"26be7da6_fd32b806","line":286,"range":{"start_line":286,"start_character":4,"end_line":286,"end_character":8},"updated":"2025-07-17 08:20:20.000000000","message":"Instead of pass, Can we add a proper message here. Like\n```\nmsg_fmt \u003d _(Action skipped. Reason: %(reason)s\")\n```\nand we call this exception like ActionSkipped(reason\u003d\u003creason\u003e).","commit_id":"c7336da68b2be710b3e5fb72938e1e200503bca4"},{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"3a02f957b3dea6afff0c8360744218bc276939d8","unresolved":false,"context_lines":[{"line_number":283,"context_line":""},{"line_number":284,"context_line":""},{"line_number":285,"context_line":"class ActionSkipped(WatcherException):"},{"line_number":286,"context_line":"    pass"},{"line_number":287,"context_line":""},{"line_number":288,"context_line":""},{"line_number":289,"context_line":"class ActionPlanNotFound(ResourceNotFound):"}],"source_content_type":"text/x-python","patch_set":1,"id":"728a6db9_4534b24a","line":286,"range":{"start_line":286,"start_character":4,"end_line":286,"end_character":8},"in_reply_to":"26be7da6_fd32b806","updated":"2025-07-17 15:20:52.000000000","message":"Based on discussion, We have some custom message related to Action being skipped. If we go via above suggestion, it makes the things more repetitive.\nIt\u0027s better to stick with the current implementation.","commit_id":"c7336da68b2be710b3e5fb72938e1e200503bca4"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"3c1546e42c9a2c0af886c535fec88723e090b70c","unresolved":false,"context_lines":[{"line_number":283,"context_line":""},{"line_number":284,"context_line":""},{"line_number":285,"context_line":"class ActionSkipped(WatcherException):"},{"line_number":286,"context_line":"    pass"},{"line_number":287,"context_line":""},{"line_number":288,"context_line":""},{"line_number":289,"context_line":"class ActionPlanNotFound(ResourceNotFound):"}],"source_content_type":"text/x-python","patch_set":1,"id":"1fea8b2d_8537a2df","line":286,"range":{"start_line":286,"start_character":4,"end_line":286,"end_character":8},"in_reply_to":"728a6db9_4534b24a","updated":"2025-07-17 16:11:38.000000000","message":"I\u0027m managing the status_message for the action case in https://review.opendev.org/c/openstack/watcher/+/954746/1/watcher/applier/workflow_engine/base.py:\n\n```\n        except exception.ActionSkipped as e:\n            LOG.exception(e)\n            status_message \u003d (_(\n                \"Action was skipped automatically: %s\") % str(e))\n```\n\nWe could instead force the message as you suggested but in that case the status message would be something like `Action was skipped automatically:  Action skipped. Reason: ...` which is repetitive, so in that case we should do status_message \u003d str(e) and force to always use msg_fmt with a reason parameter. It is doable but I found safer and simpler to keep exception messages concise to the reason and manage the status_message in the exception handling, as I did when setting status failed because of any other exception.","commit_id":"c7336da68b2be710b3e5fb72938e1e200503bca4"}],"watcher/tests/applier/workflow_engine/test_default_workflow_engine.py":[{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"051ff06604c9cd07062c0363cefa784792b33dc1","unresolved":true,"context_lines":[{"line_number":110,"context_line":"        \"\"\""},{"line_number":111,"context_line":"        if old_state:"},{"line_number":112,"context_line":"            action_state[\u0027old_state\u0027] \u003d old_state"},{"line_number":113,"context_line":"        for call in notification_calls:"},{"line_number":114,"context_line":"            data_dict \u003d call.args[1].as_dict()"},{"line_number":115,"context_line":"            if call.kwargs and \u0027old_state\u0027 in call.kwargs:"},{"line_number":116,"context_line":"                data_dict[\u0027old_state\u0027] \u003d call.kwargs[\u0027old_state\u0027]"}],"source_content_type":"text/x-python","patch_set":6,"id":"bb3e71c8_9728e24a","line":113,"updated":"2025-08-19 14:19:59.000000000","message":"could we use the state and uuid to check for the right notification to compare ot the `action_state`? I\u0027m not sure if it\u0027s possible, but if it is, I feel like it would be more robust that this try/except, which could be hiding other problems","commit_id":"9076922c10f1d2760fbfd76a2cca51ceeb941a47"},{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"aef1e64df90d479b2d1badf7ee1ffefe59c38a62","unresolved":false,"context_lines":[{"line_number":110,"context_line":"        \"\"\""},{"line_number":111,"context_line":"        if old_state:"},{"line_number":112,"context_line":"            action_state[\u0027old_state\u0027] \u003d old_state"},{"line_number":113,"context_line":"        for call in notification_calls:"},{"line_number":114,"context_line":"            data_dict \u003d call.args[1].as_dict()"},{"line_number":115,"context_line":"            if call.kwargs and \u0027old_state\u0027 in call.kwargs:"},{"line_number":116,"context_line":"                data_dict[\u0027old_state\u0027] \u003d call.kwargs[\u0027old_state\u0027]"}],"source_content_type":"text/x-python","patch_set":6,"id":"c7c675fb_ab49455e","line":113,"in_reply_to":"bb3e71c8_9728e24a","updated":"2025-08-19 15:08:08.000000000","message":"after reading how the function is invoked, I realized there is no risk from the try/except, this comment can be ignored","commit_id":"9076922c10f1d2760fbfd76a2cca51ceeb941a47"},{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"051ff06604c9cd07062c0363cefa784792b33dc1","unresolved":true,"context_lines":[{"line_number":115,"context_line":"            if call.kwargs and \u0027old_state\u0027 in call.kwargs:"},{"line_number":116,"context_line":"                data_dict[\u0027old_state\u0027] \u003d call.kwargs[\u0027old_state\u0027]"},{"line_number":117,"context_line":"            try:"},{"line_number":118,"context_line":"                self.assertLessEqual(action_state.items(), data_dict.items())"},{"line_number":119,"context_line":"                return True"},{"line_number":120,"context_line":"            except AssertionError:"},{"line_number":121,"context_line":"                continue"}],"source_content_type":"text/x-python","patch_set":6,"id":"37e8d440_bbefb998","line":118,"updated":"2025-08-19 14:19:59.000000000","message":"TIL about this, I did not know that the view return by `items`is set-like (https://docs.python.org/3/library/stdtypes.html#dictionary-view-objects)","commit_id":"9076922c10f1d2760fbfd76a2cca51ceeb941a47"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"cff49c041c139c3581c4420861693ac64f0ca716","unresolved":true,"context_lines":[{"line_number":115,"context_line":"            if call.kwargs and \u0027old_state\u0027 in call.kwargs:"},{"line_number":116,"context_line":"                data_dict[\u0027old_state\u0027] \u003d call.kwargs[\u0027old_state\u0027]"},{"line_number":117,"context_line":"            try:"},{"line_number":118,"context_line":"                self.assertLessEqual(action_state.items(), data_dict.items())"},{"line_number":119,"context_line":"                return True"},{"line_number":120,"context_line":"            except AssertionError:"},{"line_number":121,"context_line":"                continue"}],"source_content_type":"text/x-python","patch_set":6,"id":"503292a2_28a38726","line":118,"in_reply_to":"37e8d440_bbefb998","updated":"2025-08-21 14:45:11.000000000","message":"its a maping object so its not strictly set like but it is countable so you can compare the lenght like this.","commit_id":"9076922c10f1d2760fbfd76a2cca51ceeb941a47"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"cff49c041c139c3581c4420861693ac64f0ca716","unresolved":true,"context_lines":[{"line_number":358,"context_line":"                \u0027state\u0027: objects.action.State.FAILED,"},{"line_number":359,"context_line":"                \u0027uuid\u0027: actions[0].uuid,"},{"line_number":360,"context_line":"                \u0027action_type\u0027: \u0027fake_action\u0027,"},{"line_number":361,"context_line":"                \u0027status_message\u0027: \"Action failed in execute: The action %s \""},{"line_number":362,"context_line":"                \"execution failed.\" % actions[0].uuid,"},{"line_number":363,"context_line":"            },"},{"line_number":364,"context_line":"        ))"}],"source_content_type":"text/x-python","patch_set":8,"id":"32d983c6_b6c0d4c7","line":361,"updated":"2025-08-21 14:45:11.000000000","message":"i was going to say that `The action %s` is not a very good message\n\nbut that is coming form the test code not the real code.\n\n\nwe should not repeat `The action` just have the error","commit_id":"6d35be11ecdd8ff7e43040d0988a0273008c53da"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"cff49c041c139c3581c4420861693ac64f0ca716","unresolved":true,"context_lines":[{"line_number":564,"context_line":"        self.assertEqual("},{"line_number":565,"context_line":"            objects.Action.get_by_uuid("},{"line_number":566,"context_line":"                self.context, action4.uuid).status_message,"},{"line_number":567,"context_line":"            \"Action failed in execute: The action %s execution failed.\""},{"line_number":568,"context_line":"            % action4.uuid)"},{"line_number":569,"context_line":"        # action failed in the post_condition phase"},{"line_number":570,"context_line":"        self.check_action_state(action5, objects.action.State.FAILED)"}],"source_content_type":"text/x-python","patch_set":8,"id":"5555d104_0be825f8","line":567,"range":{"start_line":567,"start_character":12,"end_line":567,"end_character":71},"updated":"2025-08-21 14:45:11.000000000","message":"as noted above thsi si not a good status message as its very redudnet\n\nwe shoudl be saying why it faled. we shoudl not jsut be listing the uuid or name ectra.\n\nthat woudl pfovidne not value over leave the status message blank.","commit_id":"6d35be11ecdd8ff7e43040d0988a0273008c53da"}]}
