)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"c3f7899231d4f70747b4dcabb80e9d24af0711e5","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"28cf7cc8_b3856145","updated":"2025-09-20 18:25:40.000000000","message":"recheck\n\naetos job failed to deploy devstck in compute node","commit_id":"146463fd8cdcb739ecb369aa33bc70d8c246d9ba"},{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"4e3b06be0182d29e93e340d4bc87e4e72020e49b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"1e24b8ef_82327d6c","updated":"2025-09-25 12:25:38.000000000","message":"recheck-rdo","commit_id":"40da2eaedccf98523e9d3bea7869ea7b1c1f1a70"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"be6c6606ae62d3e0e014d31880a794d2ca8f5ae3","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"52cb82f9_9ae54b86","updated":"2025-10-01 10:00:50.000000000","message":"I think this refactor is good an makes a lot of sense.\n\nMy only doubt is about the scope, if we want to use this refactor to apply some more changes (i.e. validating action types in actions in some tests where we are not doing it), or if we want to do pure refactor and fix in follow ups. Any works for me.","commit_id":"9e3bda116d206a719e05e22ea53585d84171f73c"},{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"c39de48e90a0c4d9df5ce5cb86c3d7b212287fc9","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":11,"id":"3ed57190_3c3231e9","updated":"2025-10-06 15:08:41.000000000","message":"lgtm, this is very needed the execute_strategy method was strongly overloaded","commit_id":"47ddf23d77ca9143245fdad1074224cffe17650d"},{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"317bced9fb14d51507cb1a169b6394695112db0b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":11,"id":"faaf0393_bea2401d","updated":"2025-10-07 07:18:02.000000000","message":"looks much better now.","commit_id":"47ddf23d77ca9143245fdad1074224cffe17650d"},{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"7e1be670729ad4330d011576471c4ef5492be7e7","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":11,"id":"c30f1b89_42cb3f7c","updated":"2025-10-07 05:33:56.000000000","message":"recheck","commit_id":"47ddf23d77ca9143245fdad1074224cffe17650d"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"75ee792502c0921417e493afaa60a10ae67b95f8","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":11,"id":"53c680e3_1d1150de","updated":"2025-10-04 13:12:26.000000000","message":"recheck\n\npost-failure","commit_id":"47ddf23d77ca9143245fdad1074224cffe17650d"}],"watcher_tempest_plugin/tests/scenario/base.py":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"42cd7e6d4e1d30c13b6fce85bb6d9a802e75bb68","unresolved":true,"context_lines":[{"line_number":951,"context_line":"                return True"},{"line_number":952,"context_line":"        return False"},{"line_number":953,"context_line":""},{"line_number":954,"context_line":"    def _create_audit_template_for_strategy(self, goal_name, strategy_name):"},{"line_number":955,"context_line":"        \"\"\"Create and return an audit template for the given goal/strategy.\"\"\""},{"line_number":956,"context_line":""},{"line_number":957,"context_line":"        _, goal \u003d self.client.show_goal(goal_name)"}],"source_content_type":"text/x-python","patch_set":8,"id":"f1da31b7_e8200aa1","line":954,"range":{"start_line":954,"start_character":3,"end_line":954,"end_character":76},"updated":"2025-10-02 13:32:33.000000000","message":"you are declaring this as \"private\" via the undersocer which mean it should not be called outside of this class even by other classes that inherit form it\n\n```suggestion\n    @classmethod\n    def create_audit_template_for_strategy(\n        cls, goal_name\u003dNone, strategy_name\u003dNone):\n        \"\"\"Create and return an audit template for the given goal/strategy.\"\"\"\n        goal_name \u003d goal_name or cls.GOAL\n        strategy_name \u003d strategy_name or cls.STRATEGY\n```","commit_id":"9e3bda116d206a719e05e22ea53585d84171f73c"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"d37238815b6fd4e1ee38b4a23c3fd5785664e8ee","unresolved":false,"context_lines":[{"line_number":951,"context_line":"                return True"},{"line_number":952,"context_line":"        return False"},{"line_number":953,"context_line":""},{"line_number":954,"context_line":"    def _create_audit_template_for_strategy(self, goal_name, strategy_name):"},{"line_number":955,"context_line":"        \"\"\"Create and return an audit template for the given goal/strategy.\"\"\""},{"line_number":956,"context_line":""},{"line_number":957,"context_line":"        _, goal \u003d self.client.show_goal(goal_name)"}],"source_content_type":"text/x-python","patch_set":8,"id":"995be5ad_1e7ea393","line":954,"range":{"start_line":954,"start_character":3,"end_line":954,"end_character":76},"in_reply_to":"cd951635_6bd0b022","updated":"2025-10-06 15:40:06.000000000","message":"Done","commit_id":"9e3bda116d206a719e05e22ea53585d84171f73c"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"d769f53936e1ae51fafd4b0bb060d28f88be2e26","unresolved":true,"context_lines":[{"line_number":951,"context_line":"                return True"},{"line_number":952,"context_line":"        return False"},{"line_number":953,"context_line":""},{"line_number":954,"context_line":"    def _create_audit_template_for_strategy(self, goal_name, strategy_name):"},{"line_number":955,"context_line":"        \"\"\"Create and return an audit template for the given goal/strategy.\"\"\""},{"line_number":956,"context_line":""},{"line_number":957,"context_line":"        _, goal \u003d self.client.show_goal(goal_name)"}],"source_content_type":"text/x-python","patch_set":8,"id":"cd951635_6bd0b022","line":954,"range":{"start_line":954,"start_character":3,"end_line":954,"end_character":76},"in_reply_to":"f1da31b7_e8200aa1","updated":"2025-10-02 18:10:29.000000000","message":"oh, I totally missed that. It should not be private. At some moment was a execute_strategy method with all those private methods inside, which was correct, but I forgot to remove the underscore afterwards.\nI liked the idea of using class Goal and Strategy as default here. ++ thanks","commit_id":"9e3bda116d206a719e05e22ea53585d84171f73c"}],"watcher_tempest_plugin/tests/scenario/test_continuous_audit.py":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"42cd7e6d4e1d30c13b6fce85bb6d9a802e75bb68","unresolved":true,"context_lines":[{"line_number":73,"context_line":"            \"compute_nodes\": [{\"src_node\": src_host}],"},{"line_number":74,"context_line":"        }"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"        audit_template \u003d self._create_audit_template_for_strategy("},{"line_number":77,"context_line":"            \"hardware_maintenance\", \"zone_migration\")"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"        self.assertTrue(test_utils.call_until_true("},{"line_number":80,"context_line":"            func\u003dfunctools.partial("}],"source_content_type":"text/x-python","patch_set":8,"id":"3b24c9af_def676ec","line":77,"range":{"start_line":76,"start_character":7,"end_line":77,"end_character":53},"updated":"2025-10-02 13:32:33.000000000","message":"```suggestion\n        audit_template \u003d self.create_audit_template_for_strategy(\n            goal_name\u003d\"hardware_maintenance\", strategy_name\u003d\"zone_migration\")\n```","commit_id":"9e3bda116d206a719e05e22ea53585d84171f73c"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"d37238815b6fd4e1ee38b4a23c3fd5785664e8ee","unresolved":false,"context_lines":[{"line_number":73,"context_line":"            \"compute_nodes\": [{\"src_node\": src_host}],"},{"line_number":74,"context_line":"        }"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"        audit_template \u003d self._create_audit_template_for_strategy("},{"line_number":77,"context_line":"            \"hardware_maintenance\", \"zone_migration\")"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"        self.assertTrue(test_utils.call_until_true("},{"line_number":80,"context_line":"            func\u003dfunctools.partial("}],"source_content_type":"text/x-python","patch_set":8,"id":"8ecd9eb0_c4a04191","line":77,"range":{"start_line":76,"start_character":7,"end_line":77,"end_character":53},"in_reply_to":"3b24c9af_def676ec","updated":"2025-10-06 15:40:06.000000000","message":"Done","commit_id":"9e3bda116d206a719e05e22ea53585d84171f73c"}],"watcher_tempest_plugin/tests/scenario/test_execute_basic_optim.py":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"42cd7e6d4e1d30c13b6fce85bb6d9a802e75bb68","unresolved":true,"context_lines":[{"line_number":43,"context_line":"        if not CONF.compute_feature_enabled.live_migration:"},{"line_number":44,"context_line":"            raise cls.skipException(\"Live migration is not enabled\")"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"    @classmethod"},{"line_number":47,"context_line":"    def resource_setup(cls):"},{"line_number":48,"context_line":"        super(TestExecuteBasicStrategy, cls).resource_setup()"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"        enabled_compute_nodes \u003d cls.get_enabled_compute_nodes()"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"        cls.wait_for_compute_node_setup()"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"        if len(enabled_compute_nodes) \u003c 2:"},{"line_number":55,"context_line":"            raise cls.skipException("},{"line_number":56,"context_line":"                \"Less than 2 compute nodes are enabled, \""},{"line_number":57,"context_line":"                \"skipping multinode tests.\")"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"    @decorators.attr(type\u003d[\u0027strategy\u0027, \u0027basic\u0027])"},{"line_number":60,"context_line":"    @decorators.idempotent_id(\u002762766a61-dfc4-478c-b80b-86d871227e67\u0027)"}],"source_content_type":"text/x-python","patch_set":8,"id":"669f2c61_71da49f1","line":57,"range":{"start_line":46,"start_character":3,"end_line":57,"end_character":44},"updated":"2025-10-02 13:32:33.000000000","message":"again i realy dont think we need to do this but if we did this shoudl be in skip checks -1","commit_id":"9e3bda116d206a719e05e22ea53585d84171f73c"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"d37238815b6fd4e1ee38b4a23c3fd5785664e8ee","unresolved":true,"context_lines":[{"line_number":43,"context_line":"        if not CONF.compute_feature_enabled.live_migration:"},{"line_number":44,"context_line":"            raise cls.skipException(\"Live migration is not enabled\")"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"    @classmethod"},{"line_number":47,"context_line":"    def resource_setup(cls):"},{"line_number":48,"context_line":"        super(TestExecuteBasicStrategy, cls).resource_setup()"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"        enabled_compute_nodes \u003d cls.get_enabled_compute_nodes()"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"        cls.wait_for_compute_node_setup()"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"        if len(enabled_compute_nodes) \u003c 2:"},{"line_number":55,"context_line":"            raise cls.skipException("},{"line_number":56,"context_line":"                \"Less than 2 compute nodes are enabled, \""},{"line_number":57,"context_line":"                \"skipping multinode tests.\")"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"    @decorators.attr(type\u003d[\u0027strategy\u0027, \u0027basic\u0027])"},{"line_number":60,"context_line":"    @decorators.idempotent_id(\u002762766a61-dfc4-478c-b80b-86d871227e67\u0027)"}],"source_content_type":"text/x-python","patch_set":8,"id":"421a7346_a2450c72","line":57,"range":{"start_line":46,"start_character":3,"end_line":57,"end_character":44},"in_reply_to":"669f2c61_71da49f1","updated":"2025-10-06 15:40:06.000000000","message":"OK so because we need the clients set up if we keep this check  this is where we shoudl do it but raising the skip exception is still invalid IMO it should cause the test to fail.","commit_id":"9e3bda116d206a719e05e22ea53585d84171f73c"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"42cd7e6d4e1d30c13b6fce85bb6d9a802e75bb68","unresolved":true,"context_lines":[{"line_number":77,"context_line":"        for instance in instances:"},{"line_number":78,"context_line":"            self.make_instance_statistic(instance)"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"        audit_template \u003d self._create_audit_template_for_strategy("},{"line_number":81,"context_line":"            self.GOAL, self.STRATEGY)"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"        audit_kwargs \u003d {"},{"line_number":84,"context_line":"            \"parameters\": {"}],"source_content_type":"text/x-python","patch_set":8,"id":"0bfe5ebe_eba8f1b9","line":81,"range":{"start_line":80,"start_character":8,"end_line":81,"end_character":37},"updated":"2025-10-02 13:32:33.000000000","message":"```suggestion\n        audit_template \u003d self.create_audit_template_for_strategy()\n```","commit_id":"9e3bda116d206a719e05e22ea53585d84171f73c"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"d37238815b6fd4e1ee38b4a23c3fd5785664e8ee","unresolved":false,"context_lines":[{"line_number":77,"context_line":"        for instance in instances:"},{"line_number":78,"context_line":"            self.make_instance_statistic(instance)"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"        audit_template \u003d self._create_audit_template_for_strategy("},{"line_number":81,"context_line":"            self.GOAL, self.STRATEGY)"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"        audit_kwargs \u003d {"},{"line_number":84,"context_line":"            \"parameters\": {"}],"source_content_type":"text/x-python","patch_set":8,"id":"d3c50db3_0cd8b062","line":81,"range":{"start_line":80,"start_character":8,"end_line":81,"end_character":37},"in_reply_to":"0bfe5ebe_eba8f1b9","updated":"2025-10-06 15:40:06.000000000","message":"Done","commit_id":"9e3bda116d206a719e05e22ea53585d84171f73c"}],"watcher_tempest_plugin/tests/scenario/test_execute_dummy_optim.py":[{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"be6c6606ae62d3e0e014d31880a794d2ca8f5ae3","unresolved":true,"context_lines":[{"line_number":50,"context_line":"            act[\u0027action_type\u0027] for act in action_list)"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"        # A dummy strategy generates 2 \"nop\" actions and 1 \"sleep\" action"},{"line_number":53,"context_line":"        self.assertEqual(3, len(action_list))"},{"line_number":54,"context_line":"        self.assertEqual(2, action_counter.get(\"nop\"))"},{"line_number":55,"context_line":"        self.assertEqual(1, action_counter.get(\"sleep\"))"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"        if action_plan[\u0027state\u0027] in (\u0027SUPERSEDED\u0027, \u0027SUCCEEDED\u0027):"},{"line_number":58,"context_line":"            # This means the action plan is superseded so we cannot trigger it,"}],"source_content_type":"text/x-python","patch_set":8,"id":"97961c2b_7183942e","line":55,"range":{"start_line":53,"start_character":0,"end_line":55,"end_character":56},"updated":"2025-10-01 10:00:50.000000000","message":"question, at some point (no tin this refactor review) should we add the ability to check these conditions in _get_action_plan_and_validate_actions method? or you think these more specific checks should be done on each test?","commit_id":"9e3bda116d206a719e05e22ea53585d84171f73c"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"d817346ab3ece52b54acb114efa8356e07230bd8","unresolved":true,"context_lines":[{"line_number":50,"context_line":"            act[\u0027action_type\u0027] for act in action_list)"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"        # A dummy strategy generates 2 \"nop\" actions and 1 \"sleep\" action"},{"line_number":53,"context_line":"        self.assertEqual(3, len(action_list))"},{"line_number":54,"context_line":"        self.assertEqual(2, action_counter.get(\"nop\"))"},{"line_number":55,"context_line":"        self.assertEqual(1, action_counter.get(\"sleep\"))"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"        if action_plan[\u0027state\u0027] in (\u0027SUPERSEDED\u0027, \u0027SUCCEEDED\u0027):"},{"line_number":58,"context_line":"            # This means the action plan is superseded so we cannot trigger it,"}],"source_content_type":"text/x-python","patch_set":8,"id":"b25460c4_98e5dd6e","line":55,"range":{"start_line":53,"start_character":0,"end_line":55,"end_character":56},"in_reply_to":"97961c2b_7183942e","updated":"2025-10-01 11:34:28.000000000","message":"This specific test is just a copy from a previous implementation. Since in the parent change (in this chain) I moved the test to use \u0027self.execute_strategy\u0027 method[1]. I do believe that we will have more tests that will create their own validation, based on details of each action. The common validation can be the one that we have already, which check the action types only. One example is the change in progress here[2], where we want to validate which type of migration action is being proposed by the solution.\n\n[1] https://review.opendev.org/c/openstack/watcher-tempest-plugin/+/961762/5/watcher_tempest_plugin/tests/scenario/test_execute_dummy_optim.py\n[2] https://review.opendev.org/c/openstack/watcher-tempest-plugin/+/954214/4/watcher_tempest_plugin/tests/scenario/test_execute_host_maintenance.py","commit_id":"9e3bda116d206a719e05e22ea53585d84171f73c"}],"watcher_tempest_plugin/tests/scenario/test_execute_host_maintenance.py":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"42cd7e6d4e1d30c13b6fce85bb6d9a802e75bb68","unresolved":true,"context_lines":[{"line_number":45,"context_line":"            raise cls.skipException(\"Live migration is not enabled\")"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    @classmethod"},{"line_number":48,"context_line":"    def resource_setup(cls):"},{"line_number":49,"context_line":"        super().resource_setup()"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"        enabled_compute_nodes \u003d cls.get_enabled_compute_nodes()"}],"source_content_type":"text/x-python","patch_set":8,"id":"4043de3d_833625ef","line":48,"range":{"start_line":48,"start_character":8,"end_line":48,"end_character":22},"updated":"2025-10-02 13:32:33.000000000","message":"as noted else where this method is intened for creatign resouce on the cloud like ssh key pairs or image so or vms\n\nits not inteded to check a precondtion and raise a skip excption","commit_id":"9e3bda116d206a719e05e22ea53585d84171f73c"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"d37238815b6fd4e1ee38b4a23c3fd5785664e8ee","unresolved":false,"context_lines":[{"line_number":45,"context_line":"            raise cls.skipException(\"Live migration is not enabled\")"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    @classmethod"},{"line_number":48,"context_line":"    def resource_setup(cls):"},{"line_number":49,"context_line":"        super().resource_setup()"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"        enabled_compute_nodes \u003d cls.get_enabled_compute_nodes()"}],"source_content_type":"text/x-python","patch_set":8,"id":"703643a4_c6de7b67","line":48,"range":{"start_line":48,"start_character":8,"end_line":48,"end_character":22},"in_reply_to":"4043de3d_833625ef","updated":"2025-10-06 15:40:06.000000000","message":"same comment applies but lest fixt this for all cases either in the previous change or in a seperate commit","commit_id":"9e3bda116d206a719e05e22ea53585d84171f73c"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"e4012b7e97acd151cf761ecee8a0096ac1f80404","unresolved":true,"context_lines":[{"line_number":45,"context_line":"            raise cls.skipException(\"Live migration is not enabled\")"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    @classmethod"},{"line_number":48,"context_line":"    def resource_setup(cls):"},{"line_number":49,"context_line":"        super().resource_setup()"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"        enabled_compute_nodes \u003d cls.get_enabled_compute_nodes()"}],"source_content_type":"text/x-python","patch_set":11,"id":"38d6a305_15eedcd2","line":48,"updated":"2025-10-06 15:45:40.000000000","message":"this is adressed by https://review.opendev.org/c/openstack/watcher-tempest-plugin/+/963007","commit_id":"47ddf23d77ca9143245fdad1074224cffe17650d"}],"watcher_tempest_plugin/tests/scenario/test_execute_node_resource_consolidation.py":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"42cd7e6d4e1d30c13b6fce85bb6d9a802e75bb68","unresolved":true,"context_lines":[{"line_number":30,"context_line":"    compute_min_microversion \u003d base.NOVA_API_VERSION_CREATE_WITH_HOST"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    GOAL \u003d \"server_consolidation\""},{"line_number":33,"context_line":"    STRATEGY \u003d \"node_resource_consolidation\""},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    @classmethod"},{"line_number":36,"context_line":"    def skip_checks(cls):"}],"source_content_type":"text/x-python","patch_set":8,"id":"c9b08d98_e0182c3e","line":33,"updated":"2025-10-02 13:32:33.000000000","message":"+1 nice reuse\n\nwhile compostion via a mixing class is more flexible im not against inheritnace in this case","commit_id":"9e3bda116d206a719e05e22ea53585d84171f73c"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"d37238815b6fd4e1ee38b4a23c3fd5785664e8ee","unresolved":false,"context_lines":[{"line_number":30,"context_line":"    compute_min_microversion \u003d base.NOVA_API_VERSION_CREATE_WITH_HOST"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    GOAL \u003d \"server_consolidation\""},{"line_number":33,"context_line":"    STRATEGY \u003d \"node_resource_consolidation\""},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    @classmethod"},{"line_number":36,"context_line":"    def skip_checks(cls):"}],"source_content_type":"text/x-python","patch_set":8,"id":"80f4be0e_fe882827","line":33,"in_reply_to":"be265e39_2febbd93","updated":"2025-10-06 15:40:06.000000000","message":"Acknowledged","commit_id":"9e3bda116d206a719e05e22ea53585d84171f73c"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"d769f53936e1ae51fafd4b0bb060d28f88be2e26","unresolved":true,"context_lines":[{"line_number":30,"context_line":"    compute_min_microversion \u003d base.NOVA_API_VERSION_CREATE_WITH_HOST"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    GOAL \u003d \"server_consolidation\""},{"line_number":33,"context_line":"    STRATEGY \u003d \"node_resource_consolidation\""},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    @classmethod"},{"line_number":36,"context_line":"    def skip_checks(cls):"}],"source_content_type":"text/x-python","patch_set":8,"id":"be265e39_2febbd93","line":33,"in_reply_to":"c9b08d98_e0182c3e","updated":"2025-10-02 18:10:29.000000000","message":"right, it was like some classes were already doing that, so I just making it a pattern.","commit_id":"9e3bda116d206a719e05e22ea53585d84171f73c"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"be6c6606ae62d3e0e014d31880a794d2ca8f5ae3","unresolved":true,"context_lines":[{"line_number":110,"context_line":"        audit \u003d self._create_audit_and_wait("},{"line_number":111,"context_line":"            audit_template[\u0027uuid\u0027], **audit_kwargs)"},{"line_number":112,"context_line":""},{"line_number":113,"context_line":"        action_plan, _ \u003d self._get_action_plan_and_validate_actions("},{"line_number":114,"context_line":"            audit[\u0027uuid\u0027])"},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"        if action_plan[\u0027state\u0027] in (\u0027SUPERSEDED\u0027, \u0027SUCCEEDED\u0027):"},{"line_number":117,"context_line":"            # This means the action plan is superseded so we cannot trigger it,"},{"line_number":118,"context_line":"            # or it is empty."},{"line_number":119,"context_line":"            return"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"        self._execute_action_plan_and_validate_states(action_plan[\u0027uuid\u0027])"}],"source_content_type":"text/x-python","patch_set":8,"id":"2e91b8f1_05a9331f","line":119,"range":{"start_line":113,"start_character":0,"end_line":119,"end_character":18},"updated":"2025-10-01 10:00:50.000000000","message":"should we check that there is still one migrate action and get rid of the ` if action_plan[\u0027state\u0027] in (\u0027SUPERSEDED\u0027, \u0027SUCCEEDED\u0027)` condition (i\u0027d say that would be a bug) or that should be follow-up fix?\n\nsimilar situation for more tests.","commit_id":"9e3bda116d206a719e05e22ea53585d84171f73c"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"d817346ab3ece52b54acb114efa8356e07230bd8","unresolved":true,"context_lines":[{"line_number":110,"context_line":"        audit \u003d self._create_audit_and_wait("},{"line_number":111,"context_line":"            audit_template[\u0027uuid\u0027], **audit_kwargs)"},{"line_number":112,"context_line":""},{"line_number":113,"context_line":"        action_plan, _ \u003d self._get_action_plan_and_validate_actions("},{"line_number":114,"context_line":"            audit[\u0027uuid\u0027])"},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"        if action_plan[\u0027state\u0027] in (\u0027SUPERSEDED\u0027, \u0027SUCCEEDED\u0027):"},{"line_number":117,"context_line":"            # This means the action plan is superseded so we cannot trigger it,"},{"line_number":118,"context_line":"            # or it is empty."},{"line_number":119,"context_line":"            return"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"        self._execute_action_plan_and_validate_states(action_plan[\u0027uuid\u0027])"}],"source_content_type":"text/x-python","patch_set":8,"id":"4c906964_2d208dd9","line":119,"range":{"start_line":113,"start_character":0,"end_line":119,"end_character":18},"in_reply_to":"2e91b8f1_05a9331f","updated":"2025-10-01 11:34:28.000000000","message":"We should yes, but I am planning to fix in other follow ups, if we agree on these refactoring first. It is already known that at least one test is never generating a action plan and the test is always passing, so I\u0027m starting to fix here [1]. And I agree that we can start adding more validations, yes. Maybe I can udpate [1] to include these missing action validations. wdyt?\n\n[1] https://review.opendev.org/c/openstack/watcher-tempest-plugin/+/960381","commit_id":"9e3bda116d206a719e05e22ea53585d84171f73c"},{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"317bced9fb14d51507cb1a169b6394695112db0b","unresolved":true,"context_lines":[{"line_number":110,"context_line":"        audit \u003d self._create_audit_and_wait("},{"line_number":111,"context_line":"            audit_template[\u0027uuid\u0027], **audit_kwargs)"},{"line_number":112,"context_line":""},{"line_number":113,"context_line":"        action_plan, _ \u003d self._get_action_plan_and_validate_actions("},{"line_number":114,"context_line":"            audit[\u0027uuid\u0027])"},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"        if action_plan[\u0027state\u0027] in (\u0027SUPERSEDED\u0027, \u0027SUCCEEDED\u0027):"},{"line_number":117,"context_line":"            # This means the action plan is superseded so we cannot trigger it,"},{"line_number":118,"context_line":"            # or it is empty."},{"line_number":119,"context_line":"            return"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"        self._execute_action_plan_and_validate_states(action_plan[\u0027uuid\u0027])"}],"source_content_type":"text/x-python","patch_set":8,"id":"9900423b_21831c3c","line":119,"range":{"start_line":113,"start_character":0,"end_line":119,"end_character":18},"in_reply_to":"4c906964_2d208dd9","updated":"2025-10-07 07:18:02.000000000","message":"+1","commit_id":"9e3bda116d206a719e05e22ea53585d84171f73c"}],"watcher_tempest_plugin/tests/scenario/test_execute_storage_balance.py":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"42cd7e6d4e1d30c13b6fce85bb6d9a802e75bb68","unresolved":true,"context_lines":[{"line_number":55,"context_line":"            }"},{"line_number":56,"context_line":"        }"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"        audit_template \u003d self._create_audit_template_for_strategy("},{"line_number":59,"context_line":"            self.GOAL, self.STRATEGY)"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"        audit \u003d self._create_audit_and_wait("},{"line_number":62,"context_line":"            audit_template[\u0027uuid\u0027], **audit_kwargs)"}],"source_content_type":"text/x-python","patch_set":8,"id":"002ac9ae_93ca8539","line":59,"range":{"start_line":58,"start_character":1,"end_line":59,"end_character":37},"updated":"2025-10-02 13:32:33.000000000","message":"```suggestion\n        audit_template \u003d self._create_audit_template_for_strategy()\n```","commit_id":"9e3bda116d206a719e05e22ea53585d84171f73c"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"d37238815b6fd4e1ee38b4a23c3fd5785664e8ee","unresolved":false,"context_lines":[{"line_number":55,"context_line":"            }"},{"line_number":56,"context_line":"        }"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"        audit_template \u003d self._create_audit_template_for_strategy("},{"line_number":59,"context_line":"            self.GOAL, self.STRATEGY)"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"        audit \u003d self._create_audit_and_wait("},{"line_number":62,"context_line":"            audit_template[\u0027uuid\u0027], **audit_kwargs)"}],"source_content_type":"text/x-python","patch_set":8,"id":"fef545ea_9a72888c","line":59,"range":{"start_line":58,"start_character":1,"end_line":59,"end_character":37},"in_reply_to":"002ac9ae_93ca8539","updated":"2025-10-06 15:40:06.000000000","message":"Done","commit_id":"9e3bda116d206a719e05e22ea53585d84171f73c"}],"watcher_tempest_plugin/tests/scenario/test_execute_strategies_real.py":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"d37238815b6fd4e1ee38b4a23c3fd5785664e8ee","unresolved":false,"context_lines":[{"line_number":100,"context_line":"        audit_kwargs \u003d {\"parameters\": audit_parameters}"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"        audit_template \u003d self.create_audit_template_for_strategy("},{"line_number":103,"context_line":"            goal_name\u003d\"workload_balancing\", strategy_name\u003d\"workload_balance\")"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"        audit \u003d self.create_audit_and_wait("},{"line_number":106,"context_line":"            audit_template[\u0027uuid\u0027], **audit_kwargs)"}],"source_content_type":"text/x-python","patch_set":11,"id":"3987fe82_e35d7cb0","line":103,"range":{"start_line":103,"start_character":10,"end_line":103,"end_character":42},"updated":"2025-10-06 15:40:06.000000000","message":"nit: this is fine as is. you could factor out the common goal and just overried the strategy_name at each call site but im fine with being explicit and passing both.","commit_id":"47ddf23d77ca9143245fdad1074224cffe17650d"}]}
