From 2ff0af74f3b71f25242c6d42443b85b93d86ff40 Mon Sep 17 00:00:00 2001 From: Logan Cary Date: Tue, 3 Sep 2024 16:17:37 -0400 Subject: [PATCH 01/15] remove numbers from test and module names --- .../api2/{test_050_alert.py => test_alert.py} | 51 +++++-------------- 1 file changed, 13 insertions(+), 38 deletions(-) rename tests/api2/{test_050_alert.py => test_alert.py} (71%) diff --git a/tests/api2/test_050_alert.py b/tests/api2/test_alert.py similarity index 71% rename from tests/api2/test_050_alert.py rename to tests/api2/test_alert.py index 0ac59191c27ee..446766e7e2bcb 100644 --- a/tests/api2/test_050_alert.py +++ b/tests/api2/test_alert.py @@ -1,40 +1,15 @@ -#!/usr/bin/env python3 +from time import sleep import pytest -import os -import sys from pytest_dependency import depends -from time import sleep -apifolder = os.getcwd() -sys.path.append(apifolder) -from functions import GET, POST, SSH_TEST + from auto_config import password, user, pool_name +from functions import GET, POST, SSH_TEST from middlewared.test.integration.utils import call - -def test_01_get_alert_list(): - results = GET("/alert/list/") - assert results.status_code == 200, results.text - assert isinstance(results.json(), list), results.text - - -def test_02_get_alert_list_categories(): - results = GET("/alert/list_categories/") - assert results.status_code == 200, results.text - assert isinstance(results.json(), list), results.text - assert results.json(), results.json() - - -def test_03_get_alert_list_policies(): - results = GET("/alert/list_policies/") - assert results.status_code == 200, results.text - assert isinstance(results.json(), list), results.text - assert results.json(), results.json() - - @pytest.mark.dependency(name='degrade_pool') -def test_04_degrading_a_pool_to_create_an_alert(request): +def test_degrading_a_pool_to_create_an_alert(request): global gptid get_pool = GET(f"/pool/?name={pool_name}").json()[0] id_path = '/dev/disk/by-partuuid/' @@ -44,7 +19,7 @@ def test_04_degrading_a_pool_to_create_an_alert(request): assert results['result'] is True, results['output'] -def test_05_verify_the_pool_is_degraded(request): +def test_verify_the_pool_is_degraded(request): depends(request, ['degrade_pool'], scope="session") cmd = f'zpool status {pool_name} | grep {gptid}' results = SSH_TEST(cmd, user, password) @@ -53,7 +28,7 @@ def test_05_verify_the_pool_is_degraded(request): @pytest.mark.timeout(120) -def test_06_wait_for_the_alert_and_get_the_id(request): +def test_wait_for_the_alert_and_get_the_id(request): depends(request, ["degrade_pool"], scope="session") global alert_id call("alert.process_alerts") @@ -70,14 +45,14 @@ def test_06_wait_for_the_alert_and_get_the_id(request): sleep(1) -def test_08_dimiss_the_alert(request): +def test_dimiss_the_alert(request): depends(request, ["degrade_pool"], scope="session") results = POST("/alert/dismiss/", alert_id) assert results.status_code == 200, results.text assert isinstance(results.json(), type(None)), results.text -def test_09_verify_the_alert_is_dismissed(request): +def test_verify_the_alert_is_dismissed(request): depends(request, ["degrade_pool"], scope="session") results = GET("/alert/list/") assert results.status_code == 200, results.text @@ -88,14 +63,14 @@ def test_09_verify_the_alert_is_dismissed(request): break -def test_10_restore_the_alert(request): +def test_restore_the_alert(request): depends(request, ["degrade_pool"], scope="session") results = POST("/alert/restore/", alert_id) assert results.status_code == 200, results.text assert isinstance(results.json(), type(None)), results.text -def test_11_verify_the_alert_is_restored(request): +def test_verify_the_alert_is_restored(request): depends(request, ["degrade_pool"], scope="session") results = GET(f"/alert/list/?id={alert_id}") assert results.status_code == 200, results.text @@ -106,14 +81,14 @@ def test_11_verify_the_alert_is_restored(request): break -def test_12_clear_the_pool_degradation(request): +def test_clear_the_pool_degradation(request): depends(request, ["degrade_pool"], scope="session") cmd = f'zpool clear {pool_name}' results = SSH_TEST(cmd, user, password) assert results['result'] is True, results['output'] -def test_13_verify_the_pool_is_not_degraded(request): +def test_verify_the_pool_is_not_degraded(request): depends(request, ["degrade_pool"], scope="session") cmd = f'zpool status {pool_name} | grep {gptid}' results = SSH_TEST(cmd, user, password) @@ -122,7 +97,7 @@ def test_13_verify_the_pool_is_not_degraded(request): @pytest.mark.timeout(120) -def test_14_wait_for_the_alert_to_disappear(request): +def test_wait_for_the_alert_to_disappear(request): depends(request, ["degrade_pool"], scope="session") while True: if alert_id not in GET("/alert/list/").text: From 79239147e97c65b03449c828beebf01a32380f97 Mon Sep 17 00:00:00 2001 From: Logan Cary Date: Wed, 4 Sep 2024 11:48:57 -0400 Subject: [PATCH 02/15] remove rest and simplify --- tests/api2/test_alert.py | 79 ++++++++++++++-------------------------- 1 file changed, 28 insertions(+), 51 deletions(-) diff --git a/tests/api2/test_alert.py b/tests/api2/test_alert.py index 446766e7e2bcb..de5887316905f 100644 --- a/tests/api2/test_alert.py +++ b/tests/api2/test_alert.py @@ -3,28 +3,34 @@ import pytest from pytest_dependency import depends -from auto_config import password, user, pool_name -from functions import GET, POST, SSH_TEST -from middlewared.test.integration.utils import call +from auto_config import pool_name +from middlewared.test.integration.utils import call, ssh + + +def get_alert_by_id(alert_id): + results = call("alert.list") + for alert in results: + if alert['id'] == alert_id: + return alert + + +def alert_exists(alert_id): + return isinstance(get_alert_by_id(alert_id), dict) @pytest.mark.dependency(name='degrade_pool') def test_degrading_a_pool_to_create_an_alert(request): global gptid - get_pool = GET(f"/pool/?name={pool_name}").json()[0] + get_pool = call("pool.query", [["name", "=", pool_name]])[0] id_path = '/dev/disk/by-partuuid/' gptid = get_pool['topology']['data'][0]['path'].replace(id_path, '') - cmd = f'zinject -d {gptid} -A fault {pool_name}' - results = SSH_TEST(cmd, user, password) - assert results['result'] is True, results['output'] + ssh(f'zinject -d {gptid} -A fault {pool_name}') def test_verify_the_pool_is_degraded(request): depends(request, ['degrade_pool'], scope="session") - cmd = f'zpool status {pool_name} | grep {gptid}' - results = SSH_TEST(cmd, user, password) - assert results['result'] is True, results['output'] - assert 'DEGRADED' in results['output'], results['output'] + stdout = ssh(f'zpool status {pool_name} | grep {gptid}') + assert 'DEGRADED' in stdout @pytest.mark.timeout(120) @@ -33,7 +39,7 @@ def test_wait_for_the_alert_and_get_the_id(request): global alert_id call("alert.process_alerts") while True: - for line in GET("/alert/list/").json(): + for line in call("alert.list"): if ( line['source'] == 'VolumeStatus' and line['args']['volume'] == pool_name and @@ -45,62 +51,33 @@ def test_wait_for_the_alert_and_get_the_id(request): sleep(1) -def test_dimiss_the_alert(request): - depends(request, ["degrade_pool"], scope="session") - results = POST("/alert/dismiss/", alert_id) - assert results.status_code == 200, results.text - assert isinstance(results.json(), type(None)), results.text - - def test_verify_the_alert_is_dismissed(request): depends(request, ["degrade_pool"], scope="session") - results = GET("/alert/list/") - assert results.status_code == 200, results.text - assert isinstance(results.json(), list), results.text - for line in results.json(): - if line['id'] == alert_id: - assert line['dismissed'] is True, results.text - break - - -def test_restore_the_alert(request): - depends(request, ["degrade_pool"], scope="session") - results = POST("/alert/restore/", alert_id) - assert results.status_code == 200, results.text - assert isinstance(results.json(), type(None)), results.text + call("alert.dismiss", alert_id) + alert = get_alert_by_id(alert_id) + assert alert["dismissed"] is True, alert def test_verify_the_alert_is_restored(request): depends(request, ["degrade_pool"], scope="session") - results = GET(f"/alert/list/?id={alert_id}") - assert results.status_code == 200, results.text - assert isinstance(results.json(), list), results.text - for line in results.json(): - if line['id'] == alert_id: - assert line['dismissed'] is False, results.text - break + call("alert.restore", alert_id) + alert = get_alert_by_id(alert_id) + assert alert["dismissed"] is False, alert def test_clear_the_pool_degradation(request): depends(request, ["degrade_pool"], scope="session") - cmd = f'zpool clear {pool_name}' - results = SSH_TEST(cmd, user, password) - assert results['result'] is True, results['output'] + ssh(f'zpool clear {pool_name}') def test_verify_the_pool_is_not_degraded(request): depends(request, ["degrade_pool"], scope="session") - cmd = f'zpool status {pool_name} | grep {gptid}' - results = SSH_TEST(cmd, user, password) - assert results['result'] is True, results['output'] - assert 'DEGRADED' not in results['output'], results['output'] + stdout = ssh(f'zpool status {pool_name} | grep {gptid}') + assert 'DEGRADED' not in stdout @pytest.mark.timeout(120) def test_wait_for_the_alert_to_disappear(request): depends(request, ["degrade_pool"], scope="session") - while True: - if alert_id not in GET("/alert/list/").text: - assert True - break + while alert_exists(alert_id): sleep(1) From 905884b4616970e97c5f0b90dac9e2ead584648d Mon Sep 17 00:00:00 2001 From: Logan Cary Date: Wed, 4 Sep 2024 12:20:51 -0400 Subject: [PATCH 03/15] replace global variables with pytest cache --- tests/api2/test_alert.py | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/tests/api2/test_alert.py b/tests/api2/test_alert.py index de5887316905f..d38fd50e297ab 100644 --- a/tests/api2/test_alert.py +++ b/tests/api2/test_alert.py @@ -20,15 +20,16 @@ def alert_exists(alert_id): @pytest.mark.dependency(name='degrade_pool') def test_degrading_a_pool_to_create_an_alert(request): - global gptid get_pool = call("pool.query", [["name", "=", pool_name]])[0] id_path = '/dev/disk/by-partuuid/' gptid = get_pool['topology']['data'][0]['path'].replace(id_path, '') ssh(f'zinject -d {gptid} -A fault {pool_name}') + request.config.cache.set("alert/gptid", gptid) def test_verify_the_pool_is_degraded(request): depends(request, ['degrade_pool'], scope="session") + gptid = request.config.cache.get("alert/gptid", "Not a valid id") stdout = ssh(f'zpool status {pool_name} | grep {gptid}') assert 'DEGRADED' in stdout @@ -36,7 +37,6 @@ def test_verify_the_pool_is_degraded(request): @pytest.mark.timeout(120) def test_wait_for_the_alert_and_get_the_id(request): depends(request, ["degrade_pool"], scope="session") - global alert_id call("alert.process_alerts") while True: for line in call("alert.list"): @@ -45,14 +45,14 @@ def test_wait_for_the_alert_and_get_the_id(request): line['args']['volume'] == pool_name and line['args']['state'] == 'DEGRADED' ): - alert_id = line['id'] + request.config.cache.set("alert/alert_id", line['id']) return - sleep(1) def test_verify_the_alert_is_dismissed(request): depends(request, ["degrade_pool"], scope="session") + alert_id = request.config.cache.get("alert/alert_id", "Not a valid id") call("alert.dismiss", alert_id) alert = get_alert_by_id(alert_id) assert alert["dismissed"] is True, alert @@ -60,6 +60,7 @@ def test_verify_the_alert_is_dismissed(request): def test_verify_the_alert_is_restored(request): depends(request, ["degrade_pool"], scope="session") + alert_id = request.config.cache.get("alert/alert_id", "Not a valid id") call("alert.restore", alert_id) alert = get_alert_by_id(alert_id) assert alert["dismissed"] is False, alert @@ -72,6 +73,7 @@ def test_clear_the_pool_degradation(request): def test_verify_the_pool_is_not_degraded(request): depends(request, ["degrade_pool"], scope="session") + gptid = request.config.cache.get("alert/gptid", "Not a valid id") stdout = ssh(f'zpool status {pool_name} | grep {gptid}') assert 'DEGRADED' not in stdout @@ -79,5 +81,6 @@ def test_verify_the_pool_is_not_degraded(request): @pytest.mark.timeout(120) def test_wait_for_the_alert_to_disappear(request): depends(request, ["degrade_pool"], scope="session") + alert_id = request.config.cache.get("alert/alert_id", "Not a valid id") while alert_exists(alert_id): sleep(1) From 0bcaf8212fcd42a593da36d0df00576cd463f68e Mon Sep 17 00:00:00 2001 From: Logan Cary Date: Wed, 4 Sep 2024 14:30:15 -0400 Subject: [PATCH 04/15] address @yocalebo --- tests/api2/test_alert.py | 25 ++++++++++--------------- 1 file changed, 10 insertions(+), 15 deletions(-) diff --git a/tests/api2/test_alert.py b/tests/api2/test_alert.py index d38fd50e297ab..f327ae2460565 100644 --- a/tests/api2/test_alert.py +++ b/tests/api2/test_alert.py @@ -7,22 +7,17 @@ from middlewared.test.integration.utils import call, ssh -def get_alert_by_id(alert_id): - results = call("alert.list") - for alert in results: - if alert['id'] == alert_id: - return alert +ID_PATH = '/dev/disk/by-partuuid/' -def alert_exists(alert_id): - return isinstance(get_alert_by_id(alert_id), dict) +def get_alert_by_id(alert_id): + return next(filter(lambda alert: alert['id'] == alert_id, call("alert.list"))) @pytest.mark.dependency(name='degrade_pool') def test_degrading_a_pool_to_create_an_alert(request): - get_pool = call("pool.query", [["name", "=", pool_name]])[0] - id_path = '/dev/disk/by-partuuid/' - gptid = get_pool['topology']['data'][0]['path'].replace(id_path, '') + get_pool = call("pool.query", [["name", "=", pool_name]], {"get": True}) + gptid = get_pool['topology']['data'][0]['path'].replace(ID_PATH, '') ssh(f'zinject -d {gptid} -A fault {pool_name}') request.config.cache.set("alert/gptid", gptid) @@ -30,8 +25,8 @@ def test_degrading_a_pool_to_create_an_alert(request): def test_verify_the_pool_is_degraded(request): depends(request, ['degrade_pool'], scope="session") gptid = request.config.cache.get("alert/gptid", "Not a valid id") - stdout = ssh(f'zpool status {pool_name} | grep {gptid}') - assert 'DEGRADED' in stdout + status = call("zpool.status", {"name": pool_name})[pool_name][ID_PATH + gptid]["disk_status"] + assert status == 'DEGRADED' @pytest.mark.timeout(120) @@ -74,13 +69,13 @@ def test_clear_the_pool_degradation(request): def test_verify_the_pool_is_not_degraded(request): depends(request, ["degrade_pool"], scope="session") gptid = request.config.cache.get("alert/gptid", "Not a valid id") - stdout = ssh(f'zpool status {pool_name} | grep {gptid}') - assert 'DEGRADED' not in stdout + status = call("zpool.status", {"name": pool_name})[pool_name][ID_PATH + gptid]["disk_status"] + assert status != 'DEGRADED' @pytest.mark.timeout(120) def test_wait_for_the_alert_to_disappear(request): depends(request, ["degrade_pool"], scope="session") alert_id = request.config.cache.get("alert/alert_id", "Not a valid id") - while alert_exists(alert_id): + while get_alert_by_id(alert_id) is not None: sleep(1) From 2e5af121502bd76454cba55766f4cffdddbf86cc Mon Sep 17 00:00:00 2001 From: Logan Cary Date: Wed, 4 Sep 2024 14:31:43 -0400 Subject: [PATCH 05/15] change quotes --- tests/api2/test_alert.py | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/tests/api2/test_alert.py b/tests/api2/test_alert.py index f327ae2460565..422480eee3d01 100644 --- a/tests/api2/test_alert.py +++ b/tests/api2/test_alert.py @@ -7,26 +7,26 @@ from middlewared.test.integration.utils import call, ssh -ID_PATH = '/dev/disk/by-partuuid/' +ID_PATH = "/dev/disk/by-partuuid/" def get_alert_by_id(alert_id): - return next(filter(lambda alert: alert['id'] == alert_id, call("alert.list"))) + return next(filter(lambda alert: alert["id"] == alert_id, call("alert.list"))) -@pytest.mark.dependency(name='degrade_pool') +@pytest.mark.dependency(name="degrade_pool") def test_degrading_a_pool_to_create_an_alert(request): get_pool = call("pool.query", [["name", "=", pool_name]], {"get": True}) - gptid = get_pool['topology']['data'][0]['path'].replace(ID_PATH, '') - ssh(f'zinject -d {gptid} -A fault {pool_name}') + gptid = get_pool["topology"]["data"][0]["path"].replace(ID_PATH, "") + ssh(f"zinject -d {gptid} -A fault {pool_name}") request.config.cache.set("alert/gptid", gptid) def test_verify_the_pool_is_degraded(request): - depends(request, ['degrade_pool'], scope="session") + depends(request, ["degrade_pool"], scope="session") gptid = request.config.cache.get("alert/gptid", "Not a valid id") status = call("zpool.status", {"name": pool_name})[pool_name][ID_PATH + gptid]["disk_status"] - assert status == 'DEGRADED' + assert status == "DEGRADED" @pytest.mark.timeout(120) @@ -36,11 +36,11 @@ def test_wait_for_the_alert_and_get_the_id(request): while True: for line in call("alert.list"): if ( - line['source'] == 'VolumeStatus' and - line['args']['volume'] == pool_name and - line['args']['state'] == 'DEGRADED' + line["source"] == "VolumeStatus" and + line["args"]["volume"] == pool_name and + line["args"]["state"] == "DEGRADED" ): - request.config.cache.set("alert/alert_id", line['id']) + request.config.cache.set("alert/alert_id", line["id"]) return sleep(1) @@ -63,14 +63,14 @@ def test_verify_the_alert_is_restored(request): def test_clear_the_pool_degradation(request): depends(request, ["degrade_pool"], scope="session") - ssh(f'zpool clear {pool_name}') + ssh(f"zpool clear {pool_name}") def test_verify_the_pool_is_not_degraded(request): depends(request, ["degrade_pool"], scope="session") gptid = request.config.cache.get("alert/gptid", "Not a valid id") status = call("zpool.status", {"name": pool_name})[pool_name][ID_PATH + gptid]["disk_status"] - assert status != 'DEGRADED' + assert status != "DEGRADED" @pytest.mark.timeout(120) From 774348090612acdca4bf32541654acc697543a7f Mon Sep 17 00:00:00 2001 From: Logan Cary Date: Wed, 4 Sep 2024 14:54:45 -0400 Subject: [PATCH 06/15] fix `get_alert_by_id` and account for cache dependency --- tests/api2/test_alert.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/tests/api2/test_alert.py b/tests/api2/test_alert.py index 422480eee3d01..766919f663c03 100644 --- a/tests/api2/test_alert.py +++ b/tests/api2/test_alert.py @@ -11,7 +11,7 @@ def get_alert_by_id(alert_id): - return next(filter(lambda alert: alert["id"] == alert_id, call("alert.list"))) + return next(filter(lambda alert: alert["id"] == alert_id, call("alert.list")), None) @pytest.mark.dependency(name="degrade_pool") @@ -30,6 +30,7 @@ def test_verify_the_pool_is_degraded(request): @pytest.mark.timeout(120) +@pytest.mark.dependency(name="set_alert_id") def test_wait_for_the_alert_and_get_the_id(request): depends(request, ["degrade_pool"], scope="session") call("alert.process_alerts") @@ -46,7 +47,7 @@ def test_wait_for_the_alert_and_get_the_id(request): def test_verify_the_alert_is_dismissed(request): - depends(request, ["degrade_pool"], scope="session") + depends(request, ["degrade_pool", "set_alert_id"], scope="session") alert_id = request.config.cache.get("alert/alert_id", "Not a valid id") call("alert.dismiss", alert_id) alert = get_alert_by_id(alert_id) @@ -54,7 +55,7 @@ def test_verify_the_alert_is_dismissed(request): def test_verify_the_alert_is_restored(request): - depends(request, ["degrade_pool"], scope="session") + depends(request, ["degrade_pool", "set_alert_id"], scope="session") alert_id = request.config.cache.get("alert/alert_id", "Not a valid id") call("alert.restore", alert_id) alert = get_alert_by_id(alert_id) @@ -75,7 +76,7 @@ def test_verify_the_pool_is_not_degraded(request): @pytest.mark.timeout(120) def test_wait_for_the_alert_to_disappear(request): - depends(request, ["degrade_pool"], scope="session") + depends(request, ["degrade_pool", "set_alert_id"], scope="session") alert_id = request.config.cache.get("alert/alert_id", "Not a valid id") while get_alert_by_id(alert_id) is not None: sleep(1) From 8c43d816fbfc2b77e9fa27fdf001b72e0515163a Mon Sep 17 00:00:00 2001 From: Logan Cary Date: Thu, 5 Sep 2024 09:42:26 -0400 Subject: [PATCH 07/15] use `alert.run_source` --- tests/api2/test_alert.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/tests/api2/test_alert.py b/tests/api2/test_alert.py index 766919f663c03..22639baebedf0 100644 --- a/tests/api2/test_alert.py +++ b/tests/api2/test_alert.py @@ -35,13 +35,12 @@ def test_wait_for_the_alert_and_get_the_id(request): depends(request, ["degrade_pool"], scope="session") call("alert.process_alerts") while True: - for line in call("alert.list"): + for alert in call("alert.run_source", "VolumeStatus"): if ( - line["source"] == "VolumeStatus" and - line["args"]["volume"] == pool_name and - line["args"]["state"] == "DEGRADED" + alert["args"]["volume"] == pool_name and + alert["args"]["state"] == "DEGRADED" ): - request.config.cache.set("alert/alert_id", line["id"]) + request.config.cache.set("alert/alert_id", alert["id"]) return sleep(1) From 4212168b2e4a07d021b8d9f10b74b6756c17a3c3 Mon Sep 17 00:00:00 2001 From: Logan Cary Date: Fri, 6 Sep 2024 15:22:48 -0400 Subject: [PATCH 08/15] use fixtures --- tests/api2/test_alert.py | 49 +++++++++++++--------------------------- 1 file changed, 16 insertions(+), 33 deletions(-) diff --git a/tests/api2/test_alert.py b/tests/api2/test_alert.py index 22639baebedf0..aea15b431ec57 100644 --- a/tests/api2/test_alert.py +++ b/tests/api2/test_alert.py @@ -1,7 +1,6 @@ from time import sleep import pytest -from pytest_dependency import depends from auto_config import pool_name from middlewared.test.integration.utils import call, ssh @@ -14,25 +13,17 @@ def get_alert_by_id(alert_id): return next(filter(lambda alert: alert["id"] == alert_id, call("alert.list")), None) -@pytest.mark.dependency(name="degrade_pool") -def test_degrading_a_pool_to_create_an_alert(request): +@pytest.fixture(scope="module", autouse=True) +def degraded_pool_gptid(): get_pool = call("pool.query", [["name", "=", pool_name]], {"get": True}) gptid = get_pool["topology"]["data"][0]["path"].replace(ID_PATH, "") ssh(f"zinject -d {gptid} -A fault {pool_name}") - request.config.cache.set("alert/gptid", gptid) - - -def test_verify_the_pool_is_degraded(request): - depends(request, ["degrade_pool"], scope="session") - gptid = request.config.cache.get("alert/gptid", "Not a valid id") - status = call("zpool.status", {"name": pool_name})[pool_name][ID_PATH + gptid]["disk_status"] - assert status == "DEGRADED" + return gptid @pytest.mark.timeout(120) -@pytest.mark.dependency(name="set_alert_id") -def test_wait_for_the_alert_and_get_the_id(request): - depends(request, ["degrade_pool"], scope="session") +@pytest.fixture(scope="module") +def alert_id(degraded_pool_gptid): call("alert.process_alerts") while True: for alert in call("alert.run_source", "VolumeStatus"): @@ -40,42 +31,34 @@ def test_wait_for_the_alert_and_get_the_id(request): alert["args"]["volume"] == pool_name and alert["args"]["state"] == "DEGRADED" ): - request.config.cache.set("alert/alert_id", alert["id"]) - return + return alert["id"] sleep(1) -def test_verify_the_alert_is_dismissed(request): - depends(request, ["degrade_pool", "set_alert_id"], scope="session") - alert_id = request.config.cache.get("alert/alert_id", "Not a valid id") +def test_verify_the_pool_is_degraded(degraded_pool_gptid): + status = call("zpool.status", {"name": pool_name})[pool_name][ID_PATH + degraded_pool_gptid]["disk_status"] + assert status == "DEGRADED" + + +def test_dismiss_alert(alert_id): call("alert.dismiss", alert_id) alert = get_alert_by_id(alert_id) assert alert["dismissed"] is True, alert -def test_verify_the_alert_is_restored(request): - depends(request, ["degrade_pool", "set_alert_id"], scope="session") - alert_id = request.config.cache.get("alert/alert_id", "Not a valid id") +def test_restore_alert(alert_id): call("alert.restore", alert_id) alert = get_alert_by_id(alert_id) assert alert["dismissed"] is False, alert -def test_clear_the_pool_degradation(request): - depends(request, ["degrade_pool"], scope="session") +def test_clear_the_pool_degradation(degraded_pool_gptid): ssh(f"zpool clear {pool_name}") - - -def test_verify_the_pool_is_not_degraded(request): - depends(request, ["degrade_pool"], scope="session") - gptid = request.config.cache.get("alert/gptid", "Not a valid id") - status = call("zpool.status", {"name": pool_name})[pool_name][ID_PATH + gptid]["disk_status"] + status = call("zpool.status", {"name": pool_name})[pool_name][ID_PATH + degraded_pool_gptid]["disk_status"] assert status != "DEGRADED" @pytest.mark.timeout(120) -def test_wait_for_the_alert_to_disappear(request): - depends(request, ["degrade_pool", "set_alert_id"], scope="session") - alert_id = request.config.cache.get("alert/alert_id", "Not a valid id") +def test_wait_for_the_alert_to_disappear(alert_id): while get_alert_by_id(alert_id) is not None: sleep(1) From 898e4ca8d20fef4b7b3463067f08a5ea91ff86a3 Mon Sep 17 00:00:00 2001 From: Logan Cary Date: Fri, 6 Sep 2024 16:47:04 -0400 Subject: [PATCH 09/15] fix indexing issues --- tests/api2/test_alert.py | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/tests/api2/test_alert.py b/tests/api2/test_alert.py index aea15b431ec57..afa25406d56fa 100644 --- a/tests/api2/test_alert.py +++ b/tests/api2/test_alert.py @@ -26,8 +26,9 @@ def degraded_pool_gptid(): def alert_id(degraded_pool_gptid): call("alert.process_alerts") while True: - for alert in call("alert.run_source", "VolumeStatus"): + for alert in call("alert.list"): if ( + alert["source"] == "VolumeStatus" and alert["args"]["volume"] == pool_name and alert["args"]["state"] == "DEGRADED" ): @@ -36,8 +37,9 @@ def alert_id(degraded_pool_gptid): def test_verify_the_pool_is_degraded(degraded_pool_gptid): - status = call("zpool.status", {"name": pool_name})[pool_name][ID_PATH + degraded_pool_gptid]["disk_status"] - assert status == "DEGRADED" + status = call("zpool.status", {"name": pool_name}) + disk_status = status[pool_name]["data"][ID_PATH + degraded_pool_gptid]["disk_status"] + assert disk_status == "DEGRADED" def test_dismiss_alert(alert_id): @@ -54,8 +56,9 @@ def test_restore_alert(alert_id): def test_clear_the_pool_degradation(degraded_pool_gptid): ssh(f"zpool clear {pool_name}") - status = call("zpool.status", {"name": pool_name})[pool_name][ID_PATH + degraded_pool_gptid]["disk_status"] - assert status != "DEGRADED" + status = call("zpool.status", {"name": pool_name}) + disk_status = status[pool_name]["data"][ID_PATH + degraded_pool_gptid]["disk_status"] + assert disk_status != "DEGRADED" @pytest.mark.timeout(120) From 249eadc524dc681467a9063914440535bb04ca8e Mon Sep 17 00:00:00 2001 From: Logan Cary Date: Mon, 9 Sep 2024 10:40:12 -0400 Subject: [PATCH 10/15] can't mark a fixture --- tests/api2/test_alert.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/api2/test_alert.py b/tests/api2/test_alert.py index afa25406d56fa..bbe84df926943 100644 --- a/tests/api2/test_alert.py +++ b/tests/api2/test_alert.py @@ -21,7 +21,6 @@ def degraded_pool_gptid(): return gptid -@pytest.mark.timeout(120) @pytest.fixture(scope="module") def alert_id(degraded_pool_gptid): call("alert.process_alerts") @@ -42,6 +41,7 @@ def test_verify_the_pool_is_degraded(degraded_pool_gptid): assert disk_status == "DEGRADED" +@pytest.mark.timeout(120) def test_dismiss_alert(alert_id): call("alert.dismiss", alert_id) alert = get_alert_by_id(alert_id) From 6944cf9a9d5f885235da2a6f6b3737f24991868c Mon Sep 17 00:00:00 2001 From: Logan Cary Date: Mon, 9 Sep 2024 12:14:41 -0400 Subject: [PATCH 11/15] fixture timeout --- tests/api2/test_alert.py | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/tests/api2/test_alert.py b/tests/api2/test_alert.py index bbe84df926943..ef2f3ea5ffa7d 100644 --- a/tests/api2/test_alert.py +++ b/tests/api2/test_alert.py @@ -13,6 +13,18 @@ def get_alert_by_id(alert_id): return next(filter(lambda alert: alert["id"] == alert_id, call("alert.list")), None) +def wait_for_alert(timeout=120): + for _ in range(timeout): + for alert in call("alert.list"): + if ( + alert["source"] == "VolumeStatus" and + alert["args"]["volume"] == pool_name and + alert["args"]["state"] == "DEGRADED" + ): + return alert["id"] + sleep(1) + + @pytest.fixture(scope="module", autouse=True) def degraded_pool_gptid(): get_pool = call("pool.query", [["name", "=", pool_name]], {"get": True}) @@ -24,15 +36,10 @@ def degraded_pool_gptid(): @pytest.fixture(scope="module") def alert_id(degraded_pool_gptid): call("alert.process_alerts") - while True: - for alert in call("alert.list"): - if ( - alert["source"] == "VolumeStatus" and - alert["args"]["volume"] == pool_name and - alert["args"]["state"] == "DEGRADED" - ): - return alert["id"] - sleep(1) + result = wait_for_alert() + if result is None: + pytest.fail("Timed out while waiting for alert.") + return result def test_verify_the_pool_is_degraded(degraded_pool_gptid): @@ -41,7 +48,6 @@ def test_verify_the_pool_is_degraded(degraded_pool_gptid): assert disk_status == "DEGRADED" -@pytest.mark.timeout(120) def test_dismiss_alert(alert_id): call("alert.dismiss", alert_id) alert = get_alert_by_id(alert_id) From 8b7ffe067919cf654484f30851fcf0fbc13bf175 Mon Sep 17 00:00:00 2001 From: Logan Cary Date: Mon, 9 Sep 2024 12:42:55 -0400 Subject: [PATCH 12/15] allow parametrization --- tests/api2/test_alert.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/tests/api2/test_alert.py b/tests/api2/test_alert.py index ef2f3ea5ffa7d..77b5c290e9fd3 100644 --- a/tests/api2/test_alert.py +++ b/tests/api2/test_alert.py @@ -34,11 +34,12 @@ def degraded_pool_gptid(): @pytest.fixture(scope="module") -def alert_id(degraded_pool_gptid): +def alert_id(request, degraded_pool_gptid): call("alert.process_alerts") - result = wait_for_alert() + timeout = request.param if hasattr(request, "param") else 120 + result = wait_for_alert(timeout) if result is None: - pytest.fail("Timed out while waiting for alert.") + pytest.fail(f"Timed out while waiting {timeout} seconds for alert.") return result From ca12485b42bf8329b267837348718aca3b3376c5 Mon Sep 17 00:00:00 2001 From: Logan Cary Date: Tue, 10 Sep 2024 09:04:33 -0400 Subject: [PATCH 13/15] process alerts before waiting for alert to disappear --- tests/api2/test_alert.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/api2/test_alert.py b/tests/api2/test_alert.py index 77b5c290e9fd3..77cdde1178ca5 100644 --- a/tests/api2/test_alert.py +++ b/tests/api2/test_alert.py @@ -70,5 +70,6 @@ def test_clear_the_pool_degradation(degraded_pool_gptid): @pytest.mark.timeout(120) def test_wait_for_the_alert_to_disappear(alert_id): + call("alert.process_alerts") while get_alert_by_id(alert_id) is not None: sleep(1) From 0a04554282e38e9ef09bb7cb72e726642f9f04d1 Mon Sep 17 00:00:00 2001 From: Logan Cary Date: Tue, 10 Sep 2024 14:17:12 -0400 Subject: [PATCH 14/15] Revert "allow parametrization" This reverts commit 8b7ffe067919cf654484f30851fcf0fbc13bf175. --- tests/api2/test_alert.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/tests/api2/test_alert.py b/tests/api2/test_alert.py index 77cdde1178ca5..ad8f5c1d9da46 100644 --- a/tests/api2/test_alert.py +++ b/tests/api2/test_alert.py @@ -34,12 +34,11 @@ def degraded_pool_gptid(): @pytest.fixture(scope="module") -def alert_id(request, degraded_pool_gptid): +def alert_id(degraded_pool_gptid): call("alert.process_alerts") - timeout = request.param if hasattr(request, "param") else 120 - result = wait_for_alert(timeout) + result = wait_for_alert() if result is None: - pytest.fail(f"Timed out while waiting {timeout} seconds for alert.") + pytest.fail("Timed out while waiting for alert.") return result From b1bc9e52838edc6f988bf526a30dbef195ed2645 Mon Sep 17 00:00:00 2001 From: Logan Cary Date: Tue, 10 Sep 2024 14:19:19 -0400 Subject: [PATCH 15/15] remove `autouse` --- tests/api2/test_alert.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/api2/test_alert.py b/tests/api2/test_alert.py index ad8f5c1d9da46..8a79d39b4004e 100644 --- a/tests/api2/test_alert.py +++ b/tests/api2/test_alert.py @@ -25,7 +25,7 @@ def wait_for_alert(timeout=120): sleep(1) -@pytest.fixture(scope="module", autouse=True) +@pytest.fixture(scope="module") def degraded_pool_gptid(): get_pool = call("pool.query", [["name", "=", pool_name]], {"get": True}) gptid = get_pool["topology"]["data"][0]["path"].replace(ID_PATH, "")