diff --git a/kubernetes/tests/integration/integration/high_availability/test_self_healing_setup_crash.py b/kubernetes/tests/integration/integration/high_availability/test_self_healing_setup_crash.py index 78122f1c7..7bcf775fb 100644 --- a/kubernetes/tests/integration/integration/high_availability/test_self_healing_setup_crash.py +++ b/kubernetes/tests/integration/integration/high_availability/test_self_healing_setup_crash.py @@ -14,6 +14,7 @@ load_mysql_test_data, update_interval, wait_for_apps_status, + wait_for_unit_status, ) MYSQL_APP_NAME = "mysql-k8s" @@ -30,6 +31,7 @@ def test_deploy_single_unit_cluster(juju: Juju, charm: str) -> None: config={"profile": "testing"}, resources={"mysql-image": CHARM_METADATA["resources"]["mysql-image"]["upstream-source"]}, num_units=1, + trust=True, ) logging.info("Wait for applications to become active") @@ -51,12 +53,21 @@ def test_crash_during_cluster_setup(juju: Juju, charm: str) -> None: """ mysql_primary = get_mysql_primary_unit(juju, MYSQL_APP_NAME) + # NOTE: This is prone to race conditions: + # if the units clear the "waiting" phase too quickly, + # this status function will never activate logging.info("Scaling to 3 units") juju.add_unit(MYSQL_APP_NAME, num_units=2) juju.wait( - ready=wait_for_apps_status(jubilant.any_waiting, MYSQL_APP_NAME), + ready=lambda status: any(( + *( + wait_for_unit_status(MYSQL_APP_NAME, unit_name, "waiting")(status) + for unit_name in status.get_units(MYSQL_APP_NAME) + ), + )), error=jubilant.any_blocked, timeout=20 * MINUTE_SECS, + successes=1, ) logging.info("Deleting pod") diff --git a/kubernetes/tests/integration/integration/roles/test_database_dba_role.py b/kubernetes/tests/integration/integration/roles/test_database_dba_role.py index 15221e2a8..2125d7796 100644 --- a/kubernetes/tests/integration/integration/roles/test_database_dba_role.py +++ b/kubernetes/tests/integration/integration/roles/test_database_dba_role.py @@ -52,11 +52,11 @@ def test_build_and_deploy(juju: Juju, charm) -> None: juju.wait( ready=lambda status: all(( *( - wait_for_unit_status(f"{INTEGRATOR_APP_NAME}1", unit_name, "blocked") + wait_for_unit_status(f"{INTEGRATOR_APP_NAME}1", unit_name, "blocked")(status) for unit_name in status.get_units(f"{INTEGRATOR_APP_NAME}1") ), *( - wait_for_unit_status(f"{INTEGRATOR_APP_NAME}2", unit_name, "blocked") + wait_for_unit_status(f"{INTEGRATOR_APP_NAME}2", unit_name, "blocked")(status) for unit_name in status.get_units(f"{INTEGRATOR_APP_NAME}2") ), )), diff --git a/kubernetes/tests/integration/integration/roles/test_instance_dba_role.py b/kubernetes/tests/integration/integration/roles/test_instance_dba_role.py index 84c84c10e..1ae810751 100644 --- a/kubernetes/tests/integration/integration/roles/test_instance_dba_role.py +++ b/kubernetes/tests/integration/integration/roles/test_instance_dba_role.py @@ -43,7 +43,7 @@ def test_build_and_deploy(juju: Juju, charm) -> None: juju.wait( ready=lambda status: all(( *( - wait_for_unit_status(INTEGRATOR_APP_NAME, unit_name, "blocked") + wait_for_unit_status(INTEGRATOR_APP_NAME, unit_name, "blocked")(status) for unit_name in status.get_units(INTEGRATOR_APP_NAME) ), )), diff --git a/kubernetes/tests/integration/integration/roles/test_instance_roles.py b/kubernetes/tests/integration/integration/roles/test_instance_roles.py index 20ae1f6cb..dfdcf4c1b 100644 --- a/kubernetes/tests/integration/integration/roles/test_instance_roles.py +++ b/kubernetes/tests/integration/integration/roles/test_instance_roles.py @@ -53,11 +53,11 @@ def test_build_and_deploy(juju: Juju, charm) -> None: juju.wait( ready=lambda status: all(( *( - wait_for_unit_status(f"{INTEGRATOR_APP_NAME}1", unit_name, "blocked") + wait_for_unit_status(f"{INTEGRATOR_APP_NAME}1", unit_name, "blocked")(status) for unit_name in status.get_units(f"{INTEGRATOR_APP_NAME}1") ), *( - wait_for_unit_status(f"{INTEGRATOR_APP_NAME}2", unit_name, "blocked") + wait_for_unit_status(f"{INTEGRATOR_APP_NAME}2", unit_name, "blocked")(status) for unit_name in status.get_units(f"{INTEGRATOR_APP_NAME}2") ), )), @@ -142,7 +142,7 @@ def test_charmed_read_role(juju: Juju): # wait for relation to be fully removed before adding it again in the following test jubilant.all_agents_idle(status, f"{INTEGRATOR_APP_NAME}1"), *( - wait_for_unit_status(f"{INTEGRATOR_APP_NAME}1", unit_name, "blocked") + wait_for_unit_status(f"{INTEGRATOR_APP_NAME}1", unit_name, "blocked")(status) for unit_name in status.get_units(f"{INTEGRATOR_APP_NAME}1") ), )), @@ -249,11 +249,11 @@ def test_charmed_dml_role(juju: Juju): juju.wait( ready=lambda status: all(( *( - wait_for_unit_status(f"{INTEGRATOR_APP_NAME}1", unit_name, "blocked") + wait_for_unit_status(f"{INTEGRATOR_APP_NAME}1", unit_name, "blocked")(status) for unit_name in status.get_units(f"{INTEGRATOR_APP_NAME}1") ), *( - wait_for_unit_status(f"{INTEGRATOR_APP_NAME}2", unit_name, "blocked") + wait_for_unit_status(f"{INTEGRATOR_APP_NAME}2", unit_name, "blocked")(status) for unit_name in status.get_units(f"{INTEGRATOR_APP_NAME}2") ), )),