From 0d44757e3a0442d02c85e15c2a97b391b9b7d37c Mon Sep 17 00:00:00 2001 From: Matias Piipari Date: Wed, 7 Jun 2023 11:49:00 +0300 Subject: [PATCH 01/25] Define the dependencies more exactly to get the integration tests running. --- .github/workflows/frontend_charm_integration_tests.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/frontend_charm_integration_tests.yml b/.github/workflows/frontend_charm_integration_tests.yml index 80670c320..f63681f6d 100644 --- a/.github/workflows/frontend_charm_integration_tests.yml +++ b/.github/workflows/frontend_charm_integration_tests.yml @@ -1,7 +1,7 @@ name: Run charm tests on: push: - branches: ["main"] + branches: ["main", "integration-test-fix"] tags: ["v*.*.*"] jobs: @@ -18,6 +18,9 @@ jobs: - name: Setup operator environment uses: charmed-kubernetes/actions-operator@main with: + juju-channel: 3.1/stable + charmcraft-channel: 2.x/stable + lxd-channel: 5.13/stable provider: microk8s - name: Run integration tests run: tox -e integration From 97e8d4c34906b6ba4e36fe7e2655880551d01913 Mon Sep 17 00:00:00 2001 From: Matias Piipari Date: Wed, 7 Jun 2023 12:05:44 +0300 Subject: [PATCH 02/25] juju 3.1/stable -> 3.0/stable --- .github/workflows/frontend_charm_integration_tests.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/frontend_charm_integration_tests.yml b/.github/workflows/frontend_charm_integration_tests.yml index f63681f6d..a09b06379 100644 --- a/.github/workflows/frontend_charm_integration_tests.yml +++ b/.github/workflows/frontend_charm_integration_tests.yml @@ -18,7 +18,7 @@ jobs: - name: Setup operator environment uses: charmed-kubernetes/actions-operator@main with: - juju-channel: 3.1/stable + juju-channel: 3.0/stable charmcraft-channel: 2.x/stable lxd-channel: 5.13/stable provider: microk8s From a05570116aedd84e4cbe7083d139b9654ceacb32 Mon Sep 17 00:00:00 2001 From: Matias Piipari Date: Wed, 7 Jun 2023 12:26:59 +0300 Subject: [PATCH 03/25] Install strictly confined versions of juju and microk8s. --- .github/workflows/frontend_charm_integration_tests.yml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/.github/workflows/frontend_charm_integration_tests.yml b/.github/workflows/frontend_charm_integration_tests.yml index a09b06379..f201e1286 100644 --- a/.github/workflows/frontend_charm_integration_tests.yml +++ b/.github/workflows/frontend_charm_integration_tests.yml @@ -16,9 +16,11 @@ jobs: with: channel: 5.13/stable - name: Setup operator environment - uses: charmed-kubernetes/actions-operator@main + uses: mz2/actions-operator@4fcb55b99e2a0f69a5910870d3639d203aeb87aa with: - juju-channel: 3.0/stable + juju-channel: 3.1/stable + juju-classic-confinement: "false" + microk8s-classic-confinement: "false" charmcraft-channel: 2.x/stable lxd-channel: 5.13/stable provider: microk8s From 672ea62b07cd6ed73e35c2c6b6113816a4d25440 Mon Sep 17 00:00:00 2001 From: Matias Piipari Date: Wed, 7 Jun 2023 12:32:24 +0300 Subject: [PATCH 04/25] Use microk8s 1.27-strict/stable --- .github/workflows/frontend_charm_integration_tests.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/frontend_charm_integration_tests.yml b/.github/workflows/frontend_charm_integration_tests.yml index f201e1286..3326afc1b 100644 --- a/.github/workflows/frontend_charm_integration_tests.yml +++ b/.github/workflows/frontend_charm_integration_tests.yml @@ -23,6 +23,7 @@ jobs: microk8s-classic-confinement: "false" charmcraft-channel: 2.x/stable lxd-channel: 5.13/stable + channel: 1.27-strict/stable provider: microk8s - name: Run integration tests run: tox -e integration From 6c11eb5307c375c10eb0ad8e695694f1653338a3 Mon Sep 17 00:00:00 2001 From: Matias Piipari Date: Wed, 7 Jun 2023 13:04:29 +0300 Subject: [PATCH 05/25] Adds package repo access to the integration test job --- .github/workflows/frontend_charm_integration_tests.yml | 4 ++++ frontend/charm/metadata.yaml | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/.github/workflows/frontend_charm_integration_tests.yml b/.github/workflows/frontend_charm_integration_tests.yml index 3326afc1b..d362107b3 100644 --- a/.github/workflows/frontend_charm_integration_tests.yml +++ b/.github/workflows/frontend_charm_integration_tests.yml @@ -6,6 +6,10 @@ on: jobs: integration-test: + permissions: + contents: read + packages: read + name: Integration tests runs-on: ubuntu-22.04 steps: diff --git a/frontend/charm/metadata.yaml b/frontend/charm/metadata.yaml index 767c3d4c3..3a4857d29 100644 --- a/frontend/charm/metadata.yaml +++ b/frontend/charm/metadata.yaml @@ -21,4 +21,4 @@ resources: frontend-image: type: oci-image description: OCI image for test-observer-frontend - upstream-source: ghcr.io/canonical/test_observer/frontend:v0.0.10 + upstream-source: ghcr.io/canonical/test_observer/frontend:v0.0.10 \ No newline at end of file From 5c149e27f46698bc6190dfbe35e0406663329731 Mon Sep 17 00:00:00 2001 From: Matias Piipari Date: Wed, 7 Jun 2023 14:22:47 +0300 Subject: [PATCH 06/25] Add the containerd template modification --- .../workflows/frontend_charm_integration_tests.yml | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/.github/workflows/frontend_charm_integration_tests.yml b/.github/workflows/frontend_charm_integration_tests.yml index d362107b3..999cc010c 100644 --- a/.github/workflows/frontend_charm_integration_tests.yml +++ b/.github/workflows/frontend_charm_integration_tests.yml @@ -29,6 +29,18 @@ jobs: lxd-channel: 5.13/stable channel: 1.27-strict/stable provider: microk8s + - name: Adjust containerd template to accept ghcr.io images + run: | + sudo mkdir -p /var/snap/microk8s/current/args + echo "" >> /var/snap/microk8s/current/args/containerd-template.toml + echo "[plugins.\"io.containerd.grpc.v1.cri\".registry.configs.\"ghcr.io\".auth]" >> /var/snap/microk8s/current/args/containerd-template.toml + echo " username = \"${GHCR_PACKAGE_API_USER}\" >> /var/snap/microk8s/current/args/containerd-template.toml + echo " password = \"${GHCR_PACKAGE_API_TOKEN}\" >> /var/snap/microk8s/current/args/containerd-template.toml + echo $GHCR_PACKAGE_API_TOKEN | docker login ghcr.io -u $GHCR_PACKAGE_API_USER --password-stdin + sudo systemctl restart snap.microk8s.daemon-containerd.service && sudo microk8s.stop && sudo microk8s.start + env: + GHCR_PACKAGE_API_USER: ${{ secrets.GHCR_PACKAGE_API_USER }} + GHCR_PACKAGE_API_TOKEN: ${{ secrets.GHCR_PACKAGE_API_TOKEN }} - name: Run integration tests run: tox -e integration - name: Archive Tested Charm From 11cf30b5454447a54e4f27fca43ff562b17f028a Mon Sep 17 00:00:00 2001 From: Matias Piipari Date: Wed, 7 Jun 2023 14:35:12 +0300 Subject: [PATCH 07/25] Adds some missing sudoing --- .github/workflows/frontend_charm_integration_tests.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/frontend_charm_integration_tests.yml b/.github/workflows/frontend_charm_integration_tests.yml index 999cc010c..807a329e9 100644 --- a/.github/workflows/frontend_charm_integration_tests.yml +++ b/.github/workflows/frontend_charm_integration_tests.yml @@ -32,11 +32,11 @@ jobs: - name: Adjust containerd template to accept ghcr.io images run: | sudo mkdir -p /var/snap/microk8s/current/args - echo "" >> /var/snap/microk8s/current/args/containerd-template.toml - echo "[plugins.\"io.containerd.grpc.v1.cri\".registry.configs.\"ghcr.io\".auth]" >> /var/snap/microk8s/current/args/containerd-template.toml - echo " username = \"${GHCR_PACKAGE_API_USER}\" >> /var/snap/microk8s/current/args/containerd-template.toml - echo " password = \"${GHCR_PACKAGE_API_TOKEN}\" >> /var/snap/microk8s/current/args/containerd-template.toml - echo $GHCR_PACKAGE_API_TOKEN | docker login ghcr.io -u $GHCR_PACKAGE_API_USER --password-stdin + sudo echo "" >> /var/snap/microk8s/current/args/containerd-template.toml + sudo echo "[plugins.\"io.containerd.grpc.v1.cri\".registry.configs.\"ghcr.io\".auth]" >> /var/snap/microk8s/current/args/containerd-template.toml + sudo echo " username = \"${GHCR_PACKAGE_API_USER}\" >> /var/snap/microk8s/current/args/containerd-template.toml + sudo echo " password = \"${GHCR_PACKAGE_API_TOKEN}\" >> /var/snap/microk8s/current/args/containerd-template.toml + sudo echo $GHCR_PACKAGE_API_TOKEN | docker login ghcr.io -u $GHCR_PACKAGE_API_USER --password-stdin sudo systemctl restart snap.microk8s.daemon-containerd.service && sudo microk8s.stop && sudo microk8s.start env: GHCR_PACKAGE_API_USER: ${{ secrets.GHCR_PACKAGE_API_USER }} From 6e8375a02cb94a02868fde88fa2443604c8344ce Mon Sep 17 00:00:00 2001 From: Matias Piipari Date: Wed, 7 Jun 2023 14:43:13 +0300 Subject: [PATCH 08/25] From >> to tee -a --- .github/workflows/frontend_charm_integration_tests.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/frontend_charm_integration_tests.yml b/.github/workflows/frontend_charm_integration_tests.yml index 807a329e9..c425fa982 100644 --- a/.github/workflows/frontend_charm_integration_tests.yml +++ b/.github/workflows/frontend_charm_integration_tests.yml @@ -32,11 +32,11 @@ jobs: - name: Adjust containerd template to accept ghcr.io images run: | sudo mkdir -p /var/snap/microk8s/current/args - sudo echo "" >> /var/snap/microk8s/current/args/containerd-template.toml - sudo echo "[plugins.\"io.containerd.grpc.v1.cri\".registry.configs.\"ghcr.io\".auth]" >> /var/snap/microk8s/current/args/containerd-template.toml - sudo echo " username = \"${GHCR_PACKAGE_API_USER}\" >> /var/snap/microk8s/current/args/containerd-template.toml - sudo echo " password = \"${GHCR_PACKAGE_API_TOKEN}\" >> /var/snap/microk8s/current/args/containerd-template.toml - sudo echo $GHCR_PACKAGE_API_TOKEN | docker login ghcr.io -u $GHCR_PACKAGE_API_USER --password-stdin + echo "" | sudo tee -a /var/snap/microk8s/current/args/containerd-template.toml + echo "[plugins.\"io.containerd.grpc.v1.cri\".registry.configs.\"ghcr.io\".auth]" | sudo tee -a /var/snap/microk8s/current/args/containerd-template.toml + echo " username = \"${GHCR_PACKAGE_API_USER}\" | sudo tee -a /var/snap/microk8s/current/args/containerd-template.toml + echo " password = \"${GHCR_PACKAGE_API_TOKEN}\" | sudo tee -a /var/snap/microk8s/current/args/containerd-template.toml + echo $GHCR_PACKAGE_API_TOKEN | docker login ghcr.io -u $GHCR_PACKAGE_API_USER --password-stdin sudo systemctl restart snap.microk8s.daemon-containerd.service && sudo microk8s.stop && sudo microk8s.start env: GHCR_PACKAGE_API_USER: ${{ secrets.GHCR_PACKAGE_API_USER }} From 97f1531ea6b9262b6f10ec34bd3189701dfa6f11 Mon Sep 17 00:00:00 2001 From: Matias Piipari Date: Wed, 7 Jun 2023 14:51:39 +0300 Subject: [PATCH 09/25] Drop the docker login --- .github/workflows/frontend_charm_integration_tests.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/frontend_charm_integration_tests.yml b/.github/workflows/frontend_charm_integration_tests.yml index c425fa982..d3fdee856 100644 --- a/.github/workflows/frontend_charm_integration_tests.yml +++ b/.github/workflows/frontend_charm_integration_tests.yml @@ -36,7 +36,6 @@ jobs: echo "[plugins.\"io.containerd.grpc.v1.cri\".registry.configs.\"ghcr.io\".auth]" | sudo tee -a /var/snap/microk8s/current/args/containerd-template.toml echo " username = \"${GHCR_PACKAGE_API_USER}\" | sudo tee -a /var/snap/microk8s/current/args/containerd-template.toml echo " password = \"${GHCR_PACKAGE_API_TOKEN}\" | sudo tee -a /var/snap/microk8s/current/args/containerd-template.toml - echo $GHCR_PACKAGE_API_TOKEN | docker login ghcr.io -u $GHCR_PACKAGE_API_USER --password-stdin sudo systemctl restart snap.microk8s.daemon-containerd.service && sudo microk8s.stop && sudo microk8s.start env: GHCR_PACKAGE_API_USER: ${{ secrets.GHCR_PACKAGE_API_USER }} From 1478f455e8a2fcb3573605574c072dba373cd907 Mon Sep 17 00:00:00 2001 From: Matias Piipari Date: Wed, 7 Jun 2023 16:34:18 +0300 Subject: [PATCH 10/25] Oops, escaping quotes did not work quite right there. --- .github/workflows/frontend_charm_integration_tests.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/frontend_charm_integration_tests.yml b/.github/workflows/frontend_charm_integration_tests.yml index d3fdee856..158b23813 100644 --- a/.github/workflows/frontend_charm_integration_tests.yml +++ b/.github/workflows/frontend_charm_integration_tests.yml @@ -31,11 +31,11 @@ jobs: provider: microk8s - name: Adjust containerd template to accept ghcr.io images run: | - sudo mkdir -p /var/snap/microk8s/current/args - echo "" | sudo tee -a /var/snap/microk8s/current/args/containerd-template.toml - echo "[plugins.\"io.containerd.grpc.v1.cri\".registry.configs.\"ghcr.io\".auth]" | sudo tee -a /var/snap/microk8s/current/args/containerd-template.toml - echo " username = \"${GHCR_PACKAGE_API_USER}\" | sudo tee -a /var/snap/microk8s/current/args/containerd-template.toml - echo " password = \"${GHCR_PACKAGE_API_TOKEN}\" | sudo tee -a /var/snap/microk8s/current/args/containerd-template.toml + sudo mkdir -p /var/snap/microk8s/current/args && + echo "" | sudo tee -a /var/snap/microk8s/current/args/containerd-template.toml && + echo '[plugins."io.containerd.grpc.v1.cri".registry.configs."ghcr.io".auth]' | sudo tee -a /var/snap/microk8s/current/args/containerd-template.toml && + echo ' username = "$GHCR_PACKAGE_API_USER"' | sudo tee -a /var/snap/microk8s/current/args/containerd-template.toml && + echo ' password = "$GHCR_PACKAGE_API_TOKEN"' | sudo tee -a /var/snap/microk8s/current/args/containerd-template.toml && sudo systemctl restart snap.microk8s.daemon-containerd.service && sudo microk8s.stop && sudo microk8s.start env: GHCR_PACKAGE_API_USER: ${{ secrets.GHCR_PACKAGE_API_USER }} From b03e01552f7bb7525618fd74d3d6ee8f313059da Mon Sep 17 00:00:00 2001 From: Matias Piipari Date: Wed, 7 Jun 2023 18:03:41 +0300 Subject: [PATCH 11/25] Adjust the integration test scenario, expecting rather than raising on blocked status (more scenarios needed to actually relate the frontend to the backend). --- .../workflows/frontend_charm_integration_tests.yml | 4 ++-- frontend/charm/src/charm.py | 14 ++++++++++++++ frontend/charm/tests/integration/test_charm.py | 11 ++++++----- 3 files changed, 22 insertions(+), 7 deletions(-) diff --git a/.github/workflows/frontend_charm_integration_tests.yml b/.github/workflows/frontend_charm_integration_tests.yml index 158b23813..ecf6d7311 100644 --- a/.github/workflows/frontend_charm_integration_tests.yml +++ b/.github/workflows/frontend_charm_integration_tests.yml @@ -22,13 +22,13 @@ jobs: - name: Setup operator environment uses: mz2/actions-operator@4fcb55b99e2a0f69a5910870d3639d203aeb87aa with: + channel: 1.27-strict/stable + provider: microk8s juju-channel: 3.1/stable juju-classic-confinement: "false" microk8s-classic-confinement: "false" charmcraft-channel: 2.x/stable lxd-channel: 5.13/stable - channel: 1.27-strict/stable - provider: microk8s - name: Adjust containerd template to accept ghcr.io images run: | sudo mkdir -p /var/snap/microk8s/current/args && diff --git a/frontend/charm/src/charm.py b/frontend/charm/src/charm.py index f85192eaf..a08424314 100755 --- a/frontend/charm/src/charm.py +++ b/frontend/charm/src/charm.py @@ -143,6 +143,20 @@ def _update_layer_and_restart(self, event): hostname = self._stored.backend_hostname port = self._stored.backend_port + # Blocked status is set without a pebble re-configuration or container restart here. + # Frontend charm _could_ instead make nginx present an error page when backend has not been configured. + if hostname is None: + self.unit.status = BlockedStatus( + "test-observer-rest-api relation not connected, or hostname not populated based on relation data." + ) + return + + if hostname is None: + self.unit.status = BlockedStatus( + "test-observer-rest-api relation not connected, or port not populated based on relation data." + ) + return + if int(port) == 80 or int(port) == 443: base_uri = f"{scheme}{hostname}" else: diff --git a/frontend/charm/tests/integration/test_charm.py b/frontend/charm/tests/integration/test_charm.py index 10742f61b..12a3f4905 100644 --- a/frontend/charm/tests/integration/test_charm.py +++ b/frontend/charm/tests/integration/test_charm.py @@ -17,20 +17,21 @@ @pytest.mark.abort_on_fail -async def test_build_and_deploy(ops_test: OpsTest): - """Build the charm-under-test and deploy it together with related charms. +async def test_build_and_deploy_without_backend(ops_test: OpsTest): + """Build the charm-under-test and deploy it together without related charms. Assert on the unit status before any relations/configurations take place. """ charm = await ops_test.build_charm(".") - resources = {"frontend-image": METADATA["resources"]["frontend-image"]["upstream-source"]} + resources = { + "frontend-image": METADATA["resources"]["frontend-image"]["upstream-source"] + } await asyncio.gather( ops_test.model.deploy(charm, resources=resources, application_name=APP_NAME), ops_test.model.wait_for_idle( apps=[APP_NAME], - status="active", - raise_on_blocked=True, + status="blocked", timeout=1000, ), ) From 55b943634219331a16cbd6f780e97e0f7b42cb01 Mon Sep 17 00:00:00 2001 From: Matias Piipari Date: Wed, 7 Jun 2023 18:06:17 +0300 Subject: [PATCH 12/25] Drops the debugging intended branch from the list of branches to trigger the integration tests with. --- .github/workflows/frontend_charm_integration_tests.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/frontend_charm_integration_tests.yml b/.github/workflows/frontend_charm_integration_tests.yml index ecf6d7311..6d442372c 100644 --- a/.github/workflows/frontend_charm_integration_tests.yml +++ b/.github/workflows/frontend_charm_integration_tests.yml @@ -1,7 +1,7 @@ name: Run charm tests on: push: - branches: ["main", "integration-test-fix"] + branches: ["main"] tags: ["v*.*.*"] jobs: From cde6b80bb3a39c0737a06adbf5f765c560d149b8 Mon Sep 17 00:00:00 2001 From: Matias Piipari Date: Wed, 7 Jun 2023 18:28:24 +0300 Subject: [PATCH 13/25] Change to maintenance status instead for clarity, since configuration action is required. --- .github/workflows/frontend_charm_integration_tests.yml | 2 +- frontend/charm/src/charm.py | 4 ++-- frontend/charm/tests/integration/test_charm.py | 8 +++----- 3 files changed, 6 insertions(+), 8 deletions(-) diff --git a/.github/workflows/frontend_charm_integration_tests.yml b/.github/workflows/frontend_charm_integration_tests.yml index 6d442372c..ecf6d7311 100644 --- a/.github/workflows/frontend_charm_integration_tests.yml +++ b/.github/workflows/frontend_charm_integration_tests.yml @@ -1,7 +1,7 @@ name: Run charm tests on: push: - branches: ["main"] + branches: ["main", "integration-test-fix"] tags: ["v*.*.*"] jobs: diff --git a/frontend/charm/src/charm.py b/frontend/charm/src/charm.py index a08424314..af8e5d5ae 100755 --- a/frontend/charm/src/charm.py +++ b/frontend/charm/src/charm.py @@ -146,13 +146,13 @@ def _update_layer_and_restart(self, event): # Blocked status is set without a pebble re-configuration or container restart here. # Frontend charm _could_ instead make nginx present an error page when backend has not been configured. if hostname is None: - self.unit.status = BlockedStatus( + self.unit.status = MaintenanceStatus( "test-observer-rest-api relation not connected, or hostname not populated based on relation data." ) return if hostname is None: - self.unit.status = BlockedStatus( + self.unit.status = MaintenanceStatus( "test-observer-rest-api relation not connected, or port not populated based on relation data." ) return diff --git a/frontend/charm/tests/integration/test_charm.py b/frontend/charm/tests/integration/test_charm.py index 12a3f4905..77cc33f3a 100644 --- a/frontend/charm/tests/integration/test_charm.py +++ b/frontend/charm/tests/integration/test_charm.py @@ -23,15 +23,13 @@ async def test_build_and_deploy_without_backend(ops_test: OpsTest): Assert on the unit status before any relations/configurations take place. """ charm = await ops_test.build_charm(".") - resources = { - "frontend-image": METADATA["resources"]["frontend-image"]["upstream-source"] - } + resources = {"frontend-image": METADATA["resources"]["frontend-image"]["upstream-source"]} await asyncio.gather( ops_test.model.deploy(charm, resources=resources, application_name=APP_NAME), ops_test.model.wait_for_idle( apps=[APP_NAME], - status="blocked", - timeout=1000, + status="maintenance", + timeout=2000, ), ) From 1ed9d5f034cb84c1a8fbe481f3bbf3ec6f085d34 Mon Sep 17 00:00:00 2001 From: Matias Piipari Date: Wed, 7 Jun 2023 18:34:24 +0300 Subject: [PATCH 14/25] Adds the "integration-test-fix" branch into the rule still --- .github/workflows/frontend_charm_analysis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/frontend_charm_analysis.yml b/.github/workflows/frontend_charm_analysis.yml index 751c14bef..84fe004dc 100644 --- a/.github/workflows/frontend_charm_analysis.yml +++ b/.github/workflows/frontend_charm_analysis.yml @@ -4,7 +4,7 @@ on: branches: - main push: - branches: ["main"] + branches: ["main", "integration-test-fix"] tags: ["v*.*.*"] jobs: From 0a30cee1668e1b284b2d9ea43b81dec8f3e1319f Mon Sep 17 00:00:00 2001 From: Matias Piipari Date: Wed, 7 Jun 2023 22:58:53 +0300 Subject: [PATCH 15/25] Adds a 503 response / maintenance status to the frontend application state where relation is not yet connected. Simplified the charm logic, no _stored state needed (fetching the hostname and port from the relation's application data bag). --- frontend/charm/src/charm.py | 109 ++++++++++++++++++++++++------------ 1 file changed, 72 insertions(+), 37 deletions(-) diff --git a/frontend/charm/src/charm.py b/frontend/charm/src/charm.py index af8e5d5ae..ec262cf45 100755 --- a/frontend/charm/src/charm.py +++ b/frontend/charm/src/charm.py @@ -30,8 +30,6 @@ class TestObserverFrontendCharm(ops.CharmBase): """The frontend charm operates serving the frontend through nginx.""" - _stored = StoredState() - def __init__(self, *args): super().__init__(*args) self.pebble_service_name = "test-observer-frontend" @@ -56,8 +54,6 @@ def __init__(self, *args): self.framework.observe(self.ingress.on.ready, self._on_ingress_ready) self.framework.observe(self.ingress.on.revoked, self._on_ingress_revoked) - self._stored.set_default(backend_hostname=None, backend_port=None) - def _on_frontend_pebble_ready(self, event: ops.PebbleReadyEvent): container = event.workload container.add_layer("frontend", self._pebble_layer, combine=True) @@ -98,20 +94,12 @@ def _config_is_valid(self, config) -> Tuple[bool, str]: def _on_rest_api_relation_update(self, event): api_hostname = event.relation.data[event.app].get("hostname") api_port = event.relation.data[event.app].get("port") - logger.debug(f"API hostname: {api_hostname} (app: {event.app})") - - if self.unit.is_leader(): - self._stored.backend_hostname = api_hostname - self._stored.backend_port = api_port - + logger.debug(f"API hostname: {api_hostname}, port: {api_port} (app: {event.app})") self._update_layer_and_restart(event) def _on_rest_api_relation_broken(self, event): - logger.debug("REST API relation broken -> removing backend hostname") - - if self.unit.is_leader(): - self._stored.backend_hostname = None - self._stored.backend_port = None + logger.debug("REST API relation broken") + self._update_layer_and_restart(event) def nginx_config(self, base_uri: str) -> str: """Return a config where the backend port `base_uri` is adjusted.""" @@ -136,44 +124,91 @@ def nginx_config(self, base_uri: str) -> str: }} """ + def nginx_503_config(self) -> str: + """Return a config for the situation when the backend is not yet available.""" + return """ + server { + listen 80 default_server; + server_name _; + return 503; + error_page 503 @maintenance; + + location @maintenance { + rewrite ^(.*)$ /503.html break; + root /usr/share/nginx/html; + } + } + """ + + def html_503(self) -> str: + """Return a 503 response page.""" + return """ + + + 503 Service Unavailable + + +

503 Service Unavailable

+

Backend not yet configured.

+ + + """ + def _update_layer_and_restart(self, event): self.unit.status = MaintenanceStatus(f"Updating {self.pebble_service_name} layer") - scheme = self.config["test-observer-api-scheme"] - hostname = self._stored.backend_hostname - port = self._stored.backend_port - - # Blocked status is set without a pebble re-configuration or container restart here. - # Frontend charm _could_ instead make nginx present an error page when backend has not been configured. - if hostname is None: - self.unit.status = MaintenanceStatus( - "test-observer-rest-api relation not connected, or hostname not populated based on relation data." - ) - return + api_relation = self.model.relations["test-observer-rest-api"][0] + + if api_relation is None: + if self.container.can_connect(): + self.container.add_layer( + self.pebble_service_name, self._pebble_layer, combine=True + ) + self.container.push( + "/etc/nginx/sites-available/test-observer-frontend", + self.nginx_503_config(), + make_dirs=True, + ) + self.container.push( + "/usr/share/nginx/html/503.html", + self.html_503(), + make_dirs=True, + ) + self.container.restart(self.pebble_service_name) + self.unit.status = MaintenanceStatus( + "test-observer-rest-api relation not connected." + ) + else: + self.unit.status = WaitingStatus( + "Waiting for Pebble for API to set maintenance state" + ) - if hostname is None: - self.unit.status = MaintenanceStatus( - "test-observer-rest-api relation not connected, or port not populated based on relation data." - ) return + hostname = api_relation.data[api_relation.app]["hostname"] + port = api_relation.data[api_relation.app]["port"] + + scheme = self.config["test-observer-api-scheme"] + + logger.info(f"Hostname: {hostname} (from relation: {hostname})") + logger.info(f"Port: {port} (from relation: {port})") + if int(port) == 80 or int(port) == 443: base_uri = f"{scheme}{hostname}" else: base_uri = f"{scheme}{hostname}:{port}" - self.container.push( - "/etc/nginx/sites-available/test-observer-frontend", - self.nginx_config(base_uri=base_uri), - make_dirs=True, - ) - if self.container.can_connect(): self.container.add_layer(self.pebble_service_name, self._pebble_layer, combine=True) + self.container.push( + "/etc/nginx/sites-available/test-observer-frontend", + self.nginx_config(base_uri=base_uri), + make_dirs=True, + ) self.container.restart(self.pebble_service_name) self.unit.status = ActiveStatus() else: - self.unit.status = WaitingStatus("Waiting for Pebble for API") + self.unit.status = WaitingStatus("Waiting for Pebble for API to set available state") @property def _pebble_layer(self): From bf2859c503eea435c75ec0e14f4c2dd721d93c3d Mon Sep 17 00:00:00 2001 From: Matias Piipari Date: Wed, 7 Jun 2023 23:09:10 +0300 Subject: [PATCH 16/25] Removs the redundant import StoredState --- frontend/charm/src/charm.py | 1 - 1 file changed, 1 deletion(-) diff --git a/frontend/charm/src/charm.py b/frontend/charm/src/charm.py index ec262cf45..f9f997677 100755 --- a/frontend/charm/src/charm.py +++ b/frontend/charm/src/charm.py @@ -15,7 +15,6 @@ IngressPerAppRequirer, IngressPerAppRevokedEvent, ) -from ops.framework import StoredState from ops.model import ( ActiveStatus, BlockedStatus, From 2fc065fc47fd8af789220fac19cc4e01ac174333 Mon Sep 17 00:00:00 2001 From: Matias Piipari Date: Wed, 7 Jun 2023 23:24:43 +0300 Subject: [PATCH 17/25] Add a `microk8s status --wait-ready` --- .github/workflows/frontend_charm_integration_tests.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/frontend_charm_integration_tests.yml b/.github/workflows/frontend_charm_integration_tests.yml index ecf6d7311..8d5a86baa 100644 --- a/.github/workflows/frontend_charm_integration_tests.yml +++ b/.github/workflows/frontend_charm_integration_tests.yml @@ -36,7 +36,10 @@ jobs: echo '[plugins."io.containerd.grpc.v1.cri".registry.configs."ghcr.io".auth]' | sudo tee -a /var/snap/microk8s/current/args/containerd-template.toml && echo ' username = "$GHCR_PACKAGE_API_USER"' | sudo tee -a /var/snap/microk8s/current/args/containerd-template.toml && echo ' password = "$GHCR_PACKAGE_API_TOKEN"' | sudo tee -a /var/snap/microk8s/current/args/containerd-template.toml && - sudo systemctl restart snap.microk8s.daemon-containerd.service && sudo microk8s.stop && sudo microk8s.start + sudo systemctl restart snap.microk8s.daemon-containerd.service && + sudo microk8s.stop && + sudo microk8s.start && + microk8s status --wait-ready env: GHCR_PACKAGE_API_USER: ${{ secrets.GHCR_PACKAGE_API_USER }} GHCR_PACKAGE_API_TOKEN: ${{ secrets.GHCR_PACKAGE_API_TOKEN }} From 06a258ecacc3b30612590ca19169161f66cb1994 Mon Sep 17 00:00:00 2001 From: Matias Piipari Date: Wed, 7 Jun 2023 23:33:27 +0300 Subject: [PATCH 18/25] Adds missing sudo --- .github/workflows/frontend_charm_integration_tests.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/frontend_charm_integration_tests.yml b/.github/workflows/frontend_charm_integration_tests.yml index 8d5a86baa..ff7b9d41f 100644 --- a/.github/workflows/frontend_charm_integration_tests.yml +++ b/.github/workflows/frontend_charm_integration_tests.yml @@ -39,7 +39,7 @@ jobs: sudo systemctl restart snap.microk8s.daemon-containerd.service && sudo microk8s.stop && sudo microk8s.start && - microk8s status --wait-ready + sudo microk8s status --wait-ready env: GHCR_PACKAGE_API_USER: ${{ secrets.GHCR_PACKAGE_API_USER }} GHCR_PACKAGE_API_TOKEN: ${{ secrets.GHCR_PACKAGE_API_TOKEN }} From a3a54049212ee2abbfa4d7456c73ea7c2a513006 Mon Sep 17 00:00:00 2001 From: Matias Piipari Date: Sun, 2 Jul 2023 12:55:37 +0300 Subject: [PATCH 19/25] Let's try with the microk8s version + libpyjuju < 3.1 Let's try with the microk8s version and libpyjuju < 3.1 that seems to work for rout53-acme-operator where the integration test pipeline is pulled from --- .../frontend_charm_integration_tests.yml | 21 +++++++++++-------- frontend/charm/tox.ini | 2 +- 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/.github/workflows/frontend_charm_integration_tests.yml b/.github/workflows/frontend_charm_integration_tests.yml index ff7b9d41f..2fe787f85 100644 --- a/.github/workflows/frontend_charm_integration_tests.yml +++ b/.github/workflows/frontend_charm_integration_tests.yml @@ -18,15 +18,15 @@ jobs: - name: Setup LXD uses: canonical/setup-lxd@main with: - channel: 5.13/stable + channel: 5.12/stable - name: Setup operator environment - uses: mz2/actions-operator@4fcb55b99e2a0f69a5910870d3639d203aeb87aa + uses: charmed-kubernetes/actions-operator@main # mz2/actions-operator@4fcb55b99e2a0f69a5910870d3639d203aeb87aa with: - channel: 1.27-strict/stable + channel: 1.27-strict/stable # 1.26.4 provider: microk8s - juju-channel: 3.1/stable - juju-classic-confinement: "false" - microk8s-classic-confinement: "false" + juju-channel: 2.9/stable + # juju-classic-confinement: "false" + # microk8s-classic-confinement: "false" charmcraft-channel: 2.x/stable lxd-channel: 5.13/stable - name: Adjust containerd template to accept ghcr.io images @@ -37,9 +37,12 @@ jobs: echo ' username = "$GHCR_PACKAGE_API_USER"' | sudo tee -a /var/snap/microk8s/current/args/containerd-template.toml && echo ' password = "$GHCR_PACKAGE_API_TOKEN"' | sudo tee -a /var/snap/microk8s/current/args/containerd-template.toml && sudo systemctl restart snap.microk8s.daemon-containerd.service && - sudo microk8s.stop && - sudo microk8s.start && - sudo microk8s status --wait-ready + sudo microk8s.stop && + sleep 10 && + sudo microk8s.start && + sleep 10 && + sudo microk8s status --wait-ready && + sleep 30 env: GHCR_PACKAGE_API_USER: ${{ secrets.GHCR_PACKAGE_API_USER }} GHCR_PACKAGE_API_TOKEN: ${{ secrets.GHCR_PACKAGE_API_TOKEN }} diff --git a/frontend/charm/tox.ini b/frontend/charm/tox.ini index fb9bfa4f4..d205153ad 100644 --- a/frontend/charm/tox.ini +++ b/frontend/charm/tox.ini @@ -66,7 +66,7 @@ commands = description = Run integration tests deps = pytest - juju + juju<3.1 pytest-operator -r {tox_root}/requirements.txt commands = From 234b1aa3030a208368468435ad551bd9e1b38582 Mon Sep 17 00:00:00 2001 From: Matias Piipari Date: Sun, 2 Jul 2023 13:11:11 +0300 Subject: [PATCH 20/25] Back to 5.13/stable for lxd --- .github/workflows/frontend_charm_integration_tests.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/frontend_charm_integration_tests.yml b/.github/workflows/frontend_charm_integration_tests.yml index 2fe787f85..12a1bff29 100644 --- a/.github/workflows/frontend_charm_integration_tests.yml +++ b/.github/workflows/frontend_charm_integration_tests.yml @@ -18,7 +18,7 @@ jobs: - name: Setup LXD uses: canonical/setup-lxd@main with: - channel: 5.12/stable + channel: 5.13/stable - name: Setup operator environment uses: charmed-kubernetes/actions-operator@main # mz2/actions-operator@4fcb55b99e2a0f69a5910870d3639d203aeb87aa with: From fd3ed3534e31af9a256a26d8aa7352d45c3f5da8 Mon Sep 17 00:00:00 2001 From: Matias Piipari Date: Sun, 2 Jul 2023 13:22:07 +0300 Subject: [PATCH 21/25] 2.9/stable -> 3.0/stable --- .github/workflows/frontend_charm_integration_tests.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/frontend_charm_integration_tests.yml b/.github/workflows/frontend_charm_integration_tests.yml index 12a1bff29..95d6a8be3 100644 --- a/.github/workflows/frontend_charm_integration_tests.yml +++ b/.github/workflows/frontend_charm_integration_tests.yml @@ -24,7 +24,7 @@ jobs: with: channel: 1.27-strict/stable # 1.26.4 provider: microk8s - juju-channel: 2.9/stable + juju-channel: 3.0/stable # juju-classic-confinement: "false" # microk8s-classic-confinement: "false" charmcraft-channel: 2.x/stable From 63f4d6f2990ee3eb8ab9a6fc0121013a7d51b3fe Mon Sep 17 00:00:00 2001 From: Matias Piipari Date: Sun, 2 Jul 2023 14:02:37 +0300 Subject: [PATCH 22/25] Trying with the non-strictly confined microk8s --- .github/workflows/frontend_charm_integration_tests.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/frontend_charm_integration_tests.yml b/.github/workflows/frontend_charm_integration_tests.yml index 95d6a8be3..aa1f5a110 100644 --- a/.github/workflows/frontend_charm_integration_tests.yml +++ b/.github/workflows/frontend_charm_integration_tests.yml @@ -22,7 +22,7 @@ jobs: - name: Setup operator environment uses: charmed-kubernetes/actions-operator@main # mz2/actions-operator@4fcb55b99e2a0f69a5910870d3639d203aeb87aa with: - channel: 1.27-strict/stable # 1.26.4 + channel: 1.27/stable # 1.26.4 provider: microk8s juju-channel: 3.0/stable # juju-classic-confinement: "false" From acf47ce5fa59ede1d6b391621999c6eacdf43ba3 Mon Sep 17 00:00:00 2001 From: Matias Piipari Date: Sun, 2 Jul 2023 14:02:47 +0300 Subject: [PATCH 23/25] Adds "publish-charm" job --- .../frontend_charm_integration_tests.yml | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/.github/workflows/frontend_charm_integration_tests.yml b/.github/workflows/frontend_charm_integration_tests.yml index aa1f5a110..52802c5a3 100644 --- a/.github/workflows/frontend_charm_integration_tests.yml +++ b/.github/workflows/frontend_charm_integration_tests.yml @@ -70,3 +70,29 @@ jobs: defaults: run: working-directory: ./frontend/charm + + publish-charm: + name: Publish Charm + needs: integration-test + runs-on: ubuntu-22.04 + if: ${{ github.ref_name == 'main' }} + steps: + - name: Checkout + uses: actions/checkout@v2 + - name: Install charmcraft + run: sudo snap install charmcraft --classic + - name: Fetch Tested Charm + uses: actions/download-artifact@v3 + with: + name: tested-charm + - name: Move charm in current directory + run: find ./ -name test-observer-frontend_ubuntu-22.04-amd64.charm -exec mv -t ./ {} \; + - name: Select Charmhub channel + uses: canonical/charming-actions/channel@2.2.2 + id: channel + - name: Upload charm to Charmhub + uses: canonical/charming-actions/upload-charm@2.2.2 + with: + credentials: "${{ secrets.CHARMHUB_AUTH_API }}" + github-token: "${{ secrets.GITHUB_TOKEN }}" + channel: "${{ steps.channel.outputs.name }}" From b03dddbabc24bddbb3c5890103473bc727203c8b Mon Sep 17 00:00:00 2001 From: Matias Piipari Date: Sun, 2 Jul 2023 14:03:28 +0300 Subject: [PATCH 24/25] Adds promotion action --- .github/workflows/frontend_charm_promote.yml | 43 ++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 .github/workflows/frontend_charm_promote.yml diff --git a/.github/workflows/frontend_charm_promote.yml b/.github/workflows/frontend_charm_promote.yml new file mode 100644 index 000000000..617a6cd28 --- /dev/null +++ b/.github/workflows/frontend_charm_promote.yml @@ -0,0 +1,43 @@ +name: Promote Charm + +on: + workflow_dispatch: + inputs: + promotion: + type: choice + description: Channel to promote from + options: + - edge -> beta + - beta -> candidate + - candidate -> stable + +jobs: + promote: + name: Promote Charm + runs-on: ubuntu-22.04 + steps: + - name: Checkout + uses: actions/checkout@v3 + - name: Set target channel + env: + PROMOTE_FROM: ${{ github.event.inputs.promotion }} + run: | + if [ "${PROMOTE_FROM}" == "edge -> beta" ]; then + echo "promote-from=edge" >> ${GITHUB_ENV} + echo "promote-to=beta" >> ${GITHUB_ENV} + elif [ "${PROMOTE_FROM}" == "beta -> candidate" ]; then + echo "promote-from=beta" >> ${GITHUB_ENV} + echo "promote-to=candidate" >> ${GITHUB_ENV} + elif [ "${PROMOTE_FROM}" == "candidate -> stable" ]; then + echo "promote-from=candidate" >> ${GITHUB_ENV} + echo "promote-to=stable" >> ${GITHUB_ENV} + fi + - name: Promote Charm + uses: canonical/charming-actions/release-charm@2.2.0 + with: + base-channel: 22.04 + credentials: ${{ secrets.CHARMHUB_TOKEN }} + github-token: ${{ secrets.GITHUB_TOKEN }} + destination-channel: latest/${{ env.promote-to }} + origin-channel: latest/${{ env.promote-from }} + charmcraft-channel: latest/stable From 73485591bb58af0b48811432adc223b130875624 Mon Sep 17 00:00:00 2001 From: Matias Piipari Date: Thu, 26 Oct 2023 18:53:45 +0300 Subject: [PATCH 25/25] Swap to self-hosted runners --- .github/workflows/frontend_charm_analysis.yml | 6 +++--- .github/workflows/frontend_charm_integration_tests.yml | 4 ++-- .github/workflows/frontend_charm_promote.yml | 2 +- .github/workflows/public_backend_image.yml | 2 +- .github/workflows/publish_frontend_image.yml | 2 +- .github/workflows/release_charms.yml | 2 +- .github/workflows/test_backend.yml | 2 +- .github/workflows/test_frontend.yml | 2 +- 8 files changed, 11 insertions(+), 11 deletions(-) diff --git a/.github/workflows/frontend_charm_analysis.yml b/.github/workflows/frontend_charm_analysis.yml index 84fe004dc..707d6b287 100644 --- a/.github/workflows/frontend_charm_analysis.yml +++ b/.github/workflows/frontend_charm_analysis.yml @@ -10,7 +10,7 @@ on: jobs: lint-report: name: Lint and format report - runs-on: ubuntu-22.04 + runs-on: [self-hosted, linux, large] steps: - uses: actions/checkout@v3 - name: Install tox @@ -23,7 +23,7 @@ jobs: static-analysis: name: Static analysis - runs-on: ubuntu-22.04 + runs-on: [self-hosted, linux] steps: - uses: actions/checkout@v3 - name: Install tox @@ -36,7 +36,7 @@ jobs: unit-tests-with-coverage: name: Unit tests - runs-on: ubuntu-22.04 + runs-on: [self-hosted, linux] steps: - uses: actions/checkout@v3 - name: Install tox diff --git a/.github/workflows/frontend_charm_integration_tests.yml b/.github/workflows/frontend_charm_integration_tests.yml index 52802c5a3..18ad95f6e 100644 --- a/.github/workflows/frontend_charm_integration_tests.yml +++ b/.github/workflows/frontend_charm_integration_tests.yml @@ -11,7 +11,7 @@ jobs: packages: read name: Integration tests - runs-on: ubuntu-22.04 + runs-on: [self-hosted, linux, large] steps: - name: Checkout uses: actions/checkout@v3 @@ -74,7 +74,7 @@ jobs: publish-charm: name: Publish Charm needs: integration-test - runs-on: ubuntu-22.04 + runs-on: [self-hosted, linux] if: ${{ github.ref_name == 'main' }} steps: - name: Checkout diff --git a/.github/workflows/frontend_charm_promote.yml b/.github/workflows/frontend_charm_promote.yml index 617a6cd28..a04866df9 100644 --- a/.github/workflows/frontend_charm_promote.yml +++ b/.github/workflows/frontend_charm_promote.yml @@ -14,7 +14,7 @@ on: jobs: promote: name: Promote Charm - runs-on: ubuntu-22.04 + runs-on: [self-hosted, linux] steps: - name: Checkout uses: actions/checkout@v3 diff --git a/.github/workflows/public_backend_image.yml b/.github/workflows/public_backend_image.yml index 0e74e6430..5f1653a9c 100644 --- a/.github/workflows/public_backend_image.yml +++ b/.github/workflows/public_backend_image.yml @@ -9,7 +9,7 @@ env: jobs: build-and-push-backend-image: - runs-on: ubuntu-latest + runs-on: [self-hosted, linux] permissions: contents: read packages: write diff --git a/.github/workflows/publish_frontend_image.yml b/.github/workflows/publish_frontend_image.yml index 3b901b821..982edb457 100644 --- a/.github/workflows/publish_frontend_image.yml +++ b/.github/workflows/publish_frontend_image.yml @@ -9,7 +9,7 @@ env: jobs: build-and-push-frontend-image: - runs-on: ubuntu-latest + runs-on: [self-hosted, linux] permissions: contents: read packages: write diff --git a/.github/workflows/release_charms.yml b/.github/workflows/release_charms.yml index b344a8106..148b8b753 100644 --- a/.github/workflows/release_charms.yml +++ b/.github/workflows/release_charms.yml @@ -9,7 +9,7 @@ on: jobs: build: name: Release test-observer-api charm to edge - runs-on: ubuntu-latest + runs-on: [self-hosted, linux] steps: - name: Checkout uses: actions/checkout@v2 diff --git a/.github/workflows/test_backend.yml b/.github/workflows/test_backend.yml index 223752b3b..a2718155a 100644 --- a/.github/workflows/test_backend.yml +++ b/.github/workflows/test_backend.yml @@ -6,7 +6,7 @@ concurrency: cancel-in-progress: true jobs: test: - runs-on: ubuntu-latest + runs-on: [self-hosted, linux, large] defaults: run: working-directory: backend diff --git a/.github/workflows/test_frontend.yml b/.github/workflows/test_frontend.yml index 5a99a692b..c2f76f534 100644 --- a/.github/workflows/test_frontend.yml +++ b/.github/workflows/test_frontend.yml @@ -6,7 +6,7 @@ concurrency: cancel-in-progress: true jobs: test: - runs-on: ubuntu-latest + runs-on: [self-hosted, linux, large] defaults: run: working-directory: frontend