)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"ffe5f63b028335385024bcd634f380ac8a94a00e","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"3a76b6a6_fda8d4cc","updated":"2025-07-23 10:42:42.000000000","message":"I\u0027d propose to use a different strategy to validate continuous audits.","commit_id":"a07ea0d7c14ed86bd9a46d949d14cb64f8f11d44"},{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"1e150ace40c013dac83fb87cddb08a279e51554e","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":12,"id":"db3ab429_91f5482b","updated":"2025-10-03 11:04:35.000000000","message":"Still working on this.","commit_id":"f164dd6ae61f5b5187eb8bc626833ccf011b9448"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"782f45ec5d13e2303280323ed29e2d1f1766f5cf","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":18,"id":"7344cbfb_5ac467a2","updated":"2025-10-16 11:44:06.000000000","message":"just a minor suggestion. Other than that LGTM","commit_id":"b71361fd641d111edbfe54c4e0db653f232b1972"},{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"bd161d277cbbfd4cb13c99014b4ada33df84342f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":18,"id":"c261370f_1a8e950a","updated":"2025-10-08 05:00:26.000000000","message":"recheck","commit_id":"b71361fd641d111edbfe54c4e0db653f232b1972"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"8a5d23246ece0266206ba681b6e496ba1d95d933","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":19,"id":"e78a3ba0_f9310e78","updated":"2025-11-04 21:26:17.000000000","message":"recheck i want to see fi this was just a slow run or fi the josb are really this low in general","commit_id":"4c57593a80ff077054fad7d13fa410dd180fe62a"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"4f4e7b93f43f51783bcd69721fbc379815313be0","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":19,"id":"efd29776_8fe116b3","updated":"2025-10-24 15:29:33.000000000","message":"thse tests are all very very slow\n\nthe new ones added in this patch are borderline\n\n```\n2025-10-17 07:29:32.845478 | controller |   for key, value in info.getheaders().items():\n\n2025-10-17 07:30:19.474961 | controller | {0} watcher_tempest_plugin.tests.scenario.test_continuous_audit.TestContinuousAudit.test_continuous_audit_zone_migration [65.570544s] ... ok\n\n2025-10-17 07:31:18.065585 | controller | {0} watcher_tempest_plugin.tests.scenario.test_continuous_audit.TestContinuousAuditDummy.test_continuous_audit_execution_and_superseding [24.884985s] ... ok\n\n2025-10-17 07:32:28.341447 | controller | {0} watcher_tempest_plugin.tests.scenario.test_continuous_audit.TestContinuousAuditDummy.test_continuous_audit_scheduled_execution_and_runtime_patches [70.274490s] ... ok\n\n2025-10-17 07:33:42.205388 | controller | {0} watcher_tempest_plugin.tests.scenario.test_continuous_audit.TestContinuousAuditDummy.test_continuous_audit_state_lifecycle [73.862987s] ... ok\n```\n\nover all we are only runing 20 tests but its taking  3194.4666 sec.\n\nthat is not ok\n\nthe most prolematic tests are \n\nwatcher_tempest_plugin.tests.scenario.test_data_model.TestDataModel.test_data_model_with_instances [269.888118s] ... ok\n\nwatcher_tempest_plugin.tests.scenario.test_execute_basic_optim.TestExecuteBasicStrategy.test_execute_basic_strategy [211.502178s] ... ok\n\nwatcher_tempest_plugin.tests.scenario.test_execute_host_maintenance.TestExecuteHostMaintenanceStrategy.test_execute_host_maintenance_strategy_backup_node [237.525431s]\n\nwatcher_tempest_plugin.tests.scenario.test_execute_zone_migration.TestExecuteZoneMigrationStrategy.test_execute_zone_migration_without_destination_host [234.584126s] \n\nbefore extending the testuite by another 4 mintues i think we need to take a step back and properly look at how we are turning our test to run given the run serially.\n\nany test that take more then 90 second shoudl be a redflag an most shoudl be less then 30.","commit_id":"4c57593a80ff077054fad7d13fa410dd180fe62a"},{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"00b70a2a1a095dc21bc8785d6a4c552993db591d","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":19,"id":"eff2ef6c_0d7a7f6b","in_reply_to":"e78a3ba0_f9310e78","updated":"2025-11-05 10:27:56.000000000","message":"Below are the time taken by most of the scenario tests\n```\n{0} watcher_tempest_plugin.tests.scenario.test_execute_zone_migration.TestExecuteZoneMigrationStrategyVolume.test_execute_zone_migration_volume_retype [219.559426s] ... ok\n\n{0} watcher_tempest_plugin.tests.scenario.test_execute_zone_migration.TestExecuteZoneMigrationStrategy.test_execute_zone_migration_without_destination_host [238.980121s] ... ok\n\n{0} watcher_tempest_plugin.tests.scenario.test_execute_zone_migration.TestExecuteZoneMigrationStrategy.test_execute_zone_migration_with_destination_host [223.047140s] ... ok\n\n{0} watcher_tempest_plugin.tests.scenario.test_execute_workload_stabilization.TestExecuteWorkloadStabilizationStrategy.test_execute_workload_stabilization_strategy_ram [235.754053s] ... ok\n\n{0} watcher_tempest_plugin.tests.scenario.test_execute_workload_stabilization.TestExecuteWorkloadStabilizationStrategy.test_execute_workload_stabilization_strategy_cpu [215.818195s] ... ok\n\n{0} watcher_tempest_plugin.tests.scenario.test_execute_workload_balance.TestExecuteWorkloadBalanceStrategy.test_execute_workload_balance_strategy_ram [127.538589s] ... ok\n\n{0} watcher_tempest_plugin.tests.scenario.test_execute_workload_balance.TestExecuteWorkloadBalanceStrategy.test_execute_workload_balance_strategy_cpu [207.374202s] ... ok\n\n{0} watcher_tempest_plugin.tests.scenario.test_execute_vm_workload_consolidation.TestExecuteVmWorkloadBalanceStrategy.test_execute_vm_workload_consolidation_strategy [223.402974s] ... ok\n\n{0} watcher_tempest_plugin.tests.scenario.test_execute_node_resource_consolidation.TestExecuteNodeResourceConsolidationStrategy.test_execute_node_resource_consolidation_strategy_with_specify [235.870665s] ... ok\n\n2025-11-04 22:33:52.180093 | controller | {0} watcher_tempest_plugin.tests.scenario.test_execute_node_resource_consolidation.TestExecuteNodeResourceConsolidationStrategy.test_execute_node_resource_consolidation_strategy_with_auto [225.411997s] ... ok\n\n2025-11-04 22:33:52.180093 | controller | {0} watcher_tempest_plugin.tests.scenario.test_execute_node_resource_consolidation.TestExecuteNodeResourceConsolidationStrategy.test_execute_node_resource_consolidation_strategy_with_auto [225.411997s] ... ok\n\n{0} watcher_tempest_plugin.tests.scenario.test_execute_host_maintenance.TestExecuteHostMaintenanceStrategy.test_execute_host_maintenance_strategy_backup_node [239.066774s] ... ok\n\n2025-11-04 22:25:43.322287 | controller | {0} watcher_tempest_plugin.tests.scenario.test_execute_host_maintenance.TestExecuteHostMaintenanceStrategy.test_execute_host_maintenance_strategy [175.034769s] ... ok\n\n2025-11-04 22:21:51.170311 | controller | {0} watcher_tempest_plugin.tests.scenario.test_execute_basic_optim.TestExecuteBasicStrategy.test_execute_basic_strategy [215.068341s] ... ok\n\n2025-11-04 22:17:52.895348 | controller | {0} watcher_tempest_plugin.tests.scenario.test_data_model.TestDataModel.test_data_model_with_instances [161.738809s] ... ok\n```\n\nAll the test are taking more than 200 sec. What is the acceptable time limit for a scenario tests? so that we can finetune the tests.\n\nAnd new tests.\n```\n2025-11-04 22:12:26.923223 | controller | {0} watcher_tempest_plugin.tests.scenario.test_continuous_audit.TestContinuousAuditDummy.test_continuous_audit_execution_and_superseding [22.789927s] ... ok\n2025-11-04 22:13:45.736715 | controller | {0} watcher_tempest_plugin.tests.scenario.test_continuous_audit.TestContinuousAuditDummy.test_continuous_audit_scheduled_execution_and_runtime_patches [78.810996s] ... ok\n2025-11-04 22:14:48.445220 | controller | {0} watcher_tempest_plugin.tests.scenario.test_continuous_audit.TestContinuousAuditDummy.test_continuous_audit_state_lifecycle [62.706968s] ... ok\n```\n\nFor new tests, I will address the comment.","commit_id":"4c57593a80ff077054fad7d13fa410dd180fe62a"},{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"4ec402da83fb35cefa90fe012c7c3ca46b1f2ad7","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":19,"id":"c2d29968_1e6dfd6d","in_reply_to":"eff2ef6c_0d7a7f6b","updated":"2025-11-25 11:38:28.000000000","message":"It is no longer needed.","commit_id":"4c57593a80ff077054fad7d13fa410dd180fe62a"},{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"77dbd4595fd941365d92fa2a68918c8fd1cd0887","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":20,"id":"9c0469bd_081b3996","updated":"2025-11-18 06:33:44.000000000","message":"Thank you @smooney@redhat.com for detailed review and feedback. I try to resolve most of the comments in this patch. In case I missed anything do let me know.","commit_id":"e26cdf6fe0322a6f2b01df62b1dc80a2c777d91d"},{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"2769c349fb689938feaa3a4a2ca44bb314bf4068","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":21,"id":"82c9f386_71b1d777","updated":"2025-11-18 13:08:54.000000000","message":"rebasing on top of refactoring https://review.opendev.org/c/openstack/watcher-tempest-plugin/+/967522","commit_id":"a8507433ea9a9bc095ddd8810c779d814f08228d"},{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"516060e33ad45e09f9271a69a8faec1ec9c5c22f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":23,"id":"02519e37_8d9cf796","updated":"2025-11-25 14:03:41.000000000","message":"recheck","commit_id":"b34f12218dc08d0b07580661894c721f1c795b8d"}],"watcher_tempest_plugin/tests/scenario/test_continuous_audit.py":[{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"a56dc4b0f7a147c084eee488d1ce398d4f33bef4","unresolved":true,"context_lines":[{"line_number":215,"context_line":"        return len(aps.get(\"action_plans\", [])) \u003e\u003d min_count"},{"line_number":216,"context_line":""},{"line_number":217,"context_line":"    @decorators.idempotent_id(\u0027b2c3d4e5-6f78-9012-bcde-f23456789012\u0027)"},{"line_number":218,"context_line":"    @decorators.attr(type\u003d[\u0027strategy\u0027, \u0027continuous_audit\u0027, \u0027dummy\u0027])"},{"line_number":219,"context_line":"    def test_continuous_audit_state_transitions(self):"},{"line_number":220,"context_line":"        \"\"\"Test continuous audit state transitions."},{"line_number":221,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"699095db_ad97aa26","line":218,"range":{"start_line":218,"start_character":0,"end_line":218,"end_character":2},"updated":"2025-10-01 09:40:12.000000000","message":"I\u0027m not sure about what attributes are we using:\n\n- strategy is for all tests using any strategy or for the tests intended to test specific strategies? if so, the tests running with dummy as these ones should not be tagged as \u0027strategy\u0027 as are intended to test the watcher workflow not the behavior of a strategy.\n\n- continuous_audit: is this intended to mark all the continous audit tests? if so, we should also add the previous test_continuous_audit_zone_migration. I\u0027m not sure if it\u0027s worthy to have that level of granularity to select/discard based on attributes. Open to discuss about that, but we should have a criteria and be consistent.","commit_id":"72ccee19132ed2dd683364ea5a6dbe731652dd40"},{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"3c4b03563d4a55f08a20d3e90a54e3063961204b","unresolved":true,"context_lines":[{"line_number":215,"context_line":"        return len(aps.get(\"action_plans\", [])) \u003e\u003d min_count"},{"line_number":216,"context_line":""},{"line_number":217,"context_line":"    @decorators.idempotent_id(\u0027b2c3d4e5-6f78-9012-bcde-f23456789012\u0027)"},{"line_number":218,"context_line":"    @decorators.attr(type\u003d[\u0027strategy\u0027, \u0027continuous_audit\u0027, \u0027dummy\u0027])"},{"line_number":219,"context_line":"    def test_continuous_audit_state_transitions(self):"},{"line_number":220,"context_line":"        \"\"\"Test continuous audit state transitions."},{"line_number":221,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"a1b178f0_f26bf1bb","line":218,"range":{"start_line":218,"start_character":0,"end_line":218,"end_character":2},"in_reply_to":"699095db_ad97aa26","updated":"2025-10-06 12:16:58.000000000","message":"I have added strategy and continuous_audit to all the tests here. Note: these tests will only run when run_continuous_audit_tests is set to true.","commit_id":"72ccee19132ed2dd683364ea5a6dbe731652dd40"},{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"77dbd4595fd941365d92fa2a68918c8fd1cd0887","unresolved":true,"context_lines":[{"line_number":215,"context_line":"        return len(aps.get(\"action_plans\", [])) \u003e\u003d min_count"},{"line_number":216,"context_line":""},{"line_number":217,"context_line":"    @decorators.idempotent_id(\u0027b2c3d4e5-6f78-9012-bcde-f23456789012\u0027)"},{"line_number":218,"context_line":"    @decorators.attr(type\u003d[\u0027strategy\u0027, \u0027continuous_audit\u0027, \u0027dummy\u0027])"},{"line_number":219,"context_line":"    def test_continuous_audit_state_transitions(self):"},{"line_number":220,"context_line":"        \"\"\"Test continuous audit state transitions."},{"line_number":221,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"de5537fb_2ae37acb","line":218,"range":{"start_line":218,"start_character":0,"end_line":218,"end_character":2},"in_reply_to":"8e925b2f_ed95a397","updated":"2025-11-18 06:33:44.000000000","message":"Thank you @smooney@redhat.com for the recommendation here. I am sticking with `@decorators.attr(type\u003d[\u0027scenario\u0027,\u0027strategy\u0027, \u0027dummy\u0027])` format. Incase strategy got removed, we will use scenario tag for running tests.","commit_id":"72ccee19132ed2dd683364ea5a6dbe731652dd40"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"b9ff482992cf946da3d5364176b8c96b35f671df","unresolved":true,"context_lines":[{"line_number":215,"context_line":"        return len(aps.get(\"action_plans\", [])) \u003e\u003d min_count"},{"line_number":216,"context_line":""},{"line_number":217,"context_line":"    @decorators.idempotent_id(\u0027b2c3d4e5-6f78-9012-bcde-f23456789012\u0027)"},{"line_number":218,"context_line":"    @decorators.attr(type\u003d[\u0027strategy\u0027, \u0027continuous_audit\u0027, \u0027dummy\u0027])"},{"line_number":219,"context_line":"    def test_continuous_audit_state_transitions(self):"},{"line_number":220,"context_line":"        \"\"\"Test continuous audit state transitions."},{"line_number":221,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"8e925b2f_ed95a397","line":218,"range":{"start_line":218,"start_character":0,"end_line":218,"end_character":2},"in_reply_to":"a1b178f0_f26bf1bb","updated":"2025-11-11 12:13:39.000000000","message":"we should not use stragy as a tag type here\n\nthere shoudl only bee a smalll subset of tyeps \n\n```\n@decorators.attr(type\u003d[\u0027strategy\u0027,\u0027scenario\u0027])\n```\nor\n```\n@decorators.attr(type\u003d[\u0027scenario\u0027,\u0027strategy\u0027, \u0027dummy\u0027])\n```\nare probably more correct but strategy shoudl not be used IMO\n\ni dont really like our existing usage of it \u0027strategy\u0027 but it was added as a temporary messuer to allow us to move the strategies tests around.\n\nwe could add  \u0027continuous_audit\u0027 but in generally i don\u0027t see a use case for that longtime.\n\nrun_continuous_audit_tests is technical debt, the only reason these are skipped by default are for stable branches.\n\nthis will eventually get removed when all supported stable branches \nhave https://bugs.launchpad.net/watcher/+bug/2098984 and related bugs fixed.\nyou shoudl not need to opt into thses test in general but we are required to ensure that as we extend the test suite it works on all stable branches.\n\nthe primary way to filter tests that run is via the regex, the attribute are the secondary way and finally config options.","commit_id":"72ccee19132ed2dd683364ea5a6dbe731652dd40"},{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"4ec402da83fb35cefa90fe012c7c3ca46b1f2ad7","unresolved":false,"context_lines":[{"line_number":215,"context_line":"        return len(aps.get(\"action_plans\", [])) \u003e\u003d min_count"},{"line_number":216,"context_line":""},{"line_number":217,"context_line":"    @decorators.idempotent_id(\u0027b2c3d4e5-6f78-9012-bcde-f23456789012\u0027)"},{"line_number":218,"context_line":"    @decorators.attr(type\u003d[\u0027strategy\u0027, \u0027continuous_audit\u0027, \u0027dummy\u0027])"},{"line_number":219,"context_line":"    def test_continuous_audit_state_transitions(self):"},{"line_number":220,"context_line":"        \"\"\"Test continuous audit state transitions."},{"line_number":221,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"2e09635a_4df97522","line":218,"range":{"start_line":218,"start_character":0,"end_line":218,"end_character":2},"in_reply_to":"de5537fb_2ae37acb","updated":"2025-11-25 11:38:28.000000000","message":"Done","commit_id":"72ccee19132ed2dd683364ea5a6dbe731652dd40"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"a56dc4b0f7a147c084eee488d1ce398d4f33bef4","unresolved":true,"context_lines":[{"line_number":214,"context_line":"        _, aps \u003d self.client.list_action_plans(audit_uuid\u003daudit_uuid)"},{"line_number":215,"context_line":"        return len(aps.get(\"action_plans\", [])) \u003e\u003d min_count"},{"line_number":216,"context_line":""},{"line_number":217,"context_line":"    @decorators.idempotent_id(\u0027b2c3d4e5-6f78-9012-bcde-f23456789012\u0027)"},{"line_number":218,"context_line":"    @decorators.attr(type\u003d[\u0027strategy\u0027, \u0027continuous_audit\u0027, \u0027dummy\u0027])"},{"line_number":219,"context_line":"    def test_continuous_audit_state_transitions(self):"},{"line_number":220,"context_line":"        \"\"\"Test continuous audit state transitions."},{"line_number":221,"context_line":""},{"line_number":222,"context_line":"        Validates the complete state machine for continuous audits:"},{"line_number":223,"context_line":"        PENDING → ONGOING → SUSPENDED → ONGOING"},{"line_number":224,"context_line":"        \"\"\""},{"line_number":225,"context_line":"        goal_name \u003d \"dummy\""},{"line_number":226,"context_line":"        strategy_name \u003d \"dummy\""},{"line_number":227,"context_line":"        audit_kwargs \u003d {"},{"line_number":228,"context_line":"            \"interval\": \"*/1 * * * *\""},{"line_number":229,"context_line":"        }"},{"line_number":230,"context_line":""},{"line_number":231,"context_line":"        audit \u003d self.execute_continuous_strategy(goal_name, strategy_name,"},{"line_number":232,"context_line":"                                                 **audit_kwargs)"},{"line_number":233,"context_line":"        audit_uuid \u003d audit[\u0027uuid\u0027]"},{"line_number":234,"context_line":"        # Test PENDING → ONGOING transition"},{"line_number":235,"context_line":"        self.assertTrue(test_utils.call_until_true("},{"line_number":236,"context_line":"            func\u003dfunctools.partial(self.is_audit_ongoing, audit_uuid),"},{"line_number":237,"context_line":"            duration\u003d300, sleep_for\u003d10))"},{"line_number":238,"context_line":""},{"line_number":239,"context_line":"        # Test ONGOING → SUSPENDED transition"},{"line_number":240,"context_line":"        self.client.update_audit(audit_uuid, ["},{"line_number":241,"context_line":"            {\"op\": \"replace\", \"path\": \"/state\", \"value\": \"SUSPENDED\"}])"},{"line_number":242,"context_line":"        _, suspended_audit \u003d self.client.show_audit(audit_uuid)"},{"line_number":243,"context_line":"        self.assertEqual(\u0027SUSPENDED\u0027, suspended_audit.get(\u0027state\u0027))"},{"line_number":244,"context_line":""},{"line_number":245,"context_line":"        # Test SUSPENDED → ONGOING transition (resume)"},{"line_number":246,"context_line":"        self.client.update_audit(audit_uuid, ["},{"line_number":247,"context_line":"            {\"op\": \"replace\", \"path\": \"/state\", \"value\": \"ONGOING\"}])"},{"line_number":248,"context_line":"        _, resumed_audit \u003d self.client.show_audit(audit_uuid)"},{"line_number":249,"context_line":"        self.assertEqual(\u0027ONGOING\u0027, resumed_audit.get(\u0027state\u0027))"},{"line_number":250,"context_line":""},{"line_number":251,"context_line":"    @decorators.idempotent_id(\u0027c3d4e5f6-7890-1234-cdef-345678901234\u0027)"},{"line_number":252,"context_line":"    @decorators.attr(type\u003d[\u0027strategy\u0027, \u0027continuous_audit\u0027,"},{"line_number":253,"context_line":"                           \u0027actionplan_superseding\u0027,"}],"source_content_type":"text/x-python","patch_set":11,"id":"7c06d7d0_4b15ea5b","line":250,"range":{"start_line":217,"start_character":0,"end_line":250,"end_character":1},"updated":"2025-10-01 09:40:12.000000000","message":"This is only testing the api part of the workflow. I think it\u0027d be good, as an scenario test, to validate it works as expected, i.e. no new actionplans are created while the audit is suspended, and new actions plans are created once it\u0027s resumed to ONGOING.","commit_id":"72ccee19132ed2dd683364ea5a6dbe731652dd40"},{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"3c4b03563d4a55f08a20d3e90a54e3063961204b","unresolved":false,"context_lines":[{"line_number":214,"context_line":"        _, aps \u003d self.client.list_action_plans(audit_uuid\u003daudit_uuid)"},{"line_number":215,"context_line":"        return len(aps.get(\"action_plans\", [])) \u003e\u003d min_count"},{"line_number":216,"context_line":""},{"line_number":217,"context_line":"    @decorators.idempotent_id(\u0027b2c3d4e5-6f78-9012-bcde-f23456789012\u0027)"},{"line_number":218,"context_line":"    @decorators.attr(type\u003d[\u0027strategy\u0027, \u0027continuous_audit\u0027, \u0027dummy\u0027])"},{"line_number":219,"context_line":"    def test_continuous_audit_state_transitions(self):"},{"line_number":220,"context_line":"        \"\"\"Test continuous audit state transitions."},{"line_number":221,"context_line":""},{"line_number":222,"context_line":"        Validates the complete state machine for continuous audits:"},{"line_number":223,"context_line":"        PENDING → ONGOING → SUSPENDED → ONGOING"},{"line_number":224,"context_line":"        \"\"\""},{"line_number":225,"context_line":"        goal_name \u003d \"dummy\""},{"line_number":226,"context_line":"        strategy_name \u003d \"dummy\""},{"line_number":227,"context_line":"        audit_kwargs \u003d {"},{"line_number":228,"context_line":"            \"interval\": \"*/1 * * * *\""},{"line_number":229,"context_line":"        }"},{"line_number":230,"context_line":""},{"line_number":231,"context_line":"        audit \u003d self.execute_continuous_strategy(goal_name, strategy_name,"},{"line_number":232,"context_line":"                                                 **audit_kwargs)"},{"line_number":233,"context_line":"        audit_uuid \u003d audit[\u0027uuid\u0027]"},{"line_number":234,"context_line":"        # Test PENDING → ONGOING transition"},{"line_number":235,"context_line":"        self.assertTrue(test_utils.call_until_true("},{"line_number":236,"context_line":"            func\u003dfunctools.partial(self.is_audit_ongoing, audit_uuid),"},{"line_number":237,"context_line":"            duration\u003d300, sleep_for\u003d10))"},{"line_number":238,"context_line":""},{"line_number":239,"context_line":"        # Test ONGOING → SUSPENDED transition"},{"line_number":240,"context_line":"        self.client.update_audit(audit_uuid, ["},{"line_number":241,"context_line":"            {\"op\": \"replace\", \"path\": \"/state\", \"value\": \"SUSPENDED\"}])"},{"line_number":242,"context_line":"        _, suspended_audit \u003d self.client.show_audit(audit_uuid)"},{"line_number":243,"context_line":"        self.assertEqual(\u0027SUSPENDED\u0027, suspended_audit.get(\u0027state\u0027))"},{"line_number":244,"context_line":""},{"line_number":245,"context_line":"        # Test SUSPENDED → ONGOING transition (resume)"},{"line_number":246,"context_line":"        self.client.update_audit(audit_uuid, ["},{"line_number":247,"context_line":"            {\"op\": \"replace\", \"path\": \"/state\", \"value\": \"ONGOING\"}])"},{"line_number":248,"context_line":"        _, resumed_audit \u003d self.client.show_audit(audit_uuid)"},{"line_number":249,"context_line":"        self.assertEqual(\u0027ONGOING\u0027, resumed_audit.get(\u0027state\u0027))"},{"line_number":250,"context_line":""},{"line_number":251,"context_line":"    @decorators.idempotent_id(\u0027c3d4e5f6-7890-1234-cdef-345678901234\u0027)"},{"line_number":252,"context_line":"    @decorators.attr(type\u003d[\u0027strategy\u0027, \u0027continuous_audit\u0027,"},{"line_number":253,"context_line":"                           \u0027actionplan_superseding\u0027,"}],"source_content_type":"text/x-python","patch_set":11,"id":"ac713c15_2987d3b6","line":250,"range":{"start_line":217,"start_character":0,"end_line":250,"end_character":1},"in_reply_to":"7c06d7d0_4b15ea5b","updated":"2025-10-06 12:16:58.000000000","message":"Done","commit_id":"72ccee19132ed2dd683364ea5a6dbe731652dd40"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"a56dc4b0f7a147c084eee488d1ce398d4f33bef4","unresolved":true,"context_lines":[{"line_number":250,"context_line":""},{"line_number":251,"context_line":"    @decorators.idempotent_id(\u0027c3d4e5f6-7890-1234-cdef-345678901234\u0027)"},{"line_number":252,"context_line":"    @decorators.attr(type\u003d[\u0027strategy\u0027, \u0027continuous_audit\u0027,"},{"line_number":253,"context_line":"                           \u0027actionplan_superseding\u0027,"},{"line_number":254,"context_line":"                           \u0027dummy\u0027])"},{"line_number":255,"context_line":"    def test_continuous_audit_actionplan_superseding(self):"},{"line_number":256,"context_line":"        \"\"\"Test action plan superseding behavior in continuous audits."}],"source_content_type":"text/x-python","patch_set":11,"id":"7a44fe54_29acb466","line":253,"range":{"start_line":253,"start_character":28,"end_line":253,"end_character":50},"updated":"2025-10-01 09:40:12.000000000","message":"i think there is no point in having a attribute applied to only one test. If we want to run or disable this specific job we may use the name. Attributes are spected to group tests with certain criteria. This comment affects to all the below tests.","commit_id":"72ccee19132ed2dd683364ea5a6dbe731652dd40"},{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"77dbd4595fd941365d92fa2a68918c8fd1cd0887","unresolved":true,"context_lines":[{"line_number":250,"context_line":""},{"line_number":251,"context_line":"    @decorators.idempotent_id(\u0027c3d4e5f6-7890-1234-cdef-345678901234\u0027)"},{"line_number":252,"context_line":"    @decorators.attr(type\u003d[\u0027strategy\u0027, \u0027continuous_audit\u0027,"},{"line_number":253,"context_line":"                           \u0027actionplan_superseding\u0027,"},{"line_number":254,"context_line":"                           \u0027dummy\u0027])"},{"line_number":255,"context_line":"    def test_continuous_audit_actionplan_superseding(self):"},{"line_number":256,"context_line":"        \"\"\"Test action plan superseding behavior in continuous audits."}],"source_content_type":"text/x-python","patch_set":11,"id":"8596f548_7f6b6525","line":253,"range":{"start_line":253,"start_character":28,"end_line":253,"end_character":50},"in_reply_to":"1a1d7c84_1dd46976","updated":"2025-11-18 06:33:44.000000000","message":"replaced it with `@decorators.attr(type\u003d[\u0027scenario\u0027,\u0027strategy\u0027, \u0027dummy\u0027])`","commit_id":"72ccee19132ed2dd683364ea5a6dbe731652dd40"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"b9ff482992cf946da3d5364176b8c96b35f671df","unresolved":true,"context_lines":[{"line_number":250,"context_line":""},{"line_number":251,"context_line":"    @decorators.idempotent_id(\u0027c3d4e5f6-7890-1234-cdef-345678901234\u0027)"},{"line_number":252,"context_line":"    @decorators.attr(type\u003d[\u0027strategy\u0027, \u0027continuous_audit\u0027,"},{"line_number":253,"context_line":"                           \u0027actionplan_superseding\u0027,"},{"line_number":254,"context_line":"                           \u0027dummy\u0027])"},{"line_number":255,"context_line":"    def test_continuous_audit_actionplan_superseding(self):"},{"line_number":256,"context_line":"        \"\"\"Test action plan superseding behavior in continuous audits."}],"source_content_type":"text/x-python","patch_set":11,"id":"1a1d7c84_1dd46976","line":253,"range":{"start_line":253,"start_character":28,"end_line":253,"end_character":50},"in_reply_to":"7a44fe54_29acb466","updated":"2025-11-11 12:13:39.000000000","message":"i agree this is not correct.\n\nthere are only ment ot be a very small number of tags for borad catagories fo tests \n\nas in liek 3-5 total in the test suite so this is not correct.\n\n\nthe example that we shoudl ahve are effectivly\n\n- slow\n- fake-data\n- real-data\n- negitive\n- smoke\n- multinode\n\nhttps://docs.openstack.org/tempest/latest/HACKING.html#test-attributes\n\nthings like `api` and `scenario` are not attibute as scenario tests and api tests are are grouped in a common modules\n\nthe \u0027strategy\u0027 tag is only temporary while we are moving the tests but eventually shoudl be removed as all \u0027strategy\u0027 tests will be just scenaio tests in the future.\n\n\u0027dummy\u0027 might be valid long terem but \n\n\u0027continuous_audit\u0027 and \u0027actionplan_superseding\u0027\n\nare not following how tags are expected to be used.","commit_id":"72ccee19132ed2dd683364ea5a6dbe731652dd40"},{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"4ec402da83fb35cefa90fe012c7c3ca46b1f2ad7","unresolved":false,"context_lines":[{"line_number":250,"context_line":""},{"line_number":251,"context_line":"    @decorators.idempotent_id(\u0027c3d4e5f6-7890-1234-cdef-345678901234\u0027)"},{"line_number":252,"context_line":"    @decorators.attr(type\u003d[\u0027strategy\u0027, \u0027continuous_audit\u0027,"},{"line_number":253,"context_line":"                           \u0027actionplan_superseding\u0027,"},{"line_number":254,"context_line":"                           \u0027dummy\u0027])"},{"line_number":255,"context_line":"    def test_continuous_audit_actionplan_superseding(self):"},{"line_number":256,"context_line":"        \"\"\"Test action plan superseding behavior in continuous audits."}],"source_content_type":"text/x-python","patch_set":11,"id":"44bb01e3_73b0a970","line":253,"range":{"start_line":253,"start_character":28,"end_line":253,"end_character":50},"in_reply_to":"8596f548_7f6b6525","updated":"2025-11-25 11:38:28.000000000","message":"Done","commit_id":"72ccee19132ed2dd683364ea5a6dbe731652dd40"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"a56dc4b0f7a147c084eee488d1ce398d4f33bef4","unresolved":true,"context_lines":[{"line_number":307,"context_line":"    @decorators.idempotent_id(\u0027d4e5f678-9012-3456-def0-456789012345\u0027)"},{"line_number":308,"context_line":"    @decorators.attr(type\u003d[\u0027strategy\u0027, \u0027continuous_audit\u0027, \u0027interval_updates\u0027,"},{"line_number":309,"context_line":"                           \u0027dummy\u0027])"},{"line_number":310,"context_line":"    def test_continuous_audit_interval_updates(self):"},{"line_number":311,"context_line":"        \"\"\"Test runtime interval updates and crontab expression formats.\"\"\""},{"line_number":312,"context_line":"        goal_name \u003d \"dummy\""},{"line_number":313,"context_line":"        strategy_name \u003d \"dummy\""},{"line_number":314,"context_line":"        audit_kwargs \u003d {"},{"line_number":315,"context_line":"            \"interval\": \"*/2 * * * *\""},{"line_number":316,"context_line":"        }"},{"line_number":317,"context_line":""},{"line_number":318,"context_line":"        # Test 1: Runtime interval update via PATCH"},{"line_number":319,"context_line":"        audit \u003d self.execute_continuous_strategy(goal_name, strategy_name,"},{"line_number":320,"context_line":"                                                 **audit_kwargs)"},{"line_number":321,"context_line":"        audit_uuid \u003d audit[\u0027uuid\u0027]"},{"line_number":322,"context_line":""},{"line_number":323,"context_line":"        # Verify initial interval"},{"line_number":324,"context_line":"        _, initial_audit \u003d self.client.show_audit(audit_uuid)"},{"line_number":325,"context_line":"        self.assertEqual(\"*/2 * * * *\", initial_audit.get(\u0027interval\u0027))"},{"line_number":326,"context_line":""},{"line_number":327,"context_line":"        # Update interval and verify change"},{"line_number":328,"context_line":"        self.client.update_audit(audit_uuid, ["},{"line_number":329,"context_line":"            {\"op\": \"replace\", \"path\": \"/interval\", \"value\": \"*/1 * * * *\"}])"},{"line_number":330,"context_line":"        _, updated_audit \u003d self.client.show_audit(audit_uuid)"},{"line_number":331,"context_line":"        self.assertEqual(\"*/1 * * * *\", updated_audit.get(\u0027interval\u0027))"},{"line_number":332,"context_line":""},{"line_number":333,"context_line":"        # Test 2: Various crontab expression formats"},{"line_number":334,"context_line":"        test_formats \u003d ["},{"line_number":335,"context_line":"            (\"*/1 * * * *\", \"every minute\"),"},{"line_number":336,"context_line":"            (\"0 * * * *\", \"hourly\"),"},{"line_number":337,"context_line":"            (\"30 */2 * * *\", \"every 2 hours at :30\"),"},{"line_number":338,"context_line":"            (\"0 9 * * *\", \"daily at 9 AM\")"},{"line_number":339,"context_line":"        ]"},{"line_number":340,"context_line":""},{"line_number":341,"context_line":"        for cron_expr, description in test_formats:"},{"line_number":342,"context_line":"            test_audit_kwargs \u003d {\"interval\": cron_expr}"},{"line_number":343,"context_line":"            test_audit \u003d self.execute_continuous_strategy("},{"line_number":344,"context_line":"                goal_name, strategy_name, **test_audit_kwargs)"},{"line_number":345,"context_line":""},{"line_number":346,"context_line":"            _, created_audit \u003d self.client.show_audit(test_audit[\u0027uuid\u0027])"},{"line_number":347,"context_line":"            self.assertEqual(cron_expr, created_audit.get(\u0027interval\u0027))"},{"line_number":348,"context_line":""},{"line_number":349,"context_line":"    @decorators.idempotent_id(\u0027e5f67890-1234-5678-ef01-567890123456\u0027)"},{"line_number":350,"context_line":"    @decorators.attr(type\u003d[\u0027strategy\u0027, \u0027continuous_audit\u0027,"}],"source_content_type":"text/x-python","patch_set":11,"id":"77cbc61f_b39ec529","line":347,"range":{"start_line":310,"start_character":0,"end_line":347,"end_character":70},"updated":"2025-10-01 09:40:12.000000000","message":"IMO this is an api test, not an scenario one as it is only checking that the action call is successfully saved in db and returned in the following get call. It does not validate any non-api effect. i.e. it is actually testing that the interval is actually updated and applied in the decision-engine. We could move this to api test, or we may somehow check that the update is applied (i.e. changing interval and observing the execution timestamp of the following actionplans.","commit_id":"72ccee19132ed2dd683364ea5a6dbe731652dd40"},{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"77dbd4595fd941365d92fa2a68918c8fd1cd0887","unresolved":true,"context_lines":[{"line_number":307,"context_line":"    @decorators.idempotent_id(\u0027d4e5f678-9012-3456-def0-456789012345\u0027)"},{"line_number":308,"context_line":"    @decorators.attr(type\u003d[\u0027strategy\u0027, \u0027continuous_audit\u0027, \u0027interval_updates\u0027,"},{"line_number":309,"context_line":"                           \u0027dummy\u0027])"},{"line_number":310,"context_line":"    def test_continuous_audit_interval_updates(self):"},{"line_number":311,"context_line":"        \"\"\"Test runtime interval updates and crontab expression formats.\"\"\""},{"line_number":312,"context_line":"        goal_name \u003d \"dummy\""},{"line_number":313,"context_line":"        strategy_name \u003d \"dummy\""},{"line_number":314,"context_line":"        audit_kwargs \u003d {"},{"line_number":315,"context_line":"            \"interval\": \"*/2 * * * *\""},{"line_number":316,"context_line":"        }"},{"line_number":317,"context_line":""},{"line_number":318,"context_line":"        # Test 1: Runtime interval update via PATCH"},{"line_number":319,"context_line":"        audit \u003d self.execute_continuous_strategy(goal_name, strategy_name,"},{"line_number":320,"context_line":"                                                 **audit_kwargs)"},{"line_number":321,"context_line":"        audit_uuid \u003d audit[\u0027uuid\u0027]"},{"line_number":322,"context_line":""},{"line_number":323,"context_line":"        # Verify initial interval"},{"line_number":324,"context_line":"        _, initial_audit \u003d self.client.show_audit(audit_uuid)"},{"line_number":325,"context_line":"        self.assertEqual(\"*/2 * * * *\", initial_audit.get(\u0027interval\u0027))"},{"line_number":326,"context_line":""},{"line_number":327,"context_line":"        # Update interval and verify change"},{"line_number":328,"context_line":"        self.client.update_audit(audit_uuid, ["},{"line_number":329,"context_line":"            {\"op\": \"replace\", \"path\": \"/interval\", \"value\": \"*/1 * * * *\"}])"},{"line_number":330,"context_line":"        _, updated_audit \u003d self.client.show_audit(audit_uuid)"},{"line_number":331,"context_line":"        self.assertEqual(\"*/1 * * * *\", updated_audit.get(\u0027interval\u0027))"},{"line_number":332,"context_line":""},{"line_number":333,"context_line":"        # Test 2: Various crontab expression formats"},{"line_number":334,"context_line":"        test_formats \u003d ["},{"line_number":335,"context_line":"            (\"*/1 * * * *\", \"every minute\"),"},{"line_number":336,"context_line":"            (\"0 * * * *\", \"hourly\"),"},{"line_number":337,"context_line":"            (\"30 */2 * * *\", \"every 2 hours at :30\"),"},{"line_number":338,"context_line":"            (\"0 9 * * *\", \"daily at 9 AM\")"},{"line_number":339,"context_line":"        ]"},{"line_number":340,"context_line":""},{"line_number":341,"context_line":"        for cron_expr, description in test_formats:"},{"line_number":342,"context_line":"            test_audit_kwargs \u003d {\"interval\": cron_expr}"},{"line_number":343,"context_line":"            test_audit \u003d self.execute_continuous_strategy("},{"line_number":344,"context_line":"                goal_name, strategy_name, **test_audit_kwargs)"},{"line_number":345,"context_line":""},{"line_number":346,"context_line":"            _, created_audit \u003d self.client.show_audit(test_audit[\u0027uuid\u0027])"},{"line_number":347,"context_line":"            self.assertEqual(cron_expr, created_audit.get(\u0027interval\u0027))"},{"line_number":348,"context_line":""},{"line_number":349,"context_line":"    @decorators.idempotent_id(\u0027e5f67890-1234-5678-ef01-567890123456\u0027)"},{"line_number":350,"context_line":"    @decorators.attr(type\u003d[\u0027strategy\u0027, \u0027continuous_audit\u0027,"}],"source_content_type":"text/x-python","patch_set":11,"id":"7034ee85_591f86f3","line":347,"range":{"start_line":310,"start_character":0,"end_line":347,"end_character":70},"in_reply_to":"2a5691da_7e56bcb3","updated":"2025-11-18 06:33:44.000000000","message":"Good idea, I will restore/re-add this test in api side.","commit_id":"72ccee19132ed2dd683364ea5a6dbe731652dd40"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"b9ff482992cf946da3d5364176b8c96b35f671df","unresolved":true,"context_lines":[{"line_number":307,"context_line":"    @decorators.idempotent_id(\u0027d4e5f678-9012-3456-def0-456789012345\u0027)"},{"line_number":308,"context_line":"    @decorators.attr(type\u003d[\u0027strategy\u0027, \u0027continuous_audit\u0027, \u0027interval_updates\u0027,"},{"line_number":309,"context_line":"                           \u0027dummy\u0027])"},{"line_number":310,"context_line":"    def test_continuous_audit_interval_updates(self):"},{"line_number":311,"context_line":"        \"\"\"Test runtime interval updates and crontab expression formats.\"\"\""},{"line_number":312,"context_line":"        goal_name \u003d \"dummy\""},{"line_number":313,"context_line":"        strategy_name \u003d \"dummy\""},{"line_number":314,"context_line":"        audit_kwargs \u003d {"},{"line_number":315,"context_line":"            \"interval\": \"*/2 * * * *\""},{"line_number":316,"context_line":"        }"},{"line_number":317,"context_line":""},{"line_number":318,"context_line":"        # Test 1: Runtime interval update via PATCH"},{"line_number":319,"context_line":"        audit \u003d self.execute_continuous_strategy(goal_name, strategy_name,"},{"line_number":320,"context_line":"                                                 **audit_kwargs)"},{"line_number":321,"context_line":"        audit_uuid \u003d audit[\u0027uuid\u0027]"},{"line_number":322,"context_line":""},{"line_number":323,"context_line":"        # Verify initial interval"},{"line_number":324,"context_line":"        _, initial_audit \u003d self.client.show_audit(audit_uuid)"},{"line_number":325,"context_line":"        self.assertEqual(\"*/2 * * * *\", initial_audit.get(\u0027interval\u0027))"},{"line_number":326,"context_line":""},{"line_number":327,"context_line":"        # Update interval and verify change"},{"line_number":328,"context_line":"        self.client.update_audit(audit_uuid, ["},{"line_number":329,"context_line":"            {\"op\": \"replace\", \"path\": \"/interval\", \"value\": \"*/1 * * * *\"}])"},{"line_number":330,"context_line":"        _, updated_audit \u003d self.client.show_audit(audit_uuid)"},{"line_number":331,"context_line":"        self.assertEqual(\"*/1 * * * *\", updated_audit.get(\u0027interval\u0027))"},{"line_number":332,"context_line":""},{"line_number":333,"context_line":"        # Test 2: Various crontab expression formats"},{"line_number":334,"context_line":"        test_formats \u003d ["},{"line_number":335,"context_line":"            (\"*/1 * * * *\", \"every minute\"),"},{"line_number":336,"context_line":"            (\"0 * * * *\", \"hourly\"),"},{"line_number":337,"context_line":"            (\"30 */2 * * *\", \"every 2 hours at :30\"),"},{"line_number":338,"context_line":"            (\"0 9 * * *\", \"daily at 9 AM\")"},{"line_number":339,"context_line":"        ]"},{"line_number":340,"context_line":""},{"line_number":341,"context_line":"        for cron_expr, description in test_formats:"},{"line_number":342,"context_line":"            test_audit_kwargs \u003d {\"interval\": cron_expr}"},{"line_number":343,"context_line":"            test_audit \u003d self.execute_continuous_strategy("},{"line_number":344,"context_line":"                goal_name, strategy_name, **test_audit_kwargs)"},{"line_number":345,"context_line":""},{"line_number":346,"context_line":"            _, created_audit \u003d self.client.show_audit(test_audit[\u0027uuid\u0027])"},{"line_number":347,"context_line":"            self.assertEqual(cron_expr, created_audit.get(\u0027interval\u0027))"},{"line_number":348,"context_line":""},{"line_number":349,"context_line":"    @decorators.idempotent_id(\u0027e5f67890-1234-5678-ef01-567890123456\u0027)"},{"line_number":350,"context_line":"    @decorators.attr(type\u003d[\u0027strategy\u0027, \u0027continuous_audit\u0027,"}],"source_content_type":"text/x-python","patch_set":11,"id":"f92f6857_7f88b2f7","line":347,"range":{"start_line":310,"start_character":0,"end_line":347,"end_character":70},"in_reply_to":"446b1e64_3e25208c","updated":"2025-11-11 12:13:39.000000000","message":"well the api test coudlhave been valid to put in the api test folder rahter then jsut removign it if we dotn already have one for this.\n\ni agree this woudl be good test coverage to have.\nand yes because its using the dummy action its more of a api test then a secnario test.\n\nyou shoudl restore these tests and add them to \n\nhttps://opendev.org/openstack/watcher-tempest-plugin/src/branch/master/watcher_tempest_plugin/tests/api/admin/test_audit.py#L59\n\njust doping them is not the right way to adress alfredo\u0027s feedback","commit_id":"72ccee19132ed2dd683364ea5a6dbe731652dd40"},{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"4ec402da83fb35cefa90fe012c7c3ca46b1f2ad7","unresolved":false,"context_lines":[{"line_number":307,"context_line":"    @decorators.idempotent_id(\u0027d4e5f678-9012-3456-def0-456789012345\u0027)"},{"line_number":308,"context_line":"    @decorators.attr(type\u003d[\u0027strategy\u0027, \u0027continuous_audit\u0027, \u0027interval_updates\u0027,"},{"line_number":309,"context_line":"                           \u0027dummy\u0027])"},{"line_number":310,"context_line":"    def test_continuous_audit_interval_updates(self):"},{"line_number":311,"context_line":"        \"\"\"Test runtime interval updates and crontab expression formats.\"\"\""},{"line_number":312,"context_line":"        goal_name \u003d \"dummy\""},{"line_number":313,"context_line":"        strategy_name \u003d \"dummy\""},{"line_number":314,"context_line":"        audit_kwargs \u003d {"},{"line_number":315,"context_line":"            \"interval\": \"*/2 * * * *\""},{"line_number":316,"context_line":"        }"},{"line_number":317,"context_line":""},{"line_number":318,"context_line":"        # Test 1: Runtime interval update via PATCH"},{"line_number":319,"context_line":"        audit \u003d self.execute_continuous_strategy(goal_name, strategy_name,"},{"line_number":320,"context_line":"                                                 **audit_kwargs)"},{"line_number":321,"context_line":"        audit_uuid \u003d audit[\u0027uuid\u0027]"},{"line_number":322,"context_line":""},{"line_number":323,"context_line":"        # Verify initial interval"},{"line_number":324,"context_line":"        _, initial_audit \u003d self.client.show_audit(audit_uuid)"},{"line_number":325,"context_line":"        self.assertEqual(\"*/2 * * * *\", initial_audit.get(\u0027interval\u0027))"},{"line_number":326,"context_line":""},{"line_number":327,"context_line":"        # Update interval and verify change"},{"line_number":328,"context_line":"        self.client.update_audit(audit_uuid, ["},{"line_number":329,"context_line":"            {\"op\": \"replace\", \"path\": \"/interval\", \"value\": \"*/1 * * * *\"}])"},{"line_number":330,"context_line":"        _, updated_audit \u003d self.client.show_audit(audit_uuid)"},{"line_number":331,"context_line":"        self.assertEqual(\"*/1 * * * *\", updated_audit.get(\u0027interval\u0027))"},{"line_number":332,"context_line":""},{"line_number":333,"context_line":"        # Test 2: Various crontab expression formats"},{"line_number":334,"context_line":"        test_formats \u003d ["},{"line_number":335,"context_line":"            (\"*/1 * * * *\", \"every minute\"),"},{"line_number":336,"context_line":"            (\"0 * * * *\", \"hourly\"),"},{"line_number":337,"context_line":"            (\"30 */2 * * *\", \"every 2 hours at :30\"),"},{"line_number":338,"context_line":"            (\"0 9 * * *\", \"daily at 9 AM\")"},{"line_number":339,"context_line":"        ]"},{"line_number":340,"context_line":""},{"line_number":341,"context_line":"        for cron_expr, description in test_formats:"},{"line_number":342,"context_line":"            test_audit_kwargs \u003d {\"interval\": cron_expr}"},{"line_number":343,"context_line":"            test_audit \u003d self.execute_continuous_strategy("},{"line_number":344,"context_line":"                goal_name, strategy_name, **test_audit_kwargs)"},{"line_number":345,"context_line":""},{"line_number":346,"context_line":"            _, created_audit \u003d self.client.show_audit(test_audit[\u0027uuid\u0027])"},{"line_number":347,"context_line":"            self.assertEqual(cron_expr, created_audit.get(\u0027interval\u0027))"},{"line_number":348,"context_line":""},{"line_number":349,"context_line":"    @decorators.idempotent_id(\u0027e5f67890-1234-5678-ef01-567890123456\u0027)"},{"line_number":350,"context_line":"    @decorators.attr(type\u003d[\u0027strategy\u0027, \u0027continuous_audit\u0027,"}],"source_content_type":"text/x-python","patch_set":11,"id":"dc63916b_b19cfb1c","line":347,"range":{"start_line":310,"start_character":0,"end_line":347,"end_character":70},"in_reply_to":"7034ee85_591f86f3","updated":"2025-11-25 11:38:28.000000000","message":"Done in https://review.opendev.org/c/openstack/watcher-tempest-plugin/+/956004/36/watcher_tempest_plugin/tests/api/admin/test_audit.py","commit_id":"72ccee19132ed2dd683364ea5a6dbe731652dd40"},{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"3c4b03563d4a55f08a20d3e90a54e3063961204b","unresolved":true,"context_lines":[{"line_number":307,"context_line":"    @decorators.idempotent_id(\u0027d4e5f678-9012-3456-def0-456789012345\u0027)"},{"line_number":308,"context_line":"    @decorators.attr(type\u003d[\u0027strategy\u0027, \u0027continuous_audit\u0027, \u0027interval_updates\u0027,"},{"line_number":309,"context_line":"                           \u0027dummy\u0027])"},{"line_number":310,"context_line":"    def test_continuous_audit_interval_updates(self):"},{"line_number":311,"context_line":"        \"\"\"Test runtime interval updates and crontab expression formats.\"\"\""},{"line_number":312,"context_line":"        goal_name \u003d \"dummy\""},{"line_number":313,"context_line":"        strategy_name \u003d \"dummy\""},{"line_number":314,"context_line":"        audit_kwargs \u003d {"},{"line_number":315,"context_line":"            \"interval\": \"*/2 * * * *\""},{"line_number":316,"context_line":"        }"},{"line_number":317,"context_line":""},{"line_number":318,"context_line":"        # Test 1: Runtime interval update via PATCH"},{"line_number":319,"context_line":"        audit \u003d self.execute_continuous_strategy(goal_name, strategy_name,"},{"line_number":320,"context_line":"                                                 **audit_kwargs)"},{"line_number":321,"context_line":"        audit_uuid \u003d audit[\u0027uuid\u0027]"},{"line_number":322,"context_line":""},{"line_number":323,"context_line":"        # Verify initial interval"},{"line_number":324,"context_line":"        _, initial_audit \u003d self.client.show_audit(audit_uuid)"},{"line_number":325,"context_line":"        self.assertEqual(\"*/2 * * * *\", initial_audit.get(\u0027interval\u0027))"},{"line_number":326,"context_line":""},{"line_number":327,"context_line":"        # Update interval and verify change"},{"line_number":328,"context_line":"        self.client.update_audit(audit_uuid, ["},{"line_number":329,"context_line":"            {\"op\": \"replace\", \"path\": \"/interval\", \"value\": \"*/1 * * * *\"}])"},{"line_number":330,"context_line":"        _, updated_audit \u003d self.client.show_audit(audit_uuid)"},{"line_number":331,"context_line":"        self.assertEqual(\"*/1 * * * *\", updated_audit.get(\u0027interval\u0027))"},{"line_number":332,"context_line":""},{"line_number":333,"context_line":"        # Test 2: Various crontab expression formats"},{"line_number":334,"context_line":"        test_formats \u003d ["},{"line_number":335,"context_line":"            (\"*/1 * * * *\", \"every minute\"),"},{"line_number":336,"context_line":"            (\"0 * * * *\", \"hourly\"),"},{"line_number":337,"context_line":"            (\"30 */2 * * *\", \"every 2 hours at :30\"),"},{"line_number":338,"context_line":"            (\"0 9 * * *\", \"daily at 9 AM\")"},{"line_number":339,"context_line":"        ]"},{"line_number":340,"context_line":""},{"line_number":341,"context_line":"        for cron_expr, description in test_formats:"},{"line_number":342,"context_line":"            test_audit_kwargs \u003d {\"interval\": cron_expr}"},{"line_number":343,"context_line":"            test_audit \u003d self.execute_continuous_strategy("},{"line_number":344,"context_line":"                goal_name, strategy_name, **test_audit_kwargs)"},{"line_number":345,"context_line":""},{"line_number":346,"context_line":"            _, created_audit \u003d self.client.show_audit(test_audit[\u0027uuid\u0027])"},{"line_number":347,"context_line":"            self.assertEqual(cron_expr, created_audit.get(\u0027interval\u0027))"},{"line_number":348,"context_line":""},{"line_number":349,"context_line":"    @decorators.idempotent_id(\u0027e5f67890-1234-5678-ef01-567890123456\u0027)"},{"line_number":350,"context_line":"    @decorators.attr(type\u003d[\u0027strategy\u0027, \u0027continuous_audit\u0027,"}],"source_content_type":"text/x-python","patch_set":11,"id":"446b1e64_3e25208c","line":347,"range":{"start_line":310,"start_character":0,"end_line":347,"end_character":70},"in_reply_to":"77cbc61f_b39ec529","updated":"2025-10-06 12:16:58.000000000","message":"I have removed the test which seems to be api tests, keeping only scenario tests here.","commit_id":"72ccee19132ed2dd683364ea5a6dbe731652dd40"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"e46681462e0130e1dbe7bfa354168eb63be819a8","unresolved":true,"context_lines":[{"line_number":307,"context_line":"    @decorators.idempotent_id(\u0027d4e5f678-9012-3456-def0-456789012345\u0027)"},{"line_number":308,"context_line":"    @decorators.attr(type\u003d[\u0027strategy\u0027, \u0027continuous_audit\u0027, \u0027interval_updates\u0027,"},{"line_number":309,"context_line":"                           \u0027dummy\u0027])"},{"line_number":310,"context_line":"    def test_continuous_audit_interval_updates(self):"},{"line_number":311,"context_line":"        \"\"\"Test runtime interval updates and crontab expression formats.\"\"\""},{"line_number":312,"context_line":"        goal_name \u003d \"dummy\""},{"line_number":313,"context_line":"        strategy_name \u003d \"dummy\""},{"line_number":314,"context_line":"        audit_kwargs \u003d {"},{"line_number":315,"context_line":"            \"interval\": \"*/2 * * * *\""},{"line_number":316,"context_line":"        }"},{"line_number":317,"context_line":""},{"line_number":318,"context_line":"        # Test 1: Runtime interval update via PATCH"},{"line_number":319,"context_line":"        audit \u003d self.execute_continuous_strategy(goal_name, strategy_name,"},{"line_number":320,"context_line":"                                                 **audit_kwargs)"},{"line_number":321,"context_line":"        audit_uuid \u003d audit[\u0027uuid\u0027]"},{"line_number":322,"context_line":""},{"line_number":323,"context_line":"        # Verify initial interval"},{"line_number":324,"context_line":"        _, initial_audit \u003d self.client.show_audit(audit_uuid)"},{"line_number":325,"context_line":"        self.assertEqual(\"*/2 * * * *\", initial_audit.get(\u0027interval\u0027))"},{"line_number":326,"context_line":""},{"line_number":327,"context_line":"        # Update interval and verify change"},{"line_number":328,"context_line":"        self.client.update_audit(audit_uuid, ["},{"line_number":329,"context_line":"            {\"op\": \"replace\", \"path\": \"/interval\", \"value\": \"*/1 * * * *\"}])"},{"line_number":330,"context_line":"        _, updated_audit \u003d self.client.show_audit(audit_uuid)"},{"line_number":331,"context_line":"        self.assertEqual(\"*/1 * * * *\", updated_audit.get(\u0027interval\u0027))"},{"line_number":332,"context_line":""},{"line_number":333,"context_line":"        # Test 2: Various crontab expression formats"},{"line_number":334,"context_line":"        test_formats \u003d ["},{"line_number":335,"context_line":"            (\"*/1 * * * *\", \"every minute\"),"},{"line_number":336,"context_line":"            (\"0 * * * *\", \"hourly\"),"},{"line_number":337,"context_line":"            (\"30 */2 * * *\", \"every 2 hours at :30\"),"},{"line_number":338,"context_line":"            (\"0 9 * * *\", \"daily at 9 AM\")"},{"line_number":339,"context_line":"        ]"},{"line_number":340,"context_line":""},{"line_number":341,"context_line":"        for cron_expr, description in test_formats:"},{"line_number":342,"context_line":"            test_audit_kwargs \u003d {\"interval\": cron_expr}"},{"line_number":343,"context_line":"            test_audit \u003d self.execute_continuous_strategy("},{"line_number":344,"context_line":"                goal_name, strategy_name, **test_audit_kwargs)"},{"line_number":345,"context_line":""},{"line_number":346,"context_line":"            _, created_audit \u003d self.client.show_audit(test_audit[\u0027uuid\u0027])"},{"line_number":347,"context_line":"            self.assertEqual(cron_expr, created_audit.get(\u0027interval\u0027))"},{"line_number":348,"context_line":""},{"line_number":349,"context_line":"    @decorators.idempotent_id(\u0027e5f67890-1234-5678-ef01-567890123456\u0027)"},{"line_number":350,"context_line":"    @decorators.attr(type\u003d[\u0027strategy\u0027, \u0027continuous_audit\u0027,"}],"source_content_type":"text/x-python","patch_set":11,"id":"2a5691da_7e56bcb3","line":347,"range":{"start_line":310,"start_character":0,"end_line":347,"end_character":70},"in_reply_to":"f92f6857_7f88b2f7","updated":"2025-11-12 13:08:21.000000000","message":"i guess you could incoperate these tests into https://review.opendev.org/c/openstack/watcher-tempest-plugin/+/956004/33/watcher_tempest_plugin/tests/api/admin/test_audit.py\n\nbut you proably shoudld stack these patches so they are eiaser to review.","commit_id":"72ccee19132ed2dd683364ea5a6dbe731652dd40"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"a56dc4b0f7a147c084eee488d1ce398d4f33bef4","unresolved":true,"context_lines":[{"line_number":349,"context_line":"    @decorators.idempotent_id(\u0027e5f67890-1234-5678-ef01-567890123456\u0027)"},{"line_number":350,"context_line":"    @decorators.attr(type\u003d[\u0027strategy\u0027, \u0027continuous_audit\u0027,"},{"line_number":351,"context_line":"                           \u0027time_boundaries\u0027, \u0027dummy\u0027])"},{"line_number":352,"context_line":"    def test_continuous_audit_time_boundaries(self):"},{"line_number":353,"context_line":"        \"\"\"Test continuous audit with start/end time constraints.\"\"\""},{"line_number":354,"context_line":"        goal_name \u003d \"dummy\""},{"line_number":355,"context_line":"        strategy_name \u003d \"dummy\""}],"source_content_type":"text/x-python","patch_set":11,"id":"42ea0641_90ac1efe","line":352,"range":{"start_line":352,"start_character":0,"end_line":352,"end_character":2},"updated":"2025-10-01 09:40:12.000000000","message":"same comment, this is only testing the api part, not the end to end behavior.","commit_id":"72ccee19132ed2dd683364ea5a6dbe731652dd40"},{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"77dbd4595fd941365d92fa2a68918c8fd1cd0887","unresolved":false,"context_lines":[{"line_number":349,"context_line":"    @decorators.idempotent_id(\u0027e5f67890-1234-5678-ef01-567890123456\u0027)"},{"line_number":350,"context_line":"    @decorators.attr(type\u003d[\u0027strategy\u0027, \u0027continuous_audit\u0027,"},{"line_number":351,"context_line":"                           \u0027time_boundaries\u0027, \u0027dummy\u0027])"},{"line_number":352,"context_line":"    def test_continuous_audit_time_boundaries(self):"},{"line_number":353,"context_line":"        \"\"\"Test continuous audit with start/end time constraints.\"\"\""},{"line_number":354,"context_line":"        goal_name \u003d \"dummy\""},{"line_number":355,"context_line":"        strategy_name \u003d \"dummy\""}],"source_content_type":"text/x-python","patch_set":11,"id":"0bae5bf4_82403f42","line":352,"range":{"start_line":352,"start_character":0,"end_line":352,"end_character":2},"in_reply_to":"42ea0641_90ac1efe","updated":"2025-11-18 06:33:44.000000000","message":"Acknowledged","commit_id":"72ccee19132ed2dd683364ea5a6dbe731652dd40"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"a56dc4b0f7a147c084eee488d1ce398d4f33bef4","unresolved":true,"context_lines":[{"line_number":381,"context_line":"            self.client.update_audit(audit_uuid, ["},{"line_number":382,"context_line":"                {\"op\": \"replace\", \"path\": \"/start_time\","},{"line_number":383,"context_line":"                 \"value\": new_start_time.isoformat()}])"},{"line_number":384,"context_line":"        except Exception as e:"},{"line_number":385,"context_line":"            LOG.info(f\"Start time update may not be supported: {e}\")"},{"line_number":386,"context_line":""},{"line_number":387,"context_line":"        try:"},{"line_number":388,"context_line":"            self.client.update_audit(audit_uuid, ["}],"source_content_type":"text/x-python","patch_set":11,"id":"19c05855_12093a65","line":385,"range":{"start_line":384,"start_character":0,"end_line":385,"end_character":68},"updated":"2025-10-01 09:40:12.000000000","message":"this means we accept as valid both the success or the failure? why the start update \"may not be supported\", we should know if it\u0027s supported or not before doing the call.","commit_id":"72ccee19132ed2dd683364ea5a6dbe731652dd40"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"b9ff482992cf946da3d5364176b8c96b35f671df","unresolved":true,"context_lines":[{"line_number":381,"context_line":"            self.client.update_audit(audit_uuid, ["},{"line_number":382,"context_line":"                {\"op\": \"replace\", \"path\": \"/start_time\","},{"line_number":383,"context_line":"                 \"value\": new_start_time.isoformat()}])"},{"line_number":384,"context_line":"        except Exception as e:"},{"line_number":385,"context_line":"            LOG.info(f\"Start time update may not be supported: {e}\")"},{"line_number":386,"context_line":""},{"line_number":387,"context_line":"        try:"},{"line_number":388,"context_line":"            self.client.update_audit(audit_uuid, ["}],"source_content_type":"text/x-python","patch_set":11,"id":"121cb467_a660f668","line":385,"range":{"start_line":384,"start_character":0,"end_line":385,"end_character":68},"in_reply_to":"19c05855_12093a65","updated":"2025-11-11 12:13:39.000000000","message":"i also agree we have api microversion\n\nthere shoudl never be a case where we dont know if it will be supproted or not.","commit_id":"72ccee19132ed2dd683364ea5a6dbe731652dd40"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"a56dc4b0f7a147c084eee488d1ce398d4f33bef4","unresolved":true,"context_lines":[{"line_number":388,"context_line":"            self.client.update_audit(audit_uuid, ["},{"line_number":389,"context_line":"                {\"op\": \"replace\", \"path\": \"/end_time\","},{"line_number":390,"context_line":"                 \"value\": new_end_time.isoformat()}])"},{"line_number":391,"context_line":"        except Exception as e:"},{"line_number":392,"context_line":"            LOG.info(f\"End time update may not be supported: {e}\")"},{"line_number":393,"context_line":""},{"line_number":394,"context_line":"    @decorators.idempotent_id(\u0027f6789012-3456-7890-f123-678901234567\u0027)"},{"line_number":395,"context_line":"    @decorators.attr(type\u003d[\u0027strategy\u0027, \u0027continuous_audit\u0027,"}],"source_content_type":"text/x-python","patch_set":11,"id":"678c4519_262b4df0","line":392,"range":{"start_line":391,"start_character":1,"end_line":392,"end_character":66},"updated":"2025-10-01 09:40:12.000000000","message":"ditto","commit_id":"72ccee19132ed2dd683364ea5a6dbe731652dd40"},{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"4ec402da83fb35cefa90fe012c7c3ca46b1f2ad7","unresolved":false,"context_lines":[{"line_number":388,"context_line":"            self.client.update_audit(audit_uuid, ["},{"line_number":389,"context_line":"                {\"op\": \"replace\", \"path\": \"/end_time\","},{"line_number":390,"context_line":"                 \"value\": new_end_time.isoformat()}])"},{"line_number":391,"context_line":"        except Exception as e:"},{"line_number":392,"context_line":"            LOG.info(f\"End time update may not be supported: {e}\")"},{"line_number":393,"context_line":""},{"line_number":394,"context_line":"    @decorators.idempotent_id(\u0027f6789012-3456-7890-f123-678901234567\u0027)"},{"line_number":395,"context_line":"    @decorators.attr(type\u003d[\u0027strategy\u0027, \u0027continuous_audit\u0027,"}],"source_content_type":"text/x-python","patch_set":11,"id":"d8e6fda1_d68411a1","line":392,"range":{"start_line":391,"start_character":1,"end_line":392,"end_character":66},"in_reply_to":"678c4519_262b4df0","updated":"2025-11-25 11:38:28.000000000","message":"Done","commit_id":"72ccee19132ed2dd683364ea5a6dbe731652dd40"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"a56dc4b0f7a147c084eee488d1ce398d4f33bef4","unresolved":true,"context_lines":[{"line_number":403,"context_line":"            \"interval\": \"10\""},{"line_number":404,"context_line":"        }"},{"line_number":405,"context_line":""},{"line_number":406,"context_line":"        # Test 1: CANCEL from PENDING state"},{"line_number":407,"context_line":"        audit1 \u003d self.execute_continuous_strategy(goal_name, strategy_name,"},{"line_number":408,"context_line":"                                                  **audit_kwargs)"},{"line_number":409,"context_line":"        _, pending_audit \u003d self.client.show_audit(audit1[\u0027uuid\u0027])"},{"line_number":410,"context_line":"        self.assertIn(pending_audit.get(\u0027state\u0027), [\u0027PENDING\u0027, \u0027ONGOING\u0027])"},{"line_number":411,"context_line":""},{"line_number":412,"context_line":"        # Test 2: CANCEL from ONGOING state"},{"line_number":413,"context_line":"        audit2 \u003d self.execute_continuous_strategy(goal_name, strategy_name,"}],"source_content_type":"text/x-python","patch_set":11,"id":"47d71d2c_add4b98b","line":410,"range":{"start_line":406,"start_character":0,"end_line":410,"end_character":73},"updated":"2025-10-01 09:40:12.000000000","message":"you mention Cancel from PENDING, but i don\u0027t see any cancellation, am i missing something?.","commit_id":"72ccee19132ed2dd683364ea5a6dbe731652dd40"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"b9ff482992cf946da3d5364176b8c96b35f671df","unresolved":true,"context_lines":[{"line_number":403,"context_line":"            \"interval\": \"10\""},{"line_number":404,"context_line":"        }"},{"line_number":405,"context_line":""},{"line_number":406,"context_line":"        # Test 1: CANCEL from PENDING state"},{"line_number":407,"context_line":"        audit1 \u003d self.execute_continuous_strategy(goal_name, strategy_name,"},{"line_number":408,"context_line":"                                                  **audit_kwargs)"},{"line_number":409,"context_line":"        _, pending_audit \u003d self.client.show_audit(audit1[\u0027uuid\u0027])"},{"line_number":410,"context_line":"        self.assertIn(pending_audit.get(\u0027state\u0027), [\u0027PENDING\u0027, \u0027ONGOING\u0027])"},{"line_number":411,"context_line":""},{"line_number":412,"context_line":"        # Test 2: CANCEL from ONGOING state"},{"line_number":413,"context_line":"        audit2 \u003d self.execute_continuous_strategy(goal_name, strategy_name,"}],"source_content_type":"text/x-python","patch_set":11,"id":"6a8af0c4_22d2c565","line":410,"range":{"start_line":406,"start_character":0,"end_line":410,"end_character":73},"in_reply_to":"09b02b17_44fd95e5","updated":"2025-11-11 12:13:39.000000000","message":"@chandan if this is fixed you should have marked this as resolved.\n\nthe author of the patch is expected to resovle comment on the patch when they upload a new one if they adressed the comment unless you are explcitly asking the orgial reviewer to confirm it adressed.","commit_id":"72ccee19132ed2dd683364ea5a6dbe731652dd40"},{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"3c4b03563d4a55f08a20d3e90a54e3063961204b","unresolved":true,"context_lines":[{"line_number":403,"context_line":"            \"interval\": \"10\""},{"line_number":404,"context_line":"        }"},{"line_number":405,"context_line":""},{"line_number":406,"context_line":"        # Test 1: CANCEL from PENDING state"},{"line_number":407,"context_line":"        audit1 \u003d self.execute_continuous_strategy(goal_name, strategy_name,"},{"line_number":408,"context_line":"                                                  **audit_kwargs)"},{"line_number":409,"context_line":"        _, pending_audit \u003d self.client.show_audit(audit1[\u0027uuid\u0027])"},{"line_number":410,"context_line":"        self.assertIn(pending_audit.get(\u0027state\u0027), [\u0027PENDING\u0027, \u0027ONGOING\u0027])"},{"line_number":411,"context_line":""},{"line_number":412,"context_line":"        # Test 2: CANCEL from ONGOING state"},{"line_number":413,"context_line":"        audit2 \u003d self.execute_continuous_strategy(goal_name, strategy_name,"}],"source_content_type":"text/x-python","patch_set":11,"id":"09b02b17_44fd95e5","line":410,"range":{"start_line":406,"start_character":0,"end_line":410,"end_character":73},"in_reply_to":"47d71d2c_add4b98b","updated":"2025-10-06 12:16:58.000000000","message":"Fixed it now.","commit_id":"72ccee19132ed2dd683364ea5a6dbe731652dd40"},{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"77dbd4595fd941365d92fa2a68918c8fd1cd0887","unresolved":false,"context_lines":[{"line_number":403,"context_line":"            \"interval\": \"10\""},{"line_number":404,"context_line":"        }"},{"line_number":405,"context_line":""},{"line_number":406,"context_line":"        # Test 1: CANCEL from PENDING state"},{"line_number":407,"context_line":"        audit1 \u003d self.execute_continuous_strategy(goal_name, strategy_name,"},{"line_number":408,"context_line":"                                                  **audit_kwargs)"},{"line_number":409,"context_line":"        _, pending_audit \u003d self.client.show_audit(audit1[\u0027uuid\u0027])"},{"line_number":410,"context_line":"        self.assertIn(pending_audit.get(\u0027state\u0027), [\u0027PENDING\u0027, \u0027ONGOING\u0027])"},{"line_number":411,"context_line":""},{"line_number":412,"context_line":"        # Test 2: CANCEL from ONGOING state"},{"line_number":413,"context_line":"        audit2 \u003d self.execute_continuous_strategy(goal_name, strategy_name,"}],"source_content_type":"text/x-python","patch_set":11,"id":"8f8f7391_438f61b4","line":410,"range":{"start_line":406,"start_character":0,"end_line":410,"end_character":73},"in_reply_to":"6a8af0c4_22d2c565","updated":"2025-11-18 06:33:44.000000000","message":"Done","commit_id":"72ccee19132ed2dd683364ea5a6dbe731652dd40"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"a56dc4b0f7a147c084eee488d1ce398d4f33bef4","unresolved":true,"context_lines":[{"line_number":414,"context_line":"                                                  **audit_kwargs)"},{"line_number":415,"context_line":"        audit2_uuid \u003d audit2[\u0027uuid\u0027]"},{"line_number":416,"context_line":""},{"line_number":417,"context_line":"        # Wait for ONGOING state"},{"line_number":418,"context_line":"        self.assertTrue(test_utils.call_until_true("},{"line_number":419,"context_line":"            func\u003dfunctools.partial(self.is_audit_ongoing, audit2_uuid),"},{"line_number":420,"context_line":"            duration\u003d300, sleep_for\u003d10))"},{"line_number":421,"context_line":""},{"line_number":422,"context_line":"        # Test 3: DELETE constraints validation"},{"line_number":423,"context_line":"        audit3 \u003d self.execute_continuous_strategy(goal_name, strategy_name,"}],"source_content_type":"text/x-python","patch_set":11,"id":"063ba3c8_54f405f7","line":420,"range":{"start_line":417,"start_character":0,"end_line":420,"end_character":40},"updated":"2025-10-01 09:40:12.000000000","message":"ditto","commit_id":"72ccee19132ed2dd683364ea5a6dbe731652dd40"},{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"77dbd4595fd941365d92fa2a68918c8fd1cd0887","unresolved":false,"context_lines":[{"line_number":414,"context_line":"                                                  **audit_kwargs)"},{"line_number":415,"context_line":"        audit2_uuid \u003d audit2[\u0027uuid\u0027]"},{"line_number":416,"context_line":""},{"line_number":417,"context_line":"        # Wait for ONGOING state"},{"line_number":418,"context_line":"        self.assertTrue(test_utils.call_until_true("},{"line_number":419,"context_line":"            func\u003dfunctools.partial(self.is_audit_ongoing, audit2_uuid),"},{"line_number":420,"context_line":"            duration\u003d300, sleep_for\u003d10))"},{"line_number":421,"context_line":""},{"line_number":422,"context_line":"        # Test 3: DELETE constraints validation"},{"line_number":423,"context_line":"        audit3 \u003d self.execute_continuous_strategy(goal_name, strategy_name,"}],"source_content_type":"text/x-python","patch_set":11,"id":"24563f3f_3e72a92c","line":420,"range":{"start_line":417,"start_character":0,"end_line":420,"end_character":40},"in_reply_to":"063ba3c8_54f405f7","updated":"2025-11-18 06:33:44.000000000","message":"Done","commit_id":"72ccee19132ed2dd683364ea5a6dbe731652dd40"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"782f45ec5d13e2303280323ed29e2d1f1766f5cf","unresolved":true,"context_lines":[{"line_number":342,"context_line":"                         \"Audit should remain ONGOING after multiple \""},{"line_number":343,"context_line":"                         \"executions\")"},{"line_number":344,"context_line":""},{"line_number":345,"context_line":"        # Verify superseding mechanism: first AP transitioned from"},{"line_number":346,"context_line":"        # RECOMMENDED to CANCELLED when second AP was created"},{"line_number":347,"context_line":"        _, first_ap_after_supersede \u003d self.client.show_action_plan("},{"line_number":348,"context_line":"            first_ap_uuid)"},{"line_number":349,"context_line":"        self.assertEqual("},{"line_number":350,"context_line":"            \u0027CANCELLED\u0027, first_ap_after_supersede.get(\u0027state\u0027),"},{"line_number":351,"context_line":"            \"First action plan should be automatically CANCELLED \""},{"line_number":352,"context_line":"            \"when second action plan is created (superseding)\")"},{"line_number":353,"context_line":""},{"line_number":354,"context_line":"    @decorators.idempotent_id(\u0027d4e5f678-9012-3456-def0-456789012345\u0027)"},{"line_number":355,"context_line":"    @decorators.attr(type\u003d[\u0027strategy\u0027, \u0027continuous_audit\u0027, \u0027dummy\u0027])"}],"source_content_type":"text/x-python","patch_set":18,"id":"f1558153_fb2ff82c","line":352,"range":{"start_line":345,"start_character":0,"end_line":352,"end_character":63},"updated":"2025-10-16 11:44:06.000000000","message":"nit. We may add a check to validate that the latest one is in RECOMMENDED, but this lgtm.","commit_id":"b71361fd641d111edbfe54c4e0db653f232b1972"},{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"77dbd4595fd941365d92fa2a68918c8fd1cd0887","unresolved":false,"context_lines":[{"line_number":342,"context_line":"                         \"Audit should remain ONGOING after multiple \""},{"line_number":343,"context_line":"                         \"executions\")"},{"line_number":344,"context_line":""},{"line_number":345,"context_line":"        # Verify superseding mechanism: first AP transitioned from"},{"line_number":346,"context_line":"        # RECOMMENDED to CANCELLED when second AP was created"},{"line_number":347,"context_line":"        _, first_ap_after_supersede \u003d self.client.show_action_plan("},{"line_number":348,"context_line":"            first_ap_uuid)"},{"line_number":349,"context_line":"        self.assertEqual("},{"line_number":350,"context_line":"            \u0027CANCELLED\u0027, first_ap_after_supersede.get(\u0027state\u0027),"},{"line_number":351,"context_line":"            \"First action plan should be automatically CANCELLED \""},{"line_number":352,"context_line":"            \"when second action plan is created (superseding)\")"},{"line_number":353,"context_line":""},{"line_number":354,"context_line":"    @decorators.idempotent_id(\u0027d4e5f678-9012-3456-def0-456789012345\u0027)"},{"line_number":355,"context_line":"    @decorators.attr(type\u003d[\u0027strategy\u0027, \u0027continuous_audit\u0027, \u0027dummy\u0027])"}],"source_content_type":"text/x-python","patch_set":18,"id":"f430b787_beb49213","line":352,"range":{"start_line":345,"start_character":0,"end_line":352,"end_character":63},"in_reply_to":"f1558153_fb2ff82c","updated":"2025-11-18 06:33:44.000000000","message":"Done","commit_id":"b71361fd641d111edbfe54c4e0db653f232b1972"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"4f4e7b93f43f51783bcd69721fbc379815313be0","unresolved":true,"context_lines":[{"line_number":213,"context_line":"        _, audit \u003d self.create_audit("},{"line_number":214,"context_line":"            audit_template[\u0027uuid\u0027],"},{"line_number":215,"context_line":"            audit_type\u003d\u0027CONTINUOUS\u0027,"},{"line_number":216,"context_line":"            interval\u003d\"10\")  # 10 seconds for faster test execution"},{"line_number":217,"context_line":"        audit_uuid \u003d audit[\u0027uuid\u0027]"},{"line_number":218,"context_line":""},{"line_number":219,"context_line":"        # Test PENDING → ONGOING transition"}],"source_content_type":"text/x-python","patch_set":19,"id":"452224b2_35a420e5","line":216,"updated":"2025-10-24 15:29:33.000000000","message":"honestly this si still pretty long but lets see how this goes in ci.\n\nin generall indivgual tets in cid shoudl try not to exceed 30 secods\n\nideally lest the 10 total time.","commit_id":"4c57593a80ff077054fad7d13fa410dd180fe62a"},{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"77dbd4595fd941365d92fa2a68918c8fd1cd0887","unresolved":false,"context_lines":[{"line_number":213,"context_line":"        _, audit \u003d self.create_audit("},{"line_number":214,"context_line":"            audit_template[\u0027uuid\u0027],"},{"line_number":215,"context_line":"            audit_type\u003d\u0027CONTINUOUS\u0027,"},{"line_number":216,"context_line":"            interval\u003d\"10\")  # 10 seconds for faster test execution"},{"line_number":217,"context_line":"        audit_uuid \u003d audit[\u0027uuid\u0027]"},{"line_number":218,"context_line":""},{"line_number":219,"context_line":"        # Test PENDING → ONGOING transition"}],"source_content_type":"text/x-python","patch_set":19,"id":"7a80f382_182e09d6","line":216,"in_reply_to":"452224b2_35a420e5","updated":"2025-11-18 06:33:44.000000000","message":"Done","commit_id":"4c57593a80ff077054fad7d13fa410dd180fe62a"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"4f4e7b93f43f51783bcd69721fbc379815313be0","unresolved":true,"context_lines":[{"line_number":219,"context_line":"        # Test PENDING → ONGOING transition"},{"line_number":220,"context_line":"        self.assertTrue(test_utils.call_until_true("},{"line_number":221,"context_line":"            func\u003dfunctools.partial(self.is_audit_ongoing, audit_uuid),"},{"line_number":222,"context_line":"            duration\u003d300, sleep_for\u003d10))"},{"line_number":223,"context_line":""},{"line_number":224,"context_line":"        # Wait for first action plan to be created"},{"line_number":225,"context_line":"        self.assertTrue(test_utils.call_until_true("}],"source_content_type":"text/x-python","patch_set":19,"id":"33b314f3_315dd6db","line":222,"updated":"2025-10-24 15:29:33.000000000","message":"this is not really an ok value\n\n\nno test shoudl take 5 mines and we certenlly shoudl not be doing this mulitple times\n\nwe shoudl be checking at least 1 a secodn and no more then about 30 seconds for the overall eight.","commit_id":"4c57593a80ff077054fad7d13fa410dd180fe62a"},{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"77dbd4595fd941365d92fa2a68918c8fd1cd0887","unresolved":false,"context_lines":[{"line_number":219,"context_line":"        # Test PENDING → ONGOING transition"},{"line_number":220,"context_line":"        self.assertTrue(test_utils.call_until_true("},{"line_number":221,"context_line":"            func\u003dfunctools.partial(self.is_audit_ongoing, audit_uuid),"},{"line_number":222,"context_line":"            duration\u003d300, sleep_for\u003d10))"},{"line_number":223,"context_line":""},{"line_number":224,"context_line":"        # Wait for first action plan to be created"},{"line_number":225,"context_line":"        self.assertTrue(test_utils.call_until_true("}],"source_content_type":"text/x-python","patch_set":19,"id":"0bff45bc_0f65a33f","line":222,"in_reply_to":"33b314f3_315dd6db","updated":"2025-11-18 06:33:44.000000000","message":"Done","commit_id":"4c57593a80ff077054fad7d13fa410dd180fe62a"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"4f4e7b93f43f51783bcd69721fbc379815313be0","unresolved":true,"context_lines":[{"line_number":224,"context_line":"        # Wait for first action plan to be created"},{"line_number":225,"context_line":"        self.assertTrue(test_utils.call_until_true("},{"line_number":226,"context_line":"            func\u003dfunctools.partial(self.has_action_plans, audit_uuid),"},{"line_number":227,"context_line":"            duration\u003d300, sleep_for\u003d10))"},{"line_number":228,"context_line":""},{"line_number":229,"context_line":"        _, initial_aps \u003d self.client.list_action_plans(audit_uuid\u003daudit_uuid)"},{"line_number":230,"context_line":"        initial_ap_count \u003d len(initial_aps.get(\u0027action_plans\u0027, []))"}],"source_content_type":"text/x-python","patch_set":19,"id":"741d1da7_1abbc1ac","line":227,"updated":"2025-10-24 15:29:33.000000000","message":"same here.","commit_id":"4c57593a80ff077054fad7d13fa410dd180fe62a"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"b9ff482992cf946da3d5364176b8c96b35f671df","unresolved":true,"context_lines":[{"line_number":77,"context_line":"        #    cluster model update from continous audit thread."},{"line_number":78,"context_line":"        _, audit \u003d self.create_audit("},{"line_number":79,"context_line":"            audit_template[\"uuid\"],"},{"line_number":80,"context_line":"            audit_type\u003d\"CONTINUOUS\","},{"line_number":81,"context_line":"            interval\u003d\"10\","},{"line_number":82,"context_line":"            parameters\u003daudit_parameters)"},{"line_number":83,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"4514033b_a8168913","side":"PARENT","line":80,"updated":"2025-11-11 12:13:39.000000000","message":"these changes feel unrealted by the way.\n\ni dont see a reason to chagne the quoating style","commit_id":"ee4d40806744974c0a94652c69a6d21528bf7831"},{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"77dbd4595fd941365d92fa2a68918c8fd1cd0887","unresolved":false,"context_lines":[{"line_number":77,"context_line":"        #    cluster model update from continous audit thread."},{"line_number":78,"context_line":"        _, audit \u003d self.create_audit("},{"line_number":79,"context_line":"            audit_template[\"uuid\"],"},{"line_number":80,"context_line":"            audit_type\u003d\"CONTINUOUS\","},{"line_number":81,"context_line":"            interval\u003d\"10\","},{"line_number":82,"context_line":"            parameters\u003daudit_parameters)"},{"line_number":83,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"3e579ae1_8ab903ce","side":"PARENT","line":80,"in_reply_to":"4514033b_a8168913","updated":"2025-11-18 06:33:44.000000000","message":"Done","commit_id":"ee4d40806744974c0a94652c69a6d21528bf7831"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"b9ff482992cf946da3d5364176b8c96b35f671df","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":20,"id":"ac202569_209e34fd","in_reply_to":"0b135cb6_d47dbd11","updated":"2025-11-11 12:13:39.000000000","message":"\u003e Time-based test reliability improvements - (Severity: suggestion, Confidence: 0.6) | Recommendation: Consider using configurable wait times instead of fixed sleep durations to improve test reliability across different CI environments\n\nvalid but we will adress this later for all tests.","commit_id":"e26cdf6fe0322a6f2b01df62b1dc80a2c777d91d"},{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"4ec402da83fb35cefa90fe012c7c3ca46b1f2ad7","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":20,"id":"c9434ae1_a922f6d1","in_reply_to":"1e6661a6_542b8c39","updated":"2025-11-25 11:38:28.000000000","message":"no longer needed","commit_id":"e26cdf6fe0322a6f2b01df62b1dc80a2c777d91d"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"5bc87610326c713ed25b027ac0eed5096bf8c292","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":20,"id":"1e6661a6_542b8c39","in_reply_to":"dd9d0d95_eef24d77","updated":"2025-11-11 12:15:35.000000000","message":"\u003e Use of string literals instead of constants - (Severity: suggestion, Confidence: 0.7) | Recommendation: Define constants for audit states (\u0027CONTINUOUS\u0027, \u0027SUSPENDED\u0027, \u0027ONGOING\u0027, \u0027CANCELLED\u0027) and intervals\n\nthis is also valid we shoudl have constant or an enum defiend in a module an resue tehm in our test for the states.","commit_id":"e26cdf6fe0322a6f2b01df62b1dc80a2c777d91d"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"b9ff482992cf946da3d5364176b8c96b35f671df","unresolved":true,"context_lines":[{"line_number":1,"context_line":"# Copyright 2025 Red Hat, Inc."},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"# not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":20,"id":"c5f8595f_02761260","line":1,"in_reply_to":"12bcfd06_f1ad0399","updated":"2025-11-11 12:13:39.000000000","message":"\u003e Missing Apache License header in test file - (Severity: warning, Confidence: 0.9)\n\nso we generally avoid adding copyright notices to new code.\nwe preserve them if present but should avoid addign new ones or updating them.\n\nwith that said i need to impove the check to allow for copyright notices in the licence. comment.","commit_id":"e26cdf6fe0322a6f2b01df62b1dc80a2c777d91d"},{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"4ec402da83fb35cefa90fe012c7c3ca46b1f2ad7","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2025 Red Hat, Inc."},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"# not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":20,"id":"959769aa_bd2b9e5c","line":1,"in_reply_to":"c5f8595f_02761260","updated":"2025-11-25 11:38:28.000000000","message":"Acknowledged","commit_id":"e26cdf6fe0322a6f2b01df62b1dc80a2c777d91d"},{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"77dbd4595fd941365d92fa2a68918c8fd1cd0887","unresolved":false,"context_lines":[{"line_number":12,"context_line":"# License for the specific language governing permissions and limitations"},{"line_number":13,"context_line":"# under the License."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"import functools"},{"line_number":16,"context_line":"import time"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"from datetime import datetime"}],"source_content_type":"text/x-python","patch_set":20,"id":"d3c60495_a79ce2c4","line":15,"in_reply_to":"22dc6f87_626175c7","updated":"2025-11-18 06:33:44.000000000","message":"Done","commit_id":"e26cdf6fe0322a6f2b01df62b1dc80a2c777d91d"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"b9ff482992cf946da3d5364176b8c96b35f671df","unresolved":true,"context_lines":[{"line_number":12,"context_line":"# License for the specific language governing permissions and limitations"},{"line_number":13,"context_line":"# under the License."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"import functools"},{"line_number":16,"context_line":"import time"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"from datetime import datetime"}],"source_content_type":"text/x-python","patch_set":20,"id":"22dc6f87_626175c7","line":15,"in_reply_to":"a0d1f186_cd595208","updated":"2025-11-11 12:13:39.000000000","message":"\u003e Import style inconsistency - (Severity: warning, Confidence: 0.8)\n\nso this is calling out that we shoudl not be mixing\n\nfrom datetime\nand\nfrom oslo_log\nand \nfrom tempest\n\nin the same group our codeing convetions require\n\n```\nimport functools\nimport time\n\nfrom datetime import datetime\nfrom datetime import timedelta\nfrom datetime import timezone\n\nfrom oslo_log import log\n\nfrom tempest import config\nfrom tempest.lib.common.utils import test_utils\nfrom tempest.lib import decorators\n\nfrom watcher_tempest_plugin.tests.scenario import base\n```\n\n```\n[severity: warning] Import style inconsistency - Confidence: 0.8\nLocation: watcher_tempest_plugin/tests/scenario/test_continuous_audit.py:15-24\nImpact: Import organization doesn\u0027t follow strict stdlib → third-party → local ordering\nSuggestion: Reorder imports to comply with OpenStack import organization standards\n```\ni tought i had fixed the message formating to includ ethe impact and suggetion but i guess that need more work","commit_id":"e26cdf6fe0322a6f2b01df62b1dc80a2c777d91d"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"b9ff482992cf946da3d5364176b8c96b35f671df","unresolved":false,"context_lines":[{"line_number":197,"context_line":"    @decorators.idempotent_id(\u0027b2c3d4e5-6f78-9012-bcde-f23456789012\u0027)"},{"line_number":198,"context_line":"    @decorators.attr(type\u003d[\u0027strategy\u0027, \u0027continuous_audit\u0027, \u0027dummy\u0027])"},{"line_number":199,"context_line":"    def test_continuous_audit_state_lifecycle(self):"},{"line_number":200,"context_line":"        \"\"\"Test continuous audit complete state lifecycle."},{"line_number":201,"context_line":""},{"line_number":202,"context_line":"        Validates the complete state machine for continuous audits:"},{"line_number":203,"context_line":"        PENDING → ONGOING → SUSPENDED → ONGOING → CANCELLED"}],"source_content_type":"text/x-python","patch_set":20,"id":"f777f7d0_649e34b0","line":200,"in_reply_to":"05203d8d_c5212871","updated":"2025-11-11 12:13:39.000000000","message":"\u003e Line length violations in docstrings - (Severity: warning, Confidence: 0.8)\n\nthis is from a previous run and no longer relevant.","commit_id":"e26cdf6fe0322a6f2b01df62b1dc80a2c777d91d"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"b9ff482992cf946da3d5364176b8c96b35f671df","unresolved":true,"context_lines":[{"line_number":432,"context_line":""},{"line_number":433,"context_line":"        # Wait 10 seconds and verify audit is still PENDING (before start_time)"},{"line_number":434,"context_line":""},{"line_number":435,"context_line":"        time.sleep(10)"},{"line_number":436,"context_line":"        _, pending_audit \u003d self.client.show_audit(audit_uuid)"},{"line_number":437,"context_line":"        self.assertEqual(\u0027PENDING\u0027, pending_audit.get(\u0027state\u0027),"},{"line_number":438,"context_line":"                         \"Audit should remain PENDING before start_time\")"}],"source_content_type":"text/x-python","patch_set":20,"id":"1410c18b_0c40e3cb","line":435,"updated":"2025-11-11 12:13:39.000000000","message":"these hardcoced uncodtional sleeps are not ok.\n\nthis alone desrves a -1\n\nthis test has 40 seconds of mandatory sleep + several addtioanl sleeps\nyou do not have the time budge to wati this lon for this test to run in ci.","commit_id":"e26cdf6fe0322a6f2b01df62b1dc80a2c777d91d"},{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"77dbd4595fd941365d92fa2a68918c8fd1cd0887","unresolved":true,"context_lines":[{"line_number":432,"context_line":""},{"line_number":433,"context_line":"        # Wait 10 seconds and verify audit is still PENDING (before start_time)"},{"line_number":434,"context_line":""},{"line_number":435,"context_line":"        time.sleep(10)"},{"line_number":436,"context_line":"        _, pending_audit \u003d self.client.show_audit(audit_uuid)"},{"line_number":437,"context_line":"        self.assertEqual(\u0027PENDING\u0027, pending_audit.get(\u0027state\u0027),"},{"line_number":438,"context_line":"                         \"Audit should remain PENDING before start_time\")"}],"source_content_type":"text/x-python","patch_set":20,"id":"f944b349_ef511379","line":435,"in_reply_to":"1410c18b_0c40e3cb","updated":"2025-11-18 06:33:44.000000000","message":"All the hard coded sleep is removed now. thank you!","commit_id":"e26cdf6fe0322a6f2b01df62b1dc80a2c777d91d"},{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"4ec402da83fb35cefa90fe012c7c3ca46b1f2ad7","unresolved":false,"context_lines":[{"line_number":432,"context_line":""},{"line_number":433,"context_line":"        # Wait 10 seconds and verify audit is still PENDING (before start_time)"},{"line_number":434,"context_line":""},{"line_number":435,"context_line":"        time.sleep(10)"},{"line_number":436,"context_line":"        _, pending_audit \u003d self.client.show_audit(audit_uuid)"},{"line_number":437,"context_line":"        self.assertEqual(\u0027PENDING\u0027, pending_audit.get(\u0027state\u0027),"},{"line_number":438,"context_line":"                         \"Audit should remain PENDING before start_time\")"}],"source_content_type":"text/x-python","patch_set":20,"id":"3126be61_2953ef51","line":435,"in_reply_to":"f944b349_ef511379","updated":"2025-11-25 11:38:28.000000000","message":"Done","commit_id":"e26cdf6fe0322a6f2b01df62b1dc80a2c777d91d"}],"watcher_tempest_plugin/tests/scenario/test_execute_host_maintenance.py":[{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"ffe5f63b028335385024bcd634f380ac8a94a00e","unresolved":true,"context_lines":[{"line_number":126,"context_line":"        self.assertEqual(expected_goal, audit.get(\u0027goal_uuid\u0027))"},{"line_number":127,"context_line":"        self.assertEqual(expected_strategy, audit.get(\u0027strategy_uuid\u0027))"},{"line_number":128,"context_line":"        self.assertFalse(audit.get(\u0027auto_trigger\u0027))  # Manual approval mode"},{"line_number":129,"context_line":"        self.assertIn(audit.get(\u0027state\u0027), (\u0027PENDING\u0027, \u0027ONGOING\u0027))"},{"line_number":130,"context_line":""},{"line_number":131,"context_line":"        return audit"},{"line_number":132,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"45630139_c9ba1ab9","line":129,"range":{"start_line":129,"start_character":8,"end_line":129,"end_character":65},"updated":"2025-07-23 10:42:42.000000000","message":"you could parametrize the expected values so that we can check at the end that the audit is cancelled. expected_states\u003d[\u0027PENDING\u0027, \u0027ONGOING\u0027] may be default values.","commit_id":"a07ea0d7c14ed86bd9a46d949d14cb64f8f11d44"},{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"4ec402da83fb35cefa90fe012c7c3ca46b1f2ad7","unresolved":false,"context_lines":[{"line_number":126,"context_line":"        self.assertEqual(expected_goal, audit.get(\u0027goal_uuid\u0027))"},{"line_number":127,"context_line":"        self.assertEqual(expected_strategy, audit.get(\u0027strategy_uuid\u0027))"},{"line_number":128,"context_line":"        self.assertFalse(audit.get(\u0027auto_trigger\u0027))  # Manual approval mode"},{"line_number":129,"context_line":"        self.assertIn(audit.get(\u0027state\u0027), (\u0027PENDING\u0027, \u0027ONGOING\u0027))"},{"line_number":130,"context_line":""},{"line_number":131,"context_line":"        return audit"},{"line_number":132,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"2eb81271_8aabcc9c","line":129,"range":{"start_line":129,"start_character":8,"end_line":129,"end_character":65},"in_reply_to":"45630139_c9ba1ab9","updated":"2025-11-25 11:38:28.000000000","message":"Acknowledged","commit_id":"a07ea0d7c14ed86bd9a46d949d14cb64f8f11d44"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"ffe5f63b028335385024bcd634f380ac8a94a00e","unresolved":true,"context_lines":[{"line_number":134,"context_line":"    @decorators.attr(type\u003d[\u0027continuous_audit\u0027, \u0027audit_template\u0027,"},{"line_number":135,"context_line":"                           \u0027host_maintenance\u0027, \u0027scenario\u0027,"},{"line_number":136,"context_line":"                           \u0027strategy\u0027])"},{"line_number":137,"context_line":"    def test_continuous_host_maintenance_manual_approval(self):"},{"line_number":138,"context_line":"        \"\"\"Test continuous audit for host maintenance with manual approval."},{"line_number":139,"context_line":""},{"line_number":140,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":6,"id":"8129ba7b_bba25041","line":137,"range":{"start_line":137,"start_character":0,"end_line":137,"end_character":2},"updated":"2025-07-23 10:42:42.000000000","message":"Is there any reason to use host_maintenance strategy to test the continuous audits?. For a general validation of continuous audit i\u0027d use dummy goal and strategy which is much easier, faster and less error prone that any of the \"real\" ones. With that, we can test the specific behavior of the continuous audits, including interval handling, manual or automatic updates, etc... we may even test interval update via patch call. \n\nThe only relevant aspect not tested with dummy strategy is access to the model, and for continuous audits that\u0027s tested enough in https://review.opendev.org/c/openstack/watcher-tempest-plugin/+/954264","commit_id":"a07ea0d7c14ed86bd9a46d949d14cb64f8f11d44"},{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"4ec402da83fb35cefa90fe012c7c3ca46b1f2ad7","unresolved":false,"context_lines":[{"line_number":134,"context_line":"    @decorators.attr(type\u003d[\u0027continuous_audit\u0027, \u0027audit_template\u0027,"},{"line_number":135,"context_line":"                           \u0027host_maintenance\u0027, \u0027scenario\u0027,"},{"line_number":136,"context_line":"                           \u0027strategy\u0027])"},{"line_number":137,"context_line":"    def test_continuous_host_maintenance_manual_approval(self):"},{"line_number":138,"context_line":"        \"\"\"Test continuous audit for host maintenance with manual approval."},{"line_number":139,"context_line":""},{"line_number":140,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":6,"id":"770f0046_80c3905b","line":137,"range":{"start_line":137,"start_character":0,"end_line":137,"end_character":2},"in_reply_to":"8129ba7b_bba25041","updated":"2025-11-25 11:38:28.000000000","message":"I think i resolved this also.","commit_id":"a07ea0d7c14ed86bd9a46d949d14cb64f8f11d44"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"ffe5f63b028335385024bcd634f380ac8a94a00e","unresolved":true,"context_lines":[{"line_number":162,"context_line":"        )"},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"        # Step 3: Create continuous audit with 2-minute cron interval"},{"line_number":165,"context_line":"        cron_interval \u003d \"*/2 * * * *\"  # Every 2 minutes"},{"line_number":166,"context_line":"        audit_params \u003d {"},{"line_number":167,"context_line":"            \u0027audit_template_uuid\u0027: audit_template[\u0027uuid\u0027],"},{"line_number":168,"context_line":"            \u0027audit_type\u0027: \u0027CONTINUOUS\u0027,"}],"source_content_type":"text/x-python","patch_set":6,"id":"0837164e_c27f9bb8","line":165,"range":{"start_line":165,"start_character":8,"end_line":165,"end_character":56},"updated":"2025-07-23 10:42:42.000000000","message":"suggestion, reduce this to every minute to reduce time test.","commit_id":"a07ea0d7c14ed86bd9a46d949d14cb64f8f11d44"},{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"4ec402da83fb35cefa90fe012c7c3ca46b1f2ad7","unresolved":false,"context_lines":[{"line_number":162,"context_line":"        )"},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"        # Step 3: Create continuous audit with 2-minute cron interval"},{"line_number":165,"context_line":"        cron_interval \u003d \"*/2 * * * *\"  # Every 2 minutes"},{"line_number":166,"context_line":"        audit_params \u003d {"},{"line_number":167,"context_line":"            \u0027audit_template_uuid\u0027: audit_template[\u0027uuid\u0027],"},{"line_number":168,"context_line":"            \u0027audit_type\u0027: \u0027CONTINUOUS\u0027,"}],"source_content_type":"text/x-python","patch_set":6,"id":"6d33d584_6ff5fbb9","line":165,"range":{"start_line":165,"start_character":8,"end_line":165,"end_character":56},"in_reply_to":"0837164e_c27f9bb8","updated":"2025-11-25 11:38:28.000000000","message":"Done","commit_id":"a07ea0d7c14ed86bd9a46d949d14cb64f8f11d44"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"ffe5f63b028335385024bcd634f380ac8a94a00e","unresolved":true,"context_lines":[{"line_number":223,"context_line":"                           \"First audit execution should create at least \""},{"line_number":224,"context_line":"                           \"one action plan\")"},{"line_number":225,"context_line":""},{"line_number":226,"context_line":"        # Step 6: Wait for audit to reset and potentially run again"},{"line_number":227,"context_line":"        # Check that audit state returns to appropriate state for"},{"line_number":228,"context_line":"        # continuous execution"},{"line_number":229,"context_line":"        time.sleep(30)  # Wait for system to stabilize"},{"line_number":230,"context_line":""},{"line_number":231,"context_line":"        _, current_audit \u003d self.client.show_audit(audit_uuid)"}],"source_content_type":"text/x-python","patch_set":6,"id":"cfb06a06_e8d7989e","line":228,"range":{"start_line":226,"start_character":8,"end_line":228,"end_character":30},"updated":"2025-07-23 10:42:42.000000000","message":"an interesting test would be to wait for two or more actionplans are created and check that the latest one is in RECOMMENDED state while previous one(s) are in CANCELLED state (that\u0027s the expected behavior).","commit_id":"a07ea0d7c14ed86bd9a46d949d14cb64f8f11d44"},{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"4ec402da83fb35cefa90fe012c7c3ca46b1f2ad7","unresolved":false,"context_lines":[{"line_number":223,"context_line":"                           \"First audit execution should create at least \""},{"line_number":224,"context_line":"                           \"one action plan\")"},{"line_number":225,"context_line":""},{"line_number":226,"context_line":"        # Step 6: Wait for audit to reset and potentially run again"},{"line_number":227,"context_line":"        # Check that audit state returns to appropriate state for"},{"line_number":228,"context_line":"        # continuous execution"},{"line_number":229,"context_line":"        time.sleep(30)  # Wait for system to stabilize"},{"line_number":230,"context_line":""},{"line_number":231,"context_line":"        _, current_audit \u003d self.client.show_audit(audit_uuid)"}],"source_content_type":"text/x-python","patch_set":6,"id":"2b3e95db_66715ef9","line":228,"range":{"start_line":226,"start_character":8,"end_line":228,"end_character":30},"in_reply_to":"cfb06a06_e8d7989e","updated":"2025-11-25 11:38:28.000000000","message":"Done","commit_id":"a07ea0d7c14ed86bd9a46d949d14cb64f8f11d44"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"ffe5f63b028335385024bcd634f380ac8a94a00e","unresolved":true,"context_lines":[{"line_number":230,"context_line":""},{"line_number":231,"context_line":"        _, current_audit \u003d self.client.show_audit(audit_uuid)"},{"line_number":232,"context_line":"        self.assertIn(current_audit.get(\u0027state\u0027),"},{"line_number":233,"context_line":"                      (\u0027PENDING\u0027, \u0027ONGOING\u0027, \u0027SUCCEEDED\u0027),"},{"line_number":234,"context_line":"                      \"Continuous audit should be in an active state, \""},{"line_number":235,"context_line":"                      f\"got: {current_audit.get(\u0027state\u0027)}\")"},{"line_number":236,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"1b16b904_85934fac","line":233,"range":{"start_line":233,"start_character":22,"end_line":233,"end_character":57},"updated":"2025-07-23 10:42:42.000000000","message":"At this point it should be in ONGOING state, right? not pending or succeeded","commit_id":"a07ea0d7c14ed86bd9a46d949d14cb64f8f11d44"},{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"4ec402da83fb35cefa90fe012c7c3ca46b1f2ad7","unresolved":false,"context_lines":[{"line_number":230,"context_line":""},{"line_number":231,"context_line":"        _, current_audit \u003d self.client.show_audit(audit_uuid)"},{"line_number":232,"context_line":"        self.assertIn(current_audit.get(\u0027state\u0027),"},{"line_number":233,"context_line":"                      (\u0027PENDING\u0027, \u0027ONGOING\u0027, \u0027SUCCEEDED\u0027),"},{"line_number":234,"context_line":"                      \"Continuous audit should be in an active state, \""},{"line_number":235,"context_line":"                      f\"got: {current_audit.get(\u0027state\u0027)}\")"},{"line_number":236,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"d5d65697_1efe1d13","line":233,"range":{"start_line":233,"start_character":22,"end_line":233,"end_character":57},"in_reply_to":"1b16b904_85934fac","updated":"2025-11-25 11:38:28.000000000","message":"Done","commit_id":"a07ea0d7c14ed86bd9a46d949d14cb64f8f11d44"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"ffe5f63b028335385024bcd634f380ac8a94a00e","unresolved":true,"context_lines":[{"line_number":271,"context_line":"                                 \"Continuous audit should have \""},{"line_number":272,"context_line":"                                 \"next_run_time scheduled\")"},{"line_number":273,"context_line":""},{"line_number":274,"context_line":"        LOG.info(\"Continuous audit test completed successfully. \""},{"line_number":275,"context_line":"                 f\"Audit {audit_uuid} executed and created \""},{"line_number":276,"context_line":"                 f\"{len(first_action_plans)} action plan(s)\")"}],"source_content_type":"text/x-python","patch_set":6,"id":"d97a584f_36e626da","line":274,"range":{"start_line":274,"start_character":29,"end_line":274,"end_character":34},"updated":"2025-07-23 10:42:42.000000000","message":"I\u0027d add a step to cancel the audit and check it goes to CANCELLED state. A good test would be to make sure no more actionplans are created after cancelling it if possible.","commit_id":"a07ea0d7c14ed86bd9a46d949d14cb64f8f11d44"},{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"4ec402da83fb35cefa90fe012c7c3ca46b1f2ad7","unresolved":false,"context_lines":[{"line_number":271,"context_line":"                                 \"Continuous audit should have \""},{"line_number":272,"context_line":"                                 \"next_run_time scheduled\")"},{"line_number":273,"context_line":""},{"line_number":274,"context_line":"        LOG.info(\"Continuous audit test completed successfully. \""},{"line_number":275,"context_line":"                 f\"Audit {audit_uuid} executed and created \""},{"line_number":276,"context_line":"                 f\"{len(first_action_plans)} action plan(s)\")"}],"source_content_type":"text/x-python","patch_set":6,"id":"f4e3bd9d_940c3ef7","line":274,"range":{"start_line":274,"start_character":29,"end_line":274,"end_character":34},"in_reply_to":"d97a584f_36e626da","updated":"2025-11-25 11:38:28.000000000","message":"Done","commit_id":"a07ea0d7c14ed86bd9a46d949d14cb64f8f11d44"}]}
