diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index a2fa377e31..295ab4e27d 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -22,7 +22,7 @@ on: jobs: lint: name: Lint - uses: canonical/data-platform-workflows/.github/workflows/lint.yaml@v16.0.1 + uses: canonical/data-platform-workflows/.github/workflows/lint.yaml@v16.2.0 unit-test: name: Unit test charm @@ -44,7 +44,7 @@ jobs: build: name: Build charm - uses: canonical/data-platform-workflows/.github/workflows/build_charm.yaml@v16.0.1 + uses: canonical/data-platform-workflows/.github/workflows/build_charm.yaml@v16.2.0 with: cache: true @@ -55,22 +55,30 @@ jobs: juju: - agent: 2.9.49 # renovate: latest juju 2 libjuju: ==2.9.49.0 # renovate: latest libjuju 2 - allure: false + allure_on_amd64: false - agent: 3.1.8 # renovate: latest juju 3 - allure: true - name: Integration test charm | ${{ matrix.juju.agent }} + allure_on_amd64: true + architecture: + - amd64 + include: + - juju: + agent: 3.1.8 # renovate: latest juju 3 + allure_on_amd64: true + architecture: arm64 + name: Integration test charm | ${{ matrix.juju.agent }} | ${{ matrix.architecture }} needs: - lint - unit-test - build - uses: canonical/data-platform-workflows/.github/workflows/integration_test_charm.yaml@v16.0.1 + uses: canonical/data-platform-workflows/.github/workflows/integration_test_charm.yaml@v16.2.0 with: artifact-prefix: ${{ needs.build.outputs.artifact-prefix }} + architecture: ${{ matrix.architecture }} cloud: microk8s microk8s-snap-channel: 1.29-strict/stable juju-agent-version: ${{ matrix.juju.agent }} libjuju-version-constraint: ${{ matrix.juju.libjuju }} - _beta_allure_report: ${{ matrix.juju.allure }} + _beta_allure_report: ${{ matrix.juju.allure_on_amd64 && matrix.architecture == 'amd64' }} secrets: integration-test: | { diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 3485e8ddb1..38a32ee87f 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -52,14 +52,14 @@ jobs: build: name: Build charm - uses: canonical/data-platform-workflows/.github/workflows/build_charm.yaml@v16.0.1 + uses: canonical/data-platform-workflows/.github/workflows/build_charm.yaml@v16.2.0 release: name: Release charm needs: - ci-tests - build - uses: canonical/data-platform-workflows/.github/workflows/release_charm.yaml@v16.0.1 + uses: canonical/data-platform-workflows/.github/workflows/release_charm.yaml@v16.2.0 with: channel: 14/edge artifact-prefix: ${{ needs.build.outputs.artifact-prefix }} diff --git a/.github/workflows/sync_docs.yaml b/.github/workflows/sync_docs.yaml index 92bf1d84e6..220f0edf1b 100644 --- a/.github/workflows/sync_docs.yaml +++ b/.github/workflows/sync_docs.yaml @@ -10,7 +10,7 @@ on: jobs: sync-docs: name: Sync docs from Discourse - uses: canonical/data-platform-workflows/.github/workflows/_sync_docs.yaml@v16.0.1 + uses: canonical/data-platform-workflows/.github/workflows/_sync_docs.yaml@v16.2.0 secrets: discourse-api-user: ${{ secrets.DISCOURSE_API_USERNAME }} discourse-api-key: ${{ secrets.DISCOURSE_API_KEY }} diff --git a/.github/workflows/sync_issue_to_jira.yaml b/.github/workflows/sync_issue_to_jira.yaml index b68f93b781..a1a3dfc582 100644 --- a/.github/workflows/sync_issue_to_jira.yaml +++ b/.github/workflows/sync_issue_to_jira.yaml @@ -9,7 +9,7 @@ on: jobs: sync: name: Sync GitHub issue to Jira - uses: canonical/data-platform-workflows/.github/workflows/sync_issue_to_jira.yaml@v16.0.1 + uses: canonical/data-platform-workflows/.github/workflows/sync_issue_to_jira.yaml@v16.2.0 with: jira-base-url: https://warthogs.atlassian.net jira-project-key: DPE diff --git a/poetry.lock b/poetry.lock index 55fc5f7712..9e005e8088 100644 --- a/poetry.lock +++ b/poetry.lock @@ -31,8 +31,8 @@ pytest = "*" [package.source] type = "git" url = "https://github.com/canonical/data-platform-workflows" -reference = "v16.0.1" -resolved_reference = "2e008de51f6768c72ca711cce4976a80f52bcc31" +reference = "v16.2.0" +resolved_reference = "eb5c6fc3c725f0ec870be8055508e23b49126dc9" subdirectory = "python/pytest_plugins/allure_pytest_collection_report" [[package]] @@ -1702,8 +1702,8 @@ develop = false [package.source] type = "git" url = "https://github.com/canonical/data-platform-workflows" -reference = "v16.0.1" -resolved_reference = "2e008de51f6768c72ca711cce4976a80f52bcc31" +reference = "v16.2.0" +resolved_reference = "eb5c6fc3c725f0ec870be8055508e23b49126dc9" subdirectory = "python/pytest_plugins/github_secrets" [[package]] @@ -1757,8 +1757,8 @@ pyyaml = "*" [package.source] type = "git" url = "https://github.com/canonical/data-platform-workflows" -reference = "v16.0.1" -resolved_reference = "2e008de51f6768c72ca711cce4976a80f52bcc31" +reference = "v16.2.0" +resolved_reference = "eb5c6fc3c725f0ec870be8055508e23b49126dc9" subdirectory = "python/pytest_plugins/pytest_operator_cache" [[package]] @@ -1776,8 +1776,8 @@ pytest = "*" [package.source] type = "git" url = "https://github.com/canonical/data-platform-workflows" -reference = "v16.0.1" -resolved_reference = "2e008de51f6768c72ca711cce4976a80f52bcc31" +reference = "v16.2.0" +resolved_reference = "eb5c6fc3c725f0ec870be8055508e23b49126dc9" subdirectory = "python/pytest_plugins/pytest_operator_groups" [[package]] @@ -1817,7 +1817,6 @@ files = [ {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938"}, {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d"}, {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515"}, - {file = "PyYAML-6.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290"}, {file = "PyYAML-6.0.1-cp310-cp310-win32.whl", hash = "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924"}, {file = "PyYAML-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d"}, {file = "PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007"}, @@ -1825,15 +1824,8 @@ files = [ {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d"}, {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc"}, {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673"}, - {file = "PyYAML-6.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b"}, {file = "PyYAML-6.0.1-cp311-cp311-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741"}, {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, - {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, - {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, - {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, - {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, - {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, - {file = "PyYAML-6.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df"}, {file = "PyYAML-6.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47"}, {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98"}, {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c"}, @@ -1850,7 +1842,6 @@ files = [ {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5"}, {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696"}, {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735"}, - {file = "PyYAML-6.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6"}, {file = "PyYAML-6.0.1-cp38-cp38-win32.whl", hash = "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206"}, {file = "PyYAML-6.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62"}, {file = "PyYAML-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8"}, @@ -1858,7 +1849,6 @@ files = [ {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6"}, {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0"}, {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c"}, - {file = "PyYAML-6.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5"}, {file = "PyYAML-6.0.1-cp39-cp39-win32.whl", hash = "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c"}, {file = "PyYAML-6.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486"}, {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"}, @@ -2424,4 +2414,4 @@ test = ["big-O", "importlib-resources", "jaraco.functools", "jaraco.itertools", [metadata] lock-version = "2.0" python-versions = "^3.10" -content-hash = "bca93f217dcf726962fb57392bb4174ff482d60e5e6eb9a5558f898acf2a1e28" +content-hash = "1ccbcb9a435e0155816ed6be6d21b83edf6d550b05f68e0c24f39b428390bb6e" diff --git a/pyproject.toml b/pyproject.toml index c0f3000a08..39e0851306 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -71,11 +71,11 @@ optional = true [tool.poetry.group.integration.dependencies] lightkube = "^0.15.3" pytest = "^8.2.2" -pytest-github-secrets = {git = "https://github.com/canonical/data-platform-workflows", tag = "v16.0.1", subdirectory = "python/pytest_plugins/github_secrets"} +pytest-github-secrets = {git = "https://github.com/canonical/data-platform-workflows", tag = "v16.2.0", subdirectory = "python/pytest_plugins/github_secrets"} pytest-operator = "^0.35.0" -pytest-operator-cache = {git = "https://github.com/canonical/data-platform-workflows", tag = "v16.0.1", subdirectory = "python/pytest_plugins/pytest_operator_cache"} -pytest-operator-groups = {git = "https://github.com/canonical/data-platform-workflows", tag = "v16.0.1", subdirectory = "python/pytest_plugins/pytest_operator_groups"} -allure-pytest-collection-report = {git = "https://github.com/canonical/data-platform-workflows", tag = "v16.0.1", subdirectory = "python/pytest_plugins/allure_pytest_collection_report"} +pytest-operator-cache = {git = "https://github.com/canonical/data-platform-workflows", tag = "v16.2.0", subdirectory = "python/pytest_plugins/pytest_operator_cache"} +pytest-operator-groups = {git = "https://github.com/canonical/data-platform-workflows", tag = "v16.2.0", subdirectory = "python/pytest_plugins/pytest_operator_groups"} +allure-pytest-collection-report = {git = "https://github.com/canonical/data-platform-workflows", tag = "v16.2.0", subdirectory = "python/pytest_plugins/allure_pytest_collection_report"} # renovate caret doesn't work: https://github.com/renovatebot/renovate/issues/26940 juju = "<=3.5.0.0" psycopg2-binary = "^2.9.9" diff --git a/tests/integration/architecture.py b/tests/integration/architecture.py new file mode 100644 index 0000000000..b0fbb34478 --- /dev/null +++ b/tests/integration/architecture.py @@ -0,0 +1,7 @@ +# Copyright 2024 Canonical Ltd. +# See LICENSE file for licensing details. +import subprocess + +architecture = subprocess.run( + ["dpkg", "--print-architecture"], capture_output=True, check=True, encoding="utf-8" +).stdout.strip() diff --git a/tests/integration/ha_tests/test_async_replication.py b/tests/integration/ha_tests/test_async_replication.py index bb8d9a3ab5..2190c45e01 100644 --- a/tests/integration/ha_tests/test_async_replication.py +++ b/tests/integration/ha_tests/test_async_replication.py @@ -3,6 +3,7 @@ # See LICENSE file for licensing details. import contextlib import logging +import subprocess from asyncio import gather from typing import Optional @@ -14,15 +15,8 @@ from pytest_operator.plugin import OpsTest from tenacity import Retrying, stop_after_delay, wait_fixed -from tests.integration import markers -from tests.integration.ha_tests.helpers import ( - are_writes_increasing, - check_writes, - get_standby_leader, - get_sync_standby, - start_continuous_writes, -) -from tests.integration.helpers import ( +from .. import architecture, markers +from ..helpers import ( APPLICATION_NAME, DATABASE_APP_NAME, build_and_deploy, @@ -33,6 +27,13 @@ scale_application, wait_for_relation_removed_between, ) +from .helpers import ( + are_writes_increasing, + check_writes, + get_standby_leader, + get_sync_standby, + start_continuous_writes, +) logger = logging.getLogger(__name__) @@ -72,6 +73,10 @@ async def second_model(ops_test: OpsTest, first_model, request) -> Model: second_model_name = f"{first_model.info.name}-other" if second_model_name not in await ops_test._controller.list_models(): await ops_test._controller.add_model(second_model_name) + subprocess.run(["juju", "switch", second_model_name], check=True) + subprocess.run( + ["juju", "set-model-constraints", f"arch={architecture.architecture}"], check=True + ) second_model = Model() await second_model.connect(model_name=second_model_name) yield second_model diff --git a/tests/integration/ha_tests/test_smoke.py b/tests/integration/ha_tests/test_smoke.py index 3fe9904945..286a403688 100644 --- a/tests/integration/ha_tests/test_smoke.py +++ b/tests/integration/ha_tests/test_smoke.py @@ -10,6 +10,7 @@ from pytest_operator.plugin import OpsTest from tenacity import Retrying, stop_after_delay, wait_fixed +from .. import markers from ..helpers import ( CHARM_SERIES, DATABASE_APP_NAME, @@ -43,6 +44,7 @@ @pytest.mark.group(1) +@markers.amd64_only # TODO: remove after arm64 stable release @pytest.mark.abort_on_fail async def test_app_force_removal(ops_test: OpsTest): """Remove unit with force while storage is alive.""" @@ -103,6 +105,7 @@ async def test_app_force_removal(ops_test: OpsTest): @pytest.mark.group(1) +@markers.amd64_only # TODO: remove after arm64 stable release @pytest.mark.abort_on_fail async def test_app_garbage_ignorance(ops_test: OpsTest): """Test charm deploy in dirty environment with garbage storage.""" @@ -155,6 +158,7 @@ async def test_app_garbage_ignorance(ops_test: OpsTest): @pytest.mark.group(1) +@markers.amd64_only # TODO: remove after arm64 stable release @pytest.mark.abort_on_fail async def test_app_resources_conflicts(ops_test: OpsTest): """Test application deploy in dirty environment with garbage storage from another application.""" diff --git a/tests/integration/ha_tests/test_upgrade_from_stable.py b/tests/integration/ha_tests/test_upgrade_from_stable.py index 0b65eb3d7d..06f2dd1b3d 100644 --- a/tests/integration/ha_tests/test_upgrade_from_stable.py +++ b/tests/integration/ha_tests/test_upgrade_from_stable.py @@ -10,6 +10,7 @@ from pytest_operator.plugin import OpsTest from tenacity import Retrying, stop_after_attempt, wait_fixed +from .. import markers from ..helpers import ( APPLICATION_NAME, DATABASE_APP_NAME, @@ -31,6 +32,7 @@ @pytest.mark.group(1) +@markers.amd64_only # TODO: remove after arm64 stable release @pytest.mark.abort_on_fail async def test_deploy_stable(ops_test: OpsTest) -> None: """Simple test to ensure that the PostgreSQL and application charms get deployed.""" @@ -56,6 +58,7 @@ async def test_deploy_stable(ops_test: OpsTest) -> None: @pytest.mark.group(1) +@markers.amd64_only # TODO: remove after arm64 stable release @pytest.mark.abort_on_fail async def test_pre_upgrade_check(ops_test: OpsTest) -> None: """Test that the pre-upgrade-check action runs successfully.""" @@ -88,6 +91,7 @@ async def test_pre_upgrade_check(ops_test: OpsTest) -> None: @pytest.mark.group(1) +@markers.amd64_only # TODO: remove after arm64 stable release @pytest.mark.abort_on_fail async def test_upgrade_from_stable(ops_test: OpsTest, continuous_writes): """Test updating from stable channel.""" diff --git a/tests/integration/markers.py b/tests/integration/markers.py index 6dc2d6949f..2cfeab1c4f 100644 --- a/tests/integration/markers.py +++ b/tests/integration/markers.py @@ -4,8 +4,15 @@ import pytest +from . import architecture from .juju_ import juju_major_version juju2 = pytest.mark.skipif(juju_major_version != 2, reason="Requires juju 2") juju3 = pytest.mark.skipif(juju_major_version != 3, reason="Requires juju 3") juju_secrets = pytest.mark.skipif(juju_major_version < 3, reason="Requires juju secrets") +amd64_only = pytest.mark.skipif( + architecture.architecture != "amd64", reason="Requires amd64 architecture" +) +arm64_only = pytest.mark.skipif( + architecture.architecture != "arm64", reason="Requires arm64 architecture" +) diff --git a/tests/integration/new_relations/test_new_relations.py b/tests/integration/new_relations/test_new_relations.py index 4a41a089c1..0681d9b8bf 100644 --- a/tests/integration/new_relations/test_new_relations.py +++ b/tests/integration/new_relations/test_new_relations.py @@ -14,6 +14,7 @@ from pytest_operator.plugin import OpsTest from tenacity import Retrying, stop_after_attempt, wait_fixed +from .. import markers from ..helpers import ( CHARM_SERIES, check_database_users_existence, @@ -586,6 +587,7 @@ async def test_invalid_extra_user_roles(ops_test: OpsTest): @pytest.mark.group(1) +@markers.amd64_only # discourse-k8s charm not available for arm64 async def test_discourse(ops_test: OpsTest): # Deploy Discourse and Redis. await gather( @@ -662,6 +664,7 @@ async def test_discourse(ops_test: OpsTest): @pytest.mark.group(1) +@markers.amd64_only # indico charm not available for arm64 async def test_indico_datatabase(ops_test: OpsTest) -> None: """Tests deploying and relating to the Indico charm.""" async with ops_test.fast_forward(fast_interval="30s"): diff --git a/tests/integration/test_backups.py b/tests/integration/test_backups.py index 9f7e791d5e..8c61e14384 100644 --- a/tests/integration/test_backups.py +++ b/tests/integration/test_backups.py @@ -12,6 +12,7 @@ from pytest_operator.plugin import OpsTest from tenacity import Retrying, stop_after_attempt, wait_exponential +from . import architecture from .helpers import ( DATABASE_APP_NAME, build_and_deploy, @@ -34,13 +35,19 @@ FAILED_TO_INITIALIZE_STANZA_ERROR_MESSAGE = "failed to initialize stanza, check your S3 settings" S3_INTEGRATOR_APP_NAME = "s3-integrator" if juju_major_version < 3: - TLS_CERTIFICATES_APP_NAME = "tls-certificates-operator" - TLS_CHANNEL = "legacy/stable" - TLS_CONFIG = {"generate-self-signed-certificates": "true", "ca-common-name": "Test CA"} + tls_certificates_app_name = "tls-certificates-operator" + if architecture.architecture == "arm64": + tls_channel = "legacy/edge" + else: + tls_channel = "legacy/stable" + tls_config = {"generate-self-signed-certificates": "true", "ca-common-name": "Test CA"} else: - TLS_CERTIFICATES_APP_NAME = "self-signed-certificates" - TLS_CHANNEL = "latest/stable" - TLS_CONFIG = {"ca-common-name": "Test CA"} + tls_certificates_app_name = "self-signed-certificates" + if architecture.architecture == "arm64": + tls_channel = "latest/edge" + else: + tls_channel = "latest/stable" + tls_config = {"ca-common-name": "Test CA"} logger = logging.getLogger(__name__) @@ -99,7 +106,7 @@ async def test_backup_and_restore(ops_test: OpsTest, cloud_configs: Tuple[Dict, """Build and deploy two units of PostgreSQL and then test the backup and restore actions.""" # Deploy S3 Integrator and TLS Certificates Operator. await ops_test.model.deploy(S3_INTEGRATOR_APP_NAME) - await ops_test.model.deploy(TLS_CERTIFICATES_APP_NAME, config=TLS_CONFIG, channel=TLS_CHANNEL) + await ops_test.model.deploy(tls_certificates_app_name, config=tls_config, channel=tls_channel) for cloud, config in cloud_configs[0].items(): # Deploy and relate PostgreSQL to S3 integrator (one database app for each cloud for now @@ -110,7 +117,7 @@ async def test_backup_and_restore(ops_test: OpsTest, cloud_configs: Tuple[Dict, ops_test, 2, database_app_name=database_app_name, wait_for_idle=False ) - await ops_test.model.relate(database_app_name, TLS_CERTIFICATES_APP_NAME) + await ops_test.model.relate(database_app_name, tls_certificates_app_name) async with ops_test.fast_forward(fast_interval="60s"): await ops_test.model.wait_for_idle( apps=[database_app_name], status="active", timeout=1000 @@ -308,7 +315,7 @@ async def test_backup_and_restore(ops_test: OpsTest, cloud_configs: Tuple[Dict, logger.info("removing the TLS relation") await ops_test.model.applications[database_app_name].remove_relation( f"{database_app_name}:certificates", - f"{TLS_CERTIFICATES_APP_NAME}:certificates", + f"{tls_certificates_app_name}:certificates", ) await ops_test.model.wait_for_idle( apps=[database_app_name], status="active", timeout=1000 @@ -364,7 +371,7 @@ async def test_backup_and_restore(ops_test: OpsTest, cloud_configs: Tuple[Dict, # Remove the database app. await ops_test.model.remove_application(database_app_name, block_until_done=True) # Remove the TLS operator. - await ops_test.model.remove_application(TLS_CERTIFICATES_APP_NAME, block_until_done=True) + await ops_test.model.remove_application(tls_certificates_app_name, block_until_done=True) @pytest.mark.group(1) diff --git a/tests/integration/test_db.py b/tests/integration/test_db.py index ed0d9fbc65..f266174bc5 100644 --- a/tests/integration/test_db.py +++ b/tests/integration/test_db.py @@ -7,6 +7,7 @@ import pytest from pytest_operator.plugin import OpsTest +from . import markers from .helpers import ( APPLICATION_NAME, CHARM_SERIES, @@ -32,6 +33,7 @@ @pytest.mark.group(1) +@markers.amd64_only # finos-waltz-k8s charm not available for arm64 async def test_finos_waltz_db(ops_test: OpsTest) -> None: """Deploy Finos Waltz to test the 'db' relation. @@ -99,6 +101,8 @@ async def test_finos_waltz_db(ops_test: OpsTest) -> None: @pytest.mark.group(1) +@markers.amd64_only # finos-waltz-k8s charm not available for arm64 +# (and this test depends on previous test with finos-waltz-k8s charm) async def test_extensions_blocking(ops_test: OpsTest) -> None: await ops_test.model.deploy( APPLICATION_NAME, @@ -193,6 +197,8 @@ async def test_extensions_blocking(ops_test: OpsTest) -> None: @pytest.mark.group(1) +@markers.amd64_only # finos-waltz-k8s charm not available for arm64 +# (and this test depends on a previous test with finos-waltz-k8s charm) async def test_roles_blocking(ops_test: OpsTest) -> None: config = {"legacy_roles": "true"} await ops_test.model.applications[APPLICATION_NAME].set_config(config) diff --git a/tests/integration/test_db_admin.py b/tests/integration/test_db_admin.py index 0c3570fdea..6d023331d8 100644 --- a/tests/integration/test_db_admin.py +++ b/tests/integration/test_db_admin.py @@ -6,6 +6,7 @@ import pytest as pytest from pytest_operator.plugin import OpsTest +from . import markers from .helpers import ( DATABASE_APP_NAME, build_and_deploy, @@ -21,6 +22,7 @@ @pytest.mark.group(1) +@markers.amd64_only # discourse-charmers-discourse-k8s charm contains amd64-only binaries (pyyaml) @pytest.mark.abort_on_fail async def test_discourse_from_discourse_charmers(ops_test: OpsTest): # Build and deploy charm from local source folder (and also redis from Charmhub). diff --git a/tests/integration/test_tls.py b/tests/integration/test_tls.py index e88769acb0..6cc73cc147 100644 --- a/tests/integration/test_tls.py +++ b/tests/integration/test_tls.py @@ -8,6 +8,7 @@ from pytest_operator.plugin import OpsTest from tenacity import Retrying, stop_after_delay, wait_fixed +from . import architecture, markers from .helpers import ( DATABASE_APP_NAME, build_and_deploy, @@ -30,13 +31,19 @@ MATTERMOST_APP_NAME = "mattermost" if juju_major_version < 3: - TLS_CERTIFICATES_APP_NAME = "tls-certificates-operator" - TLS_CHANNEL = "legacy/stable" - TLS_CONFIG = {"generate-self-signed-certificates": "true", "ca-common-name": "Test CA"} + tls_certificates_app_name = "tls-certificates-operator" + if architecture.architecture == "arm64": + tls_channel = "legacy/edge" + else: + tls_channel = "legacy/stable" + tls_config = {"generate-self-signed-certificates": "true", "ca-common-name": "Test CA"} else: - TLS_CERTIFICATES_APP_NAME = "self-signed-certificates" - TLS_CHANNEL = "latest/stable" - TLS_CONFIG = {"ca-common-name": "Test CA"} + tls_certificates_app_name = "self-signed-certificates" + if architecture.architecture == "arm64": + tls_channel = "latest/edge" + else: + tls_channel = "latest/stable" + tls_config = {"ca-common-name": "Test CA"} APPLICATION_UNITS = 2 DATABASE_UNITS = 3 @@ -69,6 +76,7 @@ async def check_tls_rewind(ops_test: OpsTest) -> None: @pytest.mark.group(1) +@markers.amd64_only # mattermost-k8s charm not available for arm64 async def test_mattermost_db(ops_test: OpsTest) -> None: """Deploy Mattermost to test the 'db' relation. @@ -80,10 +88,10 @@ async def test_mattermost_db(ops_test: OpsTest) -> None: async with ops_test.fast_forward(): # Deploy TLS Certificates operator. await ops_test.model.deploy( - TLS_CERTIFICATES_APP_NAME, config=TLS_CONFIG, channel=TLS_CHANNEL + tls_certificates_app_name, config=tls_config, channel=tls_channel ) # Relate it to the PostgreSQL to enable TLS. - await ops_test.model.relate(DATABASE_APP_NAME, TLS_CERTIFICATES_APP_NAME) + await ops_test.model.relate(DATABASE_APP_NAME, tls_certificates_app_name) await ops_test.model.wait_for_idle(status="active", timeout=1000) # Wait for all units enabling TLS. @@ -170,7 +178,7 @@ async def test_mattermost_db(ops_test: OpsTest) -> None: # Remove the relation. await ops_test.model.applications[DATABASE_APP_NAME].remove_relation( - f"{DATABASE_APP_NAME}:certificates", f"{TLS_CERTIFICATES_APP_NAME}:certificates" + f"{DATABASE_APP_NAME}:certificates", f"{tls_certificates_app_name}:certificates" ) await ops_test.model.wait_for_idle(apps=[DATABASE_APP_NAME], status="active", timeout=1000) diff --git a/tox.ini b/tox.ini index 43e7eaec32..5ea93b8562 100644 --- a/tox.ini +++ b/tox.ini @@ -22,6 +22,7 @@ allowlist_externals = # Wrap `charmcraft pack` pass_env = CI + GH_TOKEN allowlist_externals = {[testenv]allowlist_externals} charmcraft