diff --git a/.trivyignore b/.trivyignore index 2591634c..ce893fba 100644 --- a/.trivyignore +++ b/.trivyignore @@ -1,2 +1,4 @@ # Jenkins executable CVE-2024-47072 +# Pebble vulnerabilities +CVE-2024-45338 diff --git a/actions.yaml b/actions.yaml index 14834665..9d441150 100644 --- a/actions.yaml +++ b/actions.yaml @@ -1,4 +1,4 @@ -# Copyright 2024 Canonical Ltd. +# Copyright 2025 Canonical Ltd. # See LICENSE file for licensing details. get-admin-password: diff --git a/charmcraft.yaml b/charmcraft.yaml index f372a149..4bfe346d 100644 --- a/charmcraft.yaml +++ b/charmcraft.yaml @@ -1,4 +1,4 @@ -# Copyright 2024 Canonical Ltd. +# Copyright 2025 Canonical Ltd. # See LICENSE file for licensing details. type: charm diff --git a/config.yaml b/config.yaml index 8e8c31a6..d9654122 100644 --- a/config.yaml +++ b/config.yaml @@ -1,4 +1,4 @@ -# Copyright 2024 Canonical Ltd. +# Copyright 2025 Canonical Ltd. # See LICENSE file for licensing details. options: diff --git a/generate-src-docs.sh b/generate-src-docs.sh index d13066a1..4e96bc21 100755 --- a/generate-src-docs.sh +++ b/generate-src-docs.sh @@ -1,6 +1,6 @@ #!/usr/bin/env bash -# Copyright 2024 Canonical Ltd. +# Copyright 2025 Canonical Ltd. # See LICENSE file for licensing details. lazydocs --no-watermark --output-path src-docs src/* diff --git a/jenkins_rock/rockcraft.yaml b/jenkins_rock/rockcraft.yaml index 42e3ace6..46090448 100644 --- a/jenkins_rock/rockcraft.yaml +++ b/jenkins_rock/rockcraft.yaml @@ -1,4 +1,4 @@ -# Copyright 2024 Canonical Ltd. +# Copyright 2025 Canonical Ltd. # See LICENSE file for licensing details. name: jenkins diff --git a/lib/charms/traefik_k8s/v2/ingress.py b/lib/charms/traefik_k8s/v2/ingress.py index 6a72e70c..a57b1eab 100644 --- a/lib/charms/traefik_k8s/v2/ingress.py +++ b/lib/charms/traefik_k8s/v2/ingress.py @@ -1,4 +1,4 @@ -# Copyright 2024 Canonical Ltd. +# Copyright 2025 Canonical Ltd. # See LICENSE file for licensing details. r"""# Interface Library for ingress. diff --git a/metadata.yaml b/metadata.yaml index 8545b080..97272aa6 100644 --- a/metadata.yaml +++ b/metadata.yaml @@ -1,4 +1,4 @@ -# Copyright 2024 Canonical Ltd. +# Copyright 2025 Canonical Ltd. # See LICENSE file for licensing details. name: jenkins-k8s diff --git a/pyproject.toml b/pyproject.toml index 28a32365..df462db1 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,4 +1,4 @@ -# Copyright 2024 Canonical Ltd. +# Copyright 2025 Canonical Ltd. # See LICENSE file for licensing details. [tool.bandit] diff --git a/src/actions.py b/src/actions.py index 4368b1ba..2f3c4827 100644 --- a/src/actions.py +++ b/src/actions.py @@ -1,4 +1,4 @@ -# Copyright 2024 Canonical Ltd. +# Copyright 2025 Canonical Ltd. # See LICENSE file for licensing details. """Jenkins charm actions.""" diff --git a/src/agent.py b/src/agent.py index 3d9c27bd..a45541e9 100644 --- a/src/agent.py +++ b/src/agent.py @@ -1,4 +1,4 @@ -# Copyright 2024 Canonical Ltd. +# Copyright 2025 Canonical Ltd. # See LICENSE file for licensing details. """The Jenkins agent relation observer.""" diff --git a/src/auth_proxy.py b/src/auth_proxy.py index e5458c0a..e406c53f 100644 --- a/src/auth_proxy.py +++ b/src/auth_proxy.py @@ -1,4 +1,4 @@ -# Copyright 2024 Canonical Ltd. +# Copyright 2025 Canonical Ltd. # See LICENSE file for licensing details. """Observer module for Jenkins to auth_proxy integration.""" diff --git a/src/charm.py b/src/charm.py index 5e2d4f8b..7b8576a0 100755 --- a/src/charm.py +++ b/src/charm.py @@ -1,6 +1,6 @@ #!/usr/bin/env python3 -# Copyright 2024 Canonical Ltd. +# Copyright 2025 Canonical Ltd. # See LICENSE file for licensing details. """Charm Jenkins.""" diff --git a/src/cos.py b/src/cos.py index 532ed90c..166fd5aa 100644 --- a/src/cos.py +++ b/src/cos.py @@ -1,4 +1,4 @@ -# Copyright 2024 Canonical Ltd. +# Copyright 2025 Canonical Ltd. # See LICENSE file for licensing details. """Observer module for Jenkins to COS integration.""" diff --git a/src/ingress.py b/src/ingress.py index 3dbf21f0..6c4a32e0 100644 --- a/src/ingress.py +++ b/src/ingress.py @@ -1,4 +1,4 @@ -# Copyright 2024 Canonical Ltd. +# Copyright 2025 Canonical Ltd. # See LICENSE file for licensing details. """Observer module for Jenkins to ingress integration.""" diff --git a/src/jenkins.py b/src/jenkins.py index 95cf99a6..0b470c88 100644 --- a/src/jenkins.py +++ b/src/jenkins.py @@ -1,4 +1,4 @@ -# Copyright 2024 Canonical Ltd. +# Copyright 2025 Canonical Ltd. # See LICENSE file for licensing details. """Functions to operate Jenkins.""" diff --git a/src/pebble.py b/src/pebble.py index fca5ca25..1e774c2a 100644 --- a/src/pebble.py +++ b/src/pebble.py @@ -1,4 +1,4 @@ -# Copyright 2024 Canonical Ltd. +# Copyright 2025 Canonical Ltd. # See LICENSE file for licensing details. """Pebble functionality.""" diff --git a/src/state.py b/src/state.py index 2e3cad23..651c10e0 100644 --- a/src/state.py +++ b/src/state.py @@ -1,4 +1,4 @@ -# Copyright 2024 Canonical Ltd. +# Copyright 2025 Canonical Ltd. # See LICENSE file for licensing details. """Jenkins States.""" diff --git a/src/timerange.py b/src/timerange.py index 906454f2..79f8eb1b 100644 --- a/src/timerange.py +++ b/src/timerange.py @@ -1,4 +1,4 @@ -# Copyright 2024 Canonical Ltd. +# Copyright 2025 Canonical Ltd. # See LICENSE file for licensing details. """The module for checking time ranges.""" diff --git a/templates/logging.properties b/templates/logging.properties index ad242040..3fdc69c9 100644 --- a/templates/logging.properties +++ b/templates/logging.properties @@ -1,4 +1,4 @@ -# Copyright 2024 Canonical Ltd. +# Copyright 2025 Canonical Ltd. # See LICENSE file for licensing details. # Use with java logging property diff --git a/tests/__init__.py b/tests/__init__.py index 289a5245..073ccfce 100644 --- a/tests/__init__.py +++ b/tests/__init__.py @@ -1,4 +1,4 @@ -# Copyright 2024 Canonical Ltd. +# Copyright 2025 Canonical Ltd. # See LICENSE file for licensing details. """Tests module.""" diff --git a/tests/conftest.py b/tests/conftest.py index db61e17a..ac673729 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -1,4 +1,4 @@ -# Copyright 2024 Canonical Ltd. +# Copyright 2025 Canonical Ltd. # See LICENSE file for licensing details. """Fixtures for jenkins-k8s charm tests.""" diff --git a/tests/integration/__init__.py b/tests/integration/__init__.py index 887614c7..544f89c2 100644 --- a/tests/integration/__init__.py +++ b/tests/integration/__init__.py @@ -1,4 +1,4 @@ -# Copyright 2024 Canonical Ltd. +# Copyright 2025 Canonical Ltd. # See LICENSE file for licensing details. """Integration tests module.""" diff --git a/tests/integration/conftest.py b/tests/integration/conftest.py index b06a43f4..95a51c3a 100644 --- a/tests/integration/conftest.py +++ b/tests/integration/conftest.py @@ -1,4 +1,4 @@ -# Copyright 2024 Canonical Ltd. +# Copyright 2025 Canonical Ltd. # See LICENSE file for licensing details. """Fixtures for Jenkins-k8s-operator charm integration tests.""" @@ -19,7 +19,6 @@ import requests from juju.action import Action from juju.application import Application -from juju.client._definitions import FullStatus, UnitStatus from juju.model import Controller, Model from juju.unit import Unit from keycloak import KeycloakAdmin, KeycloakOpenIDConnection @@ -38,7 +37,7 @@ get_dex_service_url, update_redirect_uri, ) -from .helpers import generate_jenkins_client_from_application, get_pod_ip +from .helpers import generate_jenkins_client_from_application, get_model_unit_addresses, get_pod_ip from .types_ import KeycloakOIDCMetadata, LDAPSettings, ModelAppUnit, UnitWebClient KUBECONFIG = os.environ.get("TESTING_KUBECONFIG", "./kube-config") @@ -129,13 +128,9 @@ def model_app_unit_fixture(model: Model, application: Application, unit: Unit): @pytest_asyncio.fixture(scope="module", name="unit_ip") async def unit_ip_fixture(model: Model, application: Application): """Get Jenkins charm unit IP.""" - status: FullStatus = await model.get_status([application.name]) - try: - unit_status: UnitStatus = next(iter(status.applications[application.name].units.values())) - assert unit_status.address, "Invalid unit address" - return unit_status.address - except StopIteration as exc: - raise StopIteration("Invalid unit status") from exc + unit_ips = await get_model_unit_addresses(model=model, app_name=application.name) + assert unit_ips, f"Unit IP address not found for {application.name}" + return unit_ips[0] @pytest.fixture(scope="module", name="web_address") @@ -480,15 +475,9 @@ async def jenkins_with_proxy_fixture( @pytest_asyncio.fixture(scope="module", name="proxy_jenkins_unit_ip") async def proxy_jenkins_unit_ip_fixture(model: Model, jenkins_with_proxy: Application): """Get Jenkins charm w/ proxy enabled unit IP.""" - status: FullStatus = await model.get_status([jenkins_with_proxy.name]) - try: - unit_status: UnitStatus = next( - iter(status.applications[jenkins_with_proxy.name].units.values()) - ) - assert unit_status.address, "Invalid unit address" - return unit_status.address - except StopIteration as exc: - raise StopIteration("Invalid unit status") from exc + unit_ips = await get_model_unit_addresses(model=model, app_name=jenkins_with_proxy.name) + assert unit_ips, f"Unit IP address not found for {jenkins_with_proxy.name}" + return unit_ips[0] @pytest_asyncio.fixture(scope="module", name="proxy_jenkins_web_address") @@ -781,10 +770,9 @@ async def traefik_application_fixture(model: Model): await model.wait_for_idle( status="active", apps=[traefik.name], timeout=20 * 60, idle_period=30, raise_on_error=False ) - status = await model.get_status(filters=[traefik.name]) - unit = next(iter(status.applications[traefik.name].units)) - traefik_address = status["applications"][traefik.name]["units"][unit]["address"] - return (traefik, traefik_address) + unit_ips = await get_model_unit_addresses(model=model, app_name=traefik.name) + assert unit_ips, f"Unit IP address not found for {traefik.name}" + return (traefik, unit_ips[0]) @pytest_asyncio.fixture(scope="module", name="oathkeeper_related") diff --git a/tests/integration/constants.py b/tests/integration/constants.py index 72ae55d0..bba1d488 100644 --- a/tests/integration/constants.py +++ b/tests/integration/constants.py @@ -1,4 +1,4 @@ -# Copyright 2024 Canonical Ltd. +# Copyright 2025 Canonical Ltd. # See LICENSE file for licensing details. """Constants for Jenkins-k8s-operator charm integration tests.""" diff --git a/tests/integration/dex.py b/tests/integration/dex.py index c7256b76..0b6e4892 100644 --- a/tests/integration/dex.py +++ b/tests/integration/dex.py @@ -1,4 +1,4 @@ -# Copyright 2024 Canonical Ltd. +# Copyright 2025 Canonical Ltd. # See LICENSE file for licensing details. """DEX deployment and utilities for testing.""" diff --git a/tests/integration/helpers.py b/tests/integration/helpers.py index c0b2e6b8..fa2a305a 100644 --- a/tests/integration/helpers.py +++ b/tests/integration/helpers.py @@ -1,4 +1,4 @@ -# Copyright 2024 Canonical Ltd. +# Copyright 2025 Canonical Ltd. # See LICENSE file for licensing details. """Helpers for Jenkins-k8s-operator charm integration tests.""" @@ -14,6 +14,7 @@ import requests import tenacity from juju.application import Application +from juju.client._definitions import ApplicationStatus, FullStatus, UnitStatus from juju.model import Model from juju.unit import Unit from pytest_operator.plugin import OpsTest @@ -70,7 +71,7 @@ async def install_plugins( ) -async def get_model_jenkins_unit_address(model: Model, app_name: str): +async def get_model_unit_addresses(model: Model, app_name: str) -> list[str]: """Extract the address of a given unit. Args: @@ -80,10 +81,18 @@ async def get_model_jenkins_unit_address(model: Model, app_name: str): Returns: the IP address of the Jenkins unit. """ - status = await model.get_status() - unit = list(status.applications[app_name].units)[0] - address = status["applications"][app_name]["units"][unit]["address"] - return address + status: FullStatus = await model.get_status() + # mypy cannot infer the type ApplicationStatus but thinks its the base class type "Type". + application_status: ApplicationStatus | None = status.applications[app_name] # type: ignore + assert application_status, f"Application status {app_name} not found in {status}" + # mypy cannot infer the type UnitStatus but thinks its the base class type "Type". + unit_status_map: dict[typing.Any, UnitStatus | None] = application_status.units # type: ignore + units_statuses: list[UnitStatus | None] = list(unit_status_map.values()) + return [ + str(unit_status.address) + for unit_status in units_statuses + if unit_status and unit_status.address + ] def gen_test_job_xml(node_label: str): @@ -314,8 +323,9 @@ async def generate_unit_web_client_from_application( A Jenkins web client. """ assert model - unit_ip = await get_model_jenkins_unit_address(model, jenkins_app.name) - address = f"http://{unit_ip}:8080" + unit_ips = await get_model_unit_addresses(model, jenkins_app.name) + assert unit_ips, f"Unit IP address not found for {jenkins_app.name}" + address = f"http://{unit_ips[0]}:8080" jenkins_unit = jenkins_app.units[0] jenkins_client = await generate_jenkins_client_from_application(ops_test, jenkins_app, address) unit_web_client = UnitWebClient(unit=jenkins_unit, web=address, client=jenkins_client) diff --git a/tests/integration/pre_run_script.sh b/tests/integration/pre_run_script.sh index 572718d7..cf037fec 100644 --- a/tests/integration/pre_run_script.sh +++ b/tests/integration/pre_run_script.sh @@ -1,6 +1,6 @@ #!/bin/bash -# Copyright 2024 Canonical Ltd. +# Copyright 2025 Canonical Ltd. # See LICENSE file for licensing details. # Pre-run script for integration test operator-workflows action. diff --git a/tests/integration/substrings.py b/tests/integration/substrings.py index be7b8f04..2b6ba400 100644 --- a/tests/integration/substrings.py +++ b/tests/integration/substrings.py @@ -1,4 +1,4 @@ -# Copyright 2024 Canonical Ltd. +# Copyright 2025 Canonical Ltd. # See LICENSE file for licensing details. """Helper functions for tests.""" diff --git a/tests/integration/test_auth_proxy.py b/tests/integration/test_auth_proxy.py index 8815c323..140da2cb 100644 --- a/tests/integration/test_auth_proxy.py +++ b/tests/integration/test_auth_proxy.py @@ -1,4 +1,4 @@ -# Copyright 2024 Canonical Ltd. +# Copyright 2025 Canonical Ltd. # See LICENSE file for licensing details. """Integration tests for jenkins-k8s-operator with auth_proxy.""" diff --git a/tests/integration/test_cos.py b/tests/integration/test_cos.py index c3ca966e..63ff7682 100644 --- a/tests/integration/test_cos.py +++ b/tests/integration/test_cos.py @@ -1,4 +1,4 @@ -# Copyright 2024 Canonical Ltd. +# Copyright 2025 Canonical Ltd. # See LICENSE file for licensing details. """Integration tests for jenkins-k8s-operator with COS.""" @@ -11,11 +11,10 @@ import requests from juju.action import Action from juju.application import Application -from juju.client._definitions import FullStatus from juju.model import Model from kubernetes.client import CoreV1Api -from .helpers import wait_for +from .helpers import get_model_unit_addresses, wait_for from .types_ import UnitWebClient logger = logging.getLogger(__name__) @@ -36,11 +35,10 @@ async def test_prometheus_integration( assert res.status_code == 200 model: Model = unit_web_client.unit.model - status: FullStatus = await model.get_status(filters=[prometheus_related.name]) - for unit in status.applications[prometheus_related.name].units.values(): - query_targets = requests.get( - f"http://{unit.address}:9090/api/v1/targets", timeout=10 - ).json() + unit_ips = await get_model_unit_addresses(model=model, app_name=prometheus_related.name) + assert unit_ips, f"Unit IP address not found for {prometheus_related.name}" + for ip in unit_ips: + query_targets = requests.get(f"http://{ip}:9090/api/v1/targets", timeout=10).json() assert len(query_targets["data"]["activeTargets"]) @@ -85,12 +83,13 @@ async def test_loki_integration( loki to scrape. """ model: Model = unit_web_client.unit.model - status: FullStatus = await model.get_status(filters=[loki_related.name]) - for unit in status.applications[loki_related.name].units.values(): + unit_ips = await get_model_unit_addresses(model=model, app_name=loki_related.name) + assert unit_ips, f"Unit IP address not found for {loki_related.name}" + for ip in unit_ips: await wait_for( functools.partial( log_files_exist, - unit.address, + ip, application.name, ("/var/lib/jenkins/logs/jenkins.log",), ), @@ -151,20 +150,20 @@ async def test_grafana_integration( assert: grafana Jenkins dashboard can be found """ model: Model = application.model - status: FullStatus = await model.get_status(filters=[grafana_related.name]) action: Action = await grafana_related.units[0].run_action("get-admin-password") await action.wait() password = action.results["admin-password"] - for unit in status.applications[grafana_related.name].units.values(): + unit_ips = await get_model_unit_addresses(model=model, app_name=grafana_related.name) + for ip in unit_ips: sess = requests.session() sess.post( - f"http://{unit.address}:3000/login", + f"http://{ip}:3000/login", json={ "user": "admin", "password": password, }, ).raise_for_status() await wait_for( - functools.partial(dashboard_exist, loggedin_session=sess, unit_address=unit.address), + functools.partial(dashboard_exist, loggedin_session=sess, unit_address=ip), timeout=60 * 20, ) diff --git a/tests/integration/test_external_agent.py b/tests/integration/test_external_agent.py index 6fc7bfa3..40c6e26e 100644 --- a/tests/integration/test_external_agent.py +++ b/tests/integration/test_external_agent.py @@ -1,4 +1,4 @@ -# Copyright 2024 Canonical Ltd. +# Copyright 2025 Canonical Ltd. # See LICENSE file for licensing details. """Integration tests for jenkins-k8s-operator with ingress.""" diff --git a/tests/integration/test_ingress.py b/tests/integration/test_ingress.py index 5fa732e0..05ca252a 100644 --- a/tests/integration/test_ingress.py +++ b/tests/integration/test_ingress.py @@ -1,4 +1,4 @@ -# Copyright 2024 Canonical Ltd. +# Copyright 2025 Canonical Ltd. # See LICENSE file for licensing details. """Integration tests for jenkins-k8s-operator with ingress.""" diff --git a/tests/integration/test_jenkins.py b/tests/integration/test_jenkins.py index 69fff929..268b222b 100644 --- a/tests/integration/test_jenkins.py +++ b/tests/integration/test_jenkins.py @@ -1,4 +1,4 @@ -# Copyright 2024 Canonical Ltd. +# Copyright 2025 Canonical Ltd. # See LICENSE file for licensing details. """Integration tests for jenkins-k8s-operator charm.""" diff --git a/tests/integration/test_k8s_agent.py b/tests/integration/test_k8s_agent.py index 82ce4f78..8eca9c0f 100644 --- a/tests/integration/test_k8s_agent.py +++ b/tests/integration/test_k8s_agent.py @@ -1,4 +1,4 @@ -# Copyright 2024 Canonical Ltd. +# Copyright 2025 Canonical Ltd. # See LICENSE file for licensing details. """Integration tests for jenkins-k8s-operator charm.""" diff --git a/tests/integration/test_machine_agent.py b/tests/integration/test_machine_agent.py index 8103896f..5555ab4c 100644 --- a/tests/integration/test_machine_agent.py +++ b/tests/integration/test_machine_agent.py @@ -1,4 +1,4 @@ -# Copyright 2024 Canonical Ltd. +# Copyright 2025 Canonical Ltd. # See LICENSE file for licensing details. """Integration tests for jenkins-k8s-operator charm.""" diff --git a/tests/integration/test_plugins_part_1.py b/tests/integration/test_plugins_part_1.py index 073d390a..fe2835b3 100644 --- a/tests/integration/test_plugins_part_1.py +++ b/tests/integration/test_plugins_part_1.py @@ -1,4 +1,4 @@ -# Copyright 2024 Canonical Ltd. +# Copyright 2025 Canonical Ltd. # See LICENSE file for licensing details. """Integration tests for jenkins-k8s-operator charm.""" diff --git a/tests/integration/test_plugins_part_2.py b/tests/integration/test_plugins_part_2.py index 91efaa0f..b4e9c1b5 100644 --- a/tests/integration/test_plugins_part_2.py +++ b/tests/integration/test_plugins_part_2.py @@ -1,4 +1,4 @@ -# Copyright 2024 Canonical Ltd. +# Copyright 2025 Canonical Ltd. # See LICENSE file for licensing details. """Integration tests for jenkins-k8s-operator charm.""" diff --git a/tests/integration/test_proxy.py b/tests/integration/test_proxy.py index e0eda97f..ca37c33d 100644 --- a/tests/integration/test_proxy.py +++ b/tests/integration/test_proxy.py @@ -1,4 +1,4 @@ -# Copyright 2024 Canonical Ltd. +# Copyright 2025 Canonical Ltd. # See LICENSE file for licensing details. """Integration tests for jenkins-k8s-operator charm proxy settings.""" diff --git a/tests/integration/test_upgrade.py b/tests/integration/test_upgrade.py index 7cbae498..ef819f7c 100644 --- a/tests/integration/test_upgrade.py +++ b/tests/integration/test_upgrade.py @@ -1,4 +1,4 @@ -# Copyright 2024 Canonical Ltd. +# Copyright 2025 Canonical Ltd. # See LICENSE file for licensing details. """Integration test relation file.""" @@ -17,7 +17,7 @@ from .helpers import ( gen_git_test_job_xml, generate_unit_web_client_from_application, - get_model_jenkins_unit_address, + get_model_unit_addresses, ) LOGGER = logging.getLogger(__name__) @@ -56,14 +56,16 @@ async def test_jenkins_upgrade_check_job( assert: if Jenkins versions differ, the job persists. """ application = model.applications[JENKINS_APP_NAME] - unit_ip = await get_model_jenkins_unit_address(model, JENKINS_APP_NAME) - address = f"http://{unit_ip}:8080" + unit_ips = await get_model_unit_addresses(model, JENKINS_APP_NAME) + assert unit_ips, f"Unit IP address not found for {JENKINS_APP_NAME}" + address = f"http://{unit_ips[0]}:8080" response = requests.get(address, timeout=60) old_version = response.headers["X-Jenkins"] await application.refresh(path=charm, resources={"jenkins-image": jenkins_image}) await model.wait_for_idle(status="active", timeout=10 * 60) - unit_ip = await get_model_jenkins_unit_address(model, JENKINS_APP_NAME) - address = f"http://{unit_ip}:8080" + unit_ips = await get_model_unit_addresses(model, JENKINS_APP_NAME) + assert unit_ips, f"Unit IP address not found for {JENKINS_APP_NAME}" + address = f"http://{unit_ips[0]}:8080" response = requests.get(address, timeout=60) if old_version != response.headers["X-Jenkins"]: unit_web_client = await generate_unit_web_client_from_application( diff --git a/tests/integration/types_.py b/tests/integration/types_.py index 36318521..165200b1 100644 --- a/tests/integration/types_.py +++ b/tests/integration/types_.py @@ -1,4 +1,4 @@ -# Copyright 2024 Canonical Ltd. +# Copyright 2025 Canonical Ltd. # See LICENSE file for licensing details. """Types for integration tests module.""" diff --git a/tests/unit/__init__.py b/tests/unit/__init__.py index 3b606824..3d0925f9 100644 --- a/tests/unit/__init__.py +++ b/tests/unit/__init__.py @@ -1,4 +1,4 @@ -# Copyright 2024 Canonical Ltd. +# Copyright 2025 Canonical Ltd. # See LICENSE file for licensing details. """Unit tests module.""" diff --git a/tests/unit/conftest.py b/tests/unit/conftest.py index a6d9f2d4..bfe7cb59 100644 --- a/tests/unit/conftest.py +++ b/tests/unit/conftest.py @@ -1,4 +1,4 @@ -# Copyright 2024 Canonical Ltd. +# Copyright 2025 Canonical Ltd. # See LICENSE file for licensing details. """Fixtures for Jenkins-k8s-operator charm unit tests.""" diff --git a/tests/unit/helpers.py b/tests/unit/helpers.py index 9c3ff7ed..49dd2c7b 100644 --- a/tests/unit/helpers.py +++ b/tests/unit/helpers.py @@ -1,4 +1,4 @@ -# Copyright 2024 Canonical Ltd. +# Copyright 2025 Canonical Ltd. # See LICENSE file for licensing details. """Helper functions used to unit test Jenkins charm.""" diff --git a/tests/unit/test_actions.py b/tests/unit/test_actions.py index fc7029e6..a99757f5 100644 --- a/tests/unit/test_actions.py +++ b/tests/unit/test_actions.py @@ -1,4 +1,4 @@ -# Copyright 2024 Canonical Ltd. +# Copyright 2025 Canonical Ltd. # See LICENSE file for licensing details. """Jenkins-k8s charm actions unit tests.""" diff --git a/tests/unit/test_agent.py b/tests/unit/test_agent.py index 4d4fd0fc..a4c856b0 100644 --- a/tests/unit/test_agent.py +++ b/tests/unit/test_agent.py @@ -1,4 +1,4 @@ -# Copyright 2024 Canonical Ltd. +# Copyright 2025 Canonical Ltd. # See LICENSE file for licensing details. """Jenkins-k8s charm agent unit tests.""" diff --git a/tests/unit/test_auth_proxy.py b/tests/unit/test_auth_proxy.py index f877a1b1..a479dd3b 100644 --- a/tests/unit/test_auth_proxy.py +++ b/tests/unit/test_auth_proxy.py @@ -1,4 +1,4 @@ -# Copyright 2024 Canonical Ltd. +# Copyright 2025 Canonical Ltd. # See LICENSE file for licensing details. """Jenkins-k8s auth_proxy unit tests.""" diff --git a/tests/unit/test_charm.py b/tests/unit/test_charm.py index 6b3812b3..8b59ae3f 100644 --- a/tests/unit/test_charm.py +++ b/tests/unit/test_charm.py @@ -1,4 +1,4 @@ -# Copyright 2024 Canonical Ltd. +# Copyright 2025 Canonical Ltd. # See LICENSE file for licensing details. """Jenkins-k8s charm unit tests.""" diff --git a/tests/unit/test_ingress.py b/tests/unit/test_ingress.py index 86359d39..fbeada3f 100644 --- a/tests/unit/test_ingress.py +++ b/tests/unit/test_ingress.py @@ -1,4 +1,4 @@ -# Copyright 2024 Canonical Ltd. +# Copyright 2025 Canonical Ltd. # See LICENSE file for licensing details. """Jenkins-k8s ingress unit tests.""" diff --git a/tests/unit/test_jenkins.py b/tests/unit/test_jenkins.py index 39d0d87b..c249be96 100644 --- a/tests/unit/test_jenkins.py +++ b/tests/unit/test_jenkins.py @@ -1,4 +1,4 @@ -# Copyright 2024 Canonical Ltd. +# Copyright 2025 Canonical Ltd. # See LICENSE file for licensing details. """Jenkins-k8s jenkins module tests.""" diff --git a/tests/unit/test_pebble.py b/tests/unit/test_pebble.py index 013bbb07..efb27302 100644 --- a/tests/unit/test_pebble.py +++ b/tests/unit/test_pebble.py @@ -1,4 +1,4 @@ -# Copyright 2024 Canonical Ltd. +# Copyright 2025 Canonical Ltd. # See LICENSE file for licensing details. """Unit tests for the pebble module.""" diff --git a/tests/unit/test_state.py b/tests/unit/test_state.py index 8bc97bde..0d4ff0dd 100644 --- a/tests/unit/test_state.py +++ b/tests/unit/test_state.py @@ -1,4 +1,4 @@ -# Copyright 2024 Canonical Ltd. +# Copyright 2025 Canonical Ltd. # See LICENSE file for licensing details. """Jenkins-k8s state module tests.""" diff --git a/tests/unit/test_timerange.py b/tests/unit/test_timerange.py index 33c72db3..7f38de31 100644 --- a/tests/unit/test_timerange.py +++ b/tests/unit/test_timerange.py @@ -1,4 +1,4 @@ -# Copyright 2024 Canonical Ltd. +# Copyright 2025 Canonical Ltd. # See LICENSE file for licensing details. """Jenkins-k8s time range module tests.""" diff --git a/tests/unit/types_.py b/tests/unit/types_.py index 792bfd51..c04e6ec0 100644 --- a/tests/unit/types_.py +++ b/tests/unit/types_.py @@ -1,4 +1,4 @@ -# Copyright 2024 Canonical Ltd. +# Copyright 2025 Canonical Ltd. # See LICENSE file for licensing details. """Types used for unit testing Jenkins.""" diff --git a/tox.ini b/tox.ini index 5b5075e3..33ffe737 100644 --- a/tox.ini +++ b/tox.ini @@ -1,4 +1,4 @@ -# Copyright 2024 Canonical Ltd. +# Copyright 2025 Canonical Ltd. # See LICENSE file for licensing details. [tox]