From 71ac4cc0c7eb930cc304cda04e4464ee5d56b792 Mon Sep 17 00:00:00 2001 From: Carl Csaposs Date: Thu, 24 Jul 2025 14:44:24 +0200 Subject: [PATCH 01/12] Add s390x integration tests --- .github/workflows/integration_test.yaml | 11 +++++++-- spread.yaml | 9 ++++++- tests/integration/markers.py | 3 +++ tests/integration/test_architecture.py | 32 ++++++++++++++++++++++++- 4 files changed, 51 insertions(+), 4 deletions(-) diff --git a/.github/workflows/integration_test.yaml b/.github/workflows/integration_test.yaml index 67f554f3f..84d2206e5 100644 --- a/.github/workflows/integration_test.yaml +++ b/.github/workflows/integration_test.yaml @@ -42,7 +42,9 @@ jobs: _, runner, task, variant = job.split(":") # Example: "test_charm.py" task = task.removeprefix("tests/spread/") - if runner.endswith("-arm"): + if "s390x" in runner: + architecture = "s390x" + elif runner.endswith("-arm"): architecture = "arm64" else: architecture = "amd64" @@ -86,8 +88,9 @@ jobs: runs-on: ${{ matrix.job.runner }} timeout-minutes: 217 # Sum of steps `timeout-minutes` + 5 steps: - - name: Free up disk space + - name: (GitHub hosted) Free up disk space timeout-minutes: 1 + if: ${{ !contains(matrix.job.runner, 'self-hosted') }} run: | printf '\nDisk usage before cleanup\n' df --human-readable @@ -95,6 +98,10 @@ jobs: rm -r /opt/hostedtoolcache/ printf '\nDisk usage after cleanup\n' df --human-readable + - name: (IS hosted) Disk usage + timeout-minutes: 1 + if: ${{ contains(matrix.job.runner, 'self-hosted') }} + run: df --human-readable - name: Checkout timeout-minutes: 3 uses: actions/checkout@v4 diff --git a/spread.yaml b/spread.yaml index 81fe5689e..c0b25878f 100644 --- a/spread.yaml +++ b/spread.yaml @@ -97,6 +97,13 @@ backends: username: runner variants: - -juju29_ubuntu22 + - self-hosted-linux-s390x-noble-medium: + username: ubuntu + environment: + # pkg-config needed to build cryptography to install poetry + CONCIERGE_EXTRA_DEBS: pipx,pkg-config + variants: + - -juju29_ubuntu22 suites: tests/spread/: @@ -116,7 +123,7 @@ prepare: | cd "$SPREAD_PATH" snap install --classic concierge - # Install charmcraft & pipx (on lxd-vm backend) + # Install charmcraft & pipx on lxd-vm backend and install pipx on IS-hosted runners concierge prepare --trace pipx install tox poetry diff --git a/tests/integration/markers.py b/tests/integration/markers.py index 2b73cb730..de8b361f6 100644 --- a/tests/integration/markers.py +++ b/tests/integration/markers.py @@ -11,3 +11,6 @@ arm64_only = pytest.mark.skipif( architecture.architecture != "arm64", reason="Requires arm64 architecture" ) +s390x_only = pytest.mark.skipif( + architecture.architecture != "s390x", reason="Requires s390x architecture" +) diff --git a/tests/integration/test_architecture.py b/tests/integration/test_architecture.py index 9440c7af7..d9a2944e3 100644 --- a/tests/integration/test_architecture.py +++ b/tests/integration/test_architecture.py @@ -81,4 +81,34 @@ async def test_amd_charm_on_arm_host(ops_test: OpsTest, charm, series) -> None: ) -# TODO: add s390x test +@markers.s390x_only +async def test_amd_charm_on_s390x_host(ops_test: OpsTest, charm, series) -> None: + """Tries deploying an amd64 charm on s390x host.""" + charm = charm.replace("s390x", "amd64") + + await asyncio.gather( + ops_test.model.deploy( + charm, + application_name=MYSQL_ROUTER_APP_NAME, + num_units=0, + series=series, + ), + ops_test.model.deploy( + MYSQL_TEST_APP_NAME, + application_name=MYSQL_TEST_APP_NAME, + num_units=1, + channel="latest/edge", + series=series, + ), + ) + + await ops_test.model.relate( + f"{MYSQL_ROUTER_APP_NAME}:database", + f"{MYSQL_TEST_APP_NAME}:database", + ) + + await ops_test.model.wait_for_idle( + apps=[MYSQL_ROUTER_APP_NAME], + status="error", + raise_on_error=False, + ) From 9c262bc3f1b9fd685c4e1a7a379e3d149eaf2714 Mon Sep 17 00:00:00 2001 From: Carl Csaposs Date: Fri, 25 Jul 2025 11:13:12 +0200 Subject: [PATCH 02/12] Install concierge with go until https://github.com/canonical/concierge/pull/81 released --- spread.yaml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/spread.yaml b/spread.yaml index c0b25878f..7b4584e62 100644 --- a/spread.yaml +++ b/spread.yaml @@ -121,10 +121,11 @@ prepare: | snap refresh --hold chown -R root:root "$SPREAD_PATH" cd "$SPREAD_PATH" - snap install --classic concierge + # Install via snap after https://github.com/canonical/concierge/pull/81 released + go install github.com/canonical/concierge@latest # Install charmcraft & pipx on lxd-vm backend and install pipx on IS-hosted runners - concierge prepare --trace + ~/go/bin/concierge prepare --trace pipx install tox poetry prepare-each: | @@ -136,7 +137,7 @@ prepare-each: | poetry add --lock --group integration juju@^2 fi # `concierge prepare` needs to be run for each spread job in case Juju version changed - concierge prepare --trace + ~/go/bin/concierge prepare --trace # Unable to set constraint on all models because of Juju bug: # https://bugs.launchpad.net/juju/+bug/2065050 From d575c09f93b150c4b3f48a41c1e9bd0a2162a1fd Mon Sep 17 00:00:00 2001 From: Carl Csaposs Date: Fri, 25 Jul 2025 14:36:52 +0200 Subject: [PATCH 03/12] Temp switch from ps7 to ps6 s390x runners ps7 runners currently unstable --- spread.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spread.yaml b/spread.yaml index 7b4584e62..7c45d87ae 100644 --- a/spread.yaml +++ b/spread.yaml @@ -97,7 +97,7 @@ backends: username: runner variants: - -juju29_ubuntu22 - - self-hosted-linux-s390x-noble-medium: + - self-hosted-linux-s390x-noble-edge: username: ubuntu environment: # pkg-config needed to build cryptography to install poetry From 17ae51141ba82006531bff13d812c53691fdd592 Mon Sep 17 00:00:00 2001 From: Carl Csaposs Date: Fri, 25 Jul 2025 15:03:40 +0200 Subject: [PATCH 04/12] Install rust toolchain --- spread.yaml | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/spread.yaml b/spread.yaml index 7c45d87ae..23e897017 100644 --- a/spread.yaml +++ b/spread.yaml @@ -100,8 +100,11 @@ backends: - self-hosted-linux-s390x-noble-edge: username: ubuntu environment: - # pkg-config needed to build cryptography to install poetry - CONCIERGE_EXTRA_DEBS: pipx,pkg-config + # Several python packages (e.g. cryptography, bcrypt) do not have s390x builds on PyPI, + # so they must be built from source. pkg-config & rust toolchain needed + # (These packages are being built when installing poetry or integration test Python + # dependencies) + CONCIERGE_EXTRA_DEBS: pipx,pkg-config,rustup variants: - -juju29_ubuntu22 @@ -127,6 +130,13 @@ prepare: | # Install charmcraft & pipx on lxd-vm backend and install pipx on IS-hosted runners ~/go/bin/concierge prepare --trace + if [[ $SPREAD_SYSTEM == *"s390x"* ]] + then + rustup set profile minimal + # TODO add renovate comment for rust version + rustup default 1.88.0 + fi + pipx install tox poetry prepare-each: | cd "$SPREAD_PATH" From 589fa09ef7ea4f124988e3e54c889d95ccad1ad4 Mon Sep 17 00:00:00 2001 From: Carl Csaposs Date: Tue, 29 Jul 2025 11:42:56 +0200 Subject: [PATCH 05/12] Use data-integrator from edge --- tests/integration/test_data_integrator.py | 2 +- tests/integration/test_hacluster.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/integration/test_data_integrator.py b/tests/integration/test_data_integrator.py index 96ed3023e..790974f08 100644 --- a/tests/integration/test_data_integrator.py +++ b/tests/integration/test_data_integrator.py @@ -64,7 +64,7 @@ async def test_external_connectivity_with_data_integrator( ops_test.model.deploy( DATA_INTEGRATOR_APP_NAME, application_name=DATA_INTEGRATOR_APP_NAME, - channel="latest/stable", + channel="latest/edge", # Use edge for s390x series=series, config=data_integrator_config, ), diff --git a/tests/integration/test_hacluster.py b/tests/integration/test_hacluster.py index 04f82872b..f4b12013d 100644 --- a/tests/integration/test_hacluster.py +++ b/tests/integration/test_hacluster.py @@ -111,7 +111,7 @@ async def test_external_connectivity_vip_with_hacluster(ops_test: OpsTest, charm ops_test.model.deploy( DATA_INTEGRATOR_APP_NAME, application_name=DATA_INTEGRATOR_APP_NAME, - channel="latest/stable", + channel="latest/edge", # Use edge for s390x series=series, config={"database-name": TEST_DATABASE}, num_units=4, From ab2a9353c39965029ffc0c6e77b066212d278806 Mon Sep 17 00:00:00 2001 From: Carl Csaposs Date: Wed, 30 Jul 2025 16:10:07 +0200 Subject: [PATCH 06/12] Add old s390x snap revision to fix upgrade test --- tests/integration/test_upgrade.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/tests/integration/test_upgrade.py b/tests/integration/test_upgrade.py index 53a57ec0b..c54db9d33 100644 --- a/tests/integration/test_upgrade.py +++ b/tests/integration/test_upgrade.py @@ -214,9 +214,10 @@ def create_valid_upgrade_charm(charm_file: typing.Union[str, pathlib.Path]) -> N # charm needs to refresh snap to be able to avoid no-op when upgrading. # set an old revision of the snap - versions["snap"]["revisions"]["x86_64"] = "121" - versions["snap"]["revisions"]["aarch64"] = "122" - versions["workload"] = "8.0.39" + versions["snap"]["revisions"]["x86_64"] = "148" + versions["snap"]["revisions"]["aarch64"] = "150" + versions["snap"]["revisions"]["s390x"] = "149" + versions["workload"] = "8.0.42" with zipfile.ZipFile(charm_file, mode="a") as charm_zip: charm_zip.writestr("refresh_versions.toml", tomli_w.dumps(versions)) From 4e76df01b9ac099d4d5d0c138f12eca2a401a611 Mon Sep 17 00:00:00 2001 From: Carl Csaposs Date: Fri, 1 Aug 2025 09:02:45 +0200 Subject: [PATCH 07/12] self-signed-certificates s390x --- tests/integration/test_data_integrator.py | 2 +- tests/integration/test_exporter_with_tls.py | 2 +- tests/integration/test_hacluster.py | 2 +- tests/integration/test_tls.py | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/integration/test_data_integrator.py b/tests/integration/test_data_integrator.py index 790974f08..6e97a4ae9 100644 --- a/tests/integration/test_data_integrator.py +++ b/tests/integration/test_data_integrator.py @@ -29,7 +29,7 @@ if juju_.is_3_or_higher: tls_app_name = "self-signed-certificates" - tls_channel = "latest/edge" if architecture.architecture == "arm64" else "latest/stable" + tls_channel = "latest/edge" if architecture.architecture == "s390x" else "latest/stable" tls_config = {"ca-common-name": "Test CA"} else: tls_app_name = "tls-certificates-operator" diff --git a/tests/integration/test_exporter_with_tls.py b/tests/integration/test_exporter_with_tls.py index 69dbf94e2..0388a9da4 100644 --- a/tests/integration/test_exporter_with_tls.py +++ b/tests/integration/test_exporter_with_tls.py @@ -29,7 +29,7 @@ if juju_.is_3_or_higher: tls_app_name = "self-signed-certificates" - tls_channel = "latest/edge" if architecture.architecture == "arm64" else "latest/stable" + tls_channel = "latest/edge" if architecture.architecture == "s390x" else "latest/stable" tls_config = {"ca-common-name": "Test CA"} else: tls_app_name = "tls-certificates-operator" diff --git a/tests/integration/test_hacluster.py b/tests/integration/test_hacluster.py index f4b12013d..6428a2350 100644 --- a/tests/integration/test_hacluster.py +++ b/tests/integration/test_hacluster.py @@ -35,7 +35,7 @@ if juju_.is_3_or_higher: tls_app_name = "self-signed-certificates" - tls_channel = "latest/edge" if architecture.architecture == "arm64" else "latest/stable" + tls_channel = "latest/edge" if architecture.architecture == "s390x" else "latest/stable" tls_config = {"ca-common-name": "Test CA"} else: tls_app_name = "tls-certificates-operator" diff --git a/tests/integration/test_tls.py b/tests/integration/test_tls.py index ea7cdd513..764ebe6eb 100644 --- a/tests/integration/test_tls.py +++ b/tests/integration/test_tls.py @@ -26,7 +26,7 @@ if juju_.is_3_or_higher: tls_app_name = "self-signed-certificates" - tls_channel = "latest/edge" if architecture.architecture == "arm64" else "latest/stable" + tls_channel = "latest/edge" if architecture.architecture == "s390x" else "latest/stable" tls_config = {"ca-common-name": "Test CA"} else: tls_app_name = "tls-certificates-operator" From 154e3581137a9024d5e4d0d90bee76022f28d81c Mon Sep 17 00:00:00 2001 From: Carl Csaposs Date: Fri, 1 Aug 2025 09:03:28 +0200 Subject: [PATCH 08/12] temp remove already completed tests --- tests/spread/test_architecture.py/task.yaml | 9 --------- tests/spread/test_database.py/task.yaml | 7 ------- tests/spread/test_exporter.py/task.yaml | 7 ------- tests/spread/test_exporter_with_tls.py/task.yaml | 7 ------- tests/spread/test_log_rotation.py/task.yaml | 7 ------- tests/spread/test_subordinate_charms.py/task.yaml | 9 --------- tests/spread/test_upgrade.py/task.yaml | 7 ------- 7 files changed, 53 deletions(-) delete mode 100644 tests/spread/test_architecture.py/task.yaml delete mode 100644 tests/spread/test_database.py/task.yaml delete mode 100644 tests/spread/test_exporter.py/task.yaml delete mode 100644 tests/spread/test_exporter_with_tls.py/task.yaml delete mode 100644 tests/spread/test_log_rotation.py/task.yaml delete mode 100644 tests/spread/test_subordinate_charms.py/task.yaml delete mode 100644 tests/spread/test_upgrade.py/task.yaml diff --git a/tests/spread/test_architecture.py/task.yaml b/tests/spread/test_architecture.py/task.yaml deleted file mode 100644 index cad863364..000000000 --- a/tests/spread/test_architecture.py/task.yaml +++ /dev/null @@ -1,9 +0,0 @@ -summary: test_architecture.py -environment: - TEST_MODULE: test_architecture.py -execute: | - tox run -e integration -- "tests/integration/$TEST_MODULE" --model testing --alluredir="$SPREAD_TASK/allure-results" -artifacts: - - allure-results -backends: - - -lxd-vm # This task requires charm built on different architecture from host diff --git a/tests/spread/test_database.py/task.yaml b/tests/spread/test_database.py/task.yaml deleted file mode 100644 index ab87406fb..000000000 --- a/tests/spread/test_database.py/task.yaml +++ /dev/null @@ -1,7 +0,0 @@ -summary: test_database.py -environment: - TEST_MODULE: test_database.py -execute: | - tox run -e integration -- "tests/integration/$TEST_MODULE" --model testing --alluredir="$SPREAD_TASK/allure-results" -artifacts: - - allure-results diff --git a/tests/spread/test_exporter.py/task.yaml b/tests/spread/test_exporter.py/task.yaml deleted file mode 100644 index 647ca8705..000000000 --- a/tests/spread/test_exporter.py/task.yaml +++ /dev/null @@ -1,7 +0,0 @@ -summary: test_exporter.py -environment: - TEST_MODULE: test_exporter.py -execute: | - tox run -e integration -- "tests/integration/$TEST_MODULE" --model testing --alluredir="$SPREAD_TASK/allure-results" -artifacts: - - allure-results diff --git a/tests/spread/test_exporter_with_tls.py/task.yaml b/tests/spread/test_exporter_with_tls.py/task.yaml deleted file mode 100644 index 5974f89fb..000000000 --- a/tests/spread/test_exporter_with_tls.py/task.yaml +++ /dev/null @@ -1,7 +0,0 @@ -summary: test_exporter_with_tls.py -environment: - TEST_MODULE: test_exporter_with_tls.py -execute: | - tox run -e integration -- "tests/integration/$TEST_MODULE" --model testing --alluredir="$SPREAD_TASK/allure-results" -artifacts: - - allure-results diff --git a/tests/spread/test_log_rotation.py/task.yaml b/tests/spread/test_log_rotation.py/task.yaml deleted file mode 100644 index 8e8900110..000000000 --- a/tests/spread/test_log_rotation.py/task.yaml +++ /dev/null @@ -1,7 +0,0 @@ -summary: test_log_rotation.py -environment: - TEST_MODULE: test_log_rotation.py -execute: | - tox run -e integration -- "tests/integration/$TEST_MODULE" --model testing --alluredir="$SPREAD_TASK/allure-results" -artifacts: - - allure-results diff --git a/tests/spread/test_subordinate_charms.py/task.yaml b/tests/spread/test_subordinate_charms.py/task.yaml deleted file mode 100644 index 3b281deb3..000000000 --- a/tests/spread/test_subordinate_charms.py/task.yaml +++ /dev/null @@ -1,9 +0,0 @@ -summary: test_subordinate_charms.py -environment: - TEST_MODULE: test_subordinate_charms.py -execute: | - tox run -e integration -- "tests/integration/$TEST_MODULE" --model testing --alluredir="$SPREAD_TASK/allure-results" -artifacts: - - allure-results -backends: - - -lxd-vm # Requires CI secrets diff --git a/tests/spread/test_upgrade.py/task.yaml b/tests/spread/test_upgrade.py/task.yaml deleted file mode 100644 index a53e8a4ee..000000000 --- a/tests/spread/test_upgrade.py/task.yaml +++ /dev/null @@ -1,7 +0,0 @@ -summary: test_upgrade.py -environment: - TEST_MODULE: test_upgrade.py -execute: | - tox run -e integration -- "tests/integration/$TEST_MODULE" --model testing --alluredir="$SPREAD_TASK/allure-results" -artifacts: - - allure-results From 96ab4bc5c927e2a1371c95f409804a8684931d41 Mon Sep 17 00:00:00 2001 From: Carl Csaposs Date: Fri, 1 Aug 2025 11:21:24 +0200 Subject: [PATCH 09/12] fix self signed: use 1 instead of latest --- tests/integration/test_data_integrator.py | 2 +- tests/integration/test_exporter_with_tls.py | 2 +- tests/integration/test_hacluster.py | 2 +- tests/integration/test_tls.py | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/integration/test_data_integrator.py b/tests/integration/test_data_integrator.py index 6e97a4ae9..bd92beb7f 100644 --- a/tests/integration/test_data_integrator.py +++ b/tests/integration/test_data_integrator.py @@ -29,7 +29,7 @@ if juju_.is_3_or_higher: tls_app_name = "self-signed-certificates" - tls_channel = "latest/edge" if architecture.architecture == "s390x" else "latest/stable" + tls_channel = "1/edge" if architecture.architecture == "s390x" else "latest/stable" tls_config = {"ca-common-name": "Test CA"} else: tls_app_name = "tls-certificates-operator" diff --git a/tests/integration/test_exporter_with_tls.py b/tests/integration/test_exporter_with_tls.py index 0388a9da4..9a90b9fa3 100644 --- a/tests/integration/test_exporter_with_tls.py +++ b/tests/integration/test_exporter_with_tls.py @@ -29,7 +29,7 @@ if juju_.is_3_or_higher: tls_app_name = "self-signed-certificates" - tls_channel = "latest/edge" if architecture.architecture == "s390x" else "latest/stable" + tls_channel = "1/edge" if architecture.architecture == "s390x" else "latest/stable" tls_config = {"ca-common-name": "Test CA"} else: tls_app_name = "tls-certificates-operator" diff --git a/tests/integration/test_hacluster.py b/tests/integration/test_hacluster.py index 6428a2350..dc3e6ecc1 100644 --- a/tests/integration/test_hacluster.py +++ b/tests/integration/test_hacluster.py @@ -35,7 +35,7 @@ if juju_.is_3_or_higher: tls_app_name = "self-signed-certificates" - tls_channel = "latest/edge" if architecture.architecture == "s390x" else "latest/stable" + tls_channel = "1/edge" if architecture.architecture == "s390x" else "latest/stable" tls_config = {"ca-common-name": "Test CA"} else: tls_app_name = "tls-certificates-operator" diff --git a/tests/integration/test_tls.py b/tests/integration/test_tls.py index 764ebe6eb..a0c4ad971 100644 --- a/tests/integration/test_tls.py +++ b/tests/integration/test_tls.py @@ -26,7 +26,7 @@ if juju_.is_3_or_higher: tls_app_name = "self-signed-certificates" - tls_channel = "latest/edge" if architecture.architecture == "s390x" else "latest/stable" + tls_channel = "1/edge" if architecture.architecture == "s390x" else "latest/stable" tls_config = {"ca-common-name": "Test CA"} else: tls_app_name = "tls-certificates-operator" From 4729dc260d8ef059f418d83118a8bbd5e8e2c098 Mon Sep 17 00:00:00 2001 From: Carl Csaposs Date: Fri, 1 Aug 2025 12:13:32 +0200 Subject: [PATCH 10/12] fix series --- tests/integration/test_tls.py | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/integration/test_tls.py b/tests/integration/test_tls.py index a0c4ad971..1ec8510bc 100644 --- a/tests/integration/test_tls.py +++ b/tests/integration/test_tls.py @@ -61,7 +61,6 @@ async def test_build_deploy_and_relate(ops_test: OpsTest, charm, series) -> None application_name=tls_app_name, channel=tls_channel, config=tls_config, - series="jammy", ), ops_test.model.deploy( TEST_APP_NAME, From b18423a6941c2e12e4805fa3b57b499c85e6f4cc Mon Sep 17 00:00:00 2001 From: Carl Csaposs Date: Fri, 1 Aug 2025 12:13:54 +0200 Subject: [PATCH 11/12] temp remove already completed tests --- tests/spread/test_data_integrator.py/task.yaml | 7 ------- 1 file changed, 7 deletions(-) delete mode 100644 tests/spread/test_data_integrator.py/task.yaml diff --git a/tests/spread/test_data_integrator.py/task.yaml b/tests/spread/test_data_integrator.py/task.yaml deleted file mode 100644 index 9d5bc3a5e..000000000 --- a/tests/spread/test_data_integrator.py/task.yaml +++ /dev/null @@ -1,7 +0,0 @@ -summary: test_data_integrator.py -environment: - TEST_MODULE: test_data_integrator.py -execute: | - tox run -e integration -- "tests/integration/$TEST_MODULE" --model testing --alluredir="$SPREAD_TASK/allure-results" -artifacts: - - allure-results From 3844972b71d7c867f106880aed5889d133d8f7c0 Mon Sep 17 00:00:00 2001 From: Carl Csaposs Date: Fri, 1 Aug 2025 12:26:53 +0200 Subject: [PATCH 12/12] fix series --- tests/integration/test_exporter_with_tls.py | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/integration/test_exporter_with_tls.py b/tests/integration/test_exporter_with_tls.py index 9a90b9fa3..fd27d4f2e 100644 --- a/tests/integration/test_exporter_with_tls.py +++ b/tests/integration/test_exporter_with_tls.py @@ -138,7 +138,6 @@ async def test_exporter_endpoint(ops_test: OpsTest, charm, series) -> None: application_name=tls_app_name, channel=tls_channel, config=tls_config, - series="jammy", ) await ops_test.model.wait_for_idle([tls_app_name], status="active", timeout=SLOW_TIMEOUT)