From a3834e7fad877c94c0e4b8a525d2455178e127e0 Mon Sep 17 00:00:00 2001 From: Tiago Nobrega Date: Tue, 23 Apr 2024 17:02:14 -0300 Subject: [PATCH] fix: use local keys for package-repos in core24 Fixes #4743 --- snapcraft/services/lifecycle.py | 10 ++++++ .../snap/snapcraft.yaml | 2 ++ tests/unit/services/test_lifecycle.py | 35 +++++++++++++++++++ 3 files changed, 47 insertions(+) diff --git a/snapcraft/services/lifecycle.py b/snapcraft/services/lifecycle.py index 6286f04f7d..ebd9f259f9 100644 --- a/snapcraft/services/lifecycle.py +++ b/snapcraft/services/lifecycle.py @@ -29,6 +29,7 @@ from overrides import overrides from snapcraft import __version__, errors, models, os_release, parts, utils +from snapcraft.parts.yaml_utils import get_snap_project class Lifecycle(LifecycleService): @@ -169,6 +170,15 @@ def generate_manifest(self) -> models.Manifest: primed_stage_packages=sorted(primed_stage_packages), ) + @overrides + def _get_local_keys_path(self) -> Path | None: + snap_project = get_snap_project() + keys_dir = snap_project.assets_dir / "keys" + if keys_dir.is_dir(): + return keys_dir + + return None + def get_prime_dirs_from_project(project_info: ProjectInfo) -> dict[str | None, Path]: """Get a mapping of component names to prime directories from a ProjectInfo. diff --git a/tests/spread/core24/package-repositories/test-apt-key-fingerprint/snap/snapcraft.yaml b/tests/spread/core24/package-repositories/test-apt-key-fingerprint/snap/snapcraft.yaml index b01aab904e..3b74a3bef3 100644 --- a/tests/spread/core24/package-repositories/test-apt-key-fingerprint/snap/snapcraft.yaml +++ b/tests/spread/core24/package-repositories/test-apt-key-fingerprint/snap/snapcraft.yaml @@ -25,3 +25,5 @@ package-repositories: suites: [focal] key-id: 78E1918602959B9C59103100F1831DDAFC42E99D url: http://ppa.launchpad.net/snappy-dev/snapcraft-daily/ubuntu + # Set an invalid keyserver here to force the use of the local key + key-server: keyserver.invalid.com diff --git a/tests/unit/services/test_lifecycle.py b/tests/unit/services/test_lifecycle.py index 2141056c26..950b45002d 100644 --- a/tests/unit/services/test_lifecycle.py +++ b/tests/unit/services/test_lifecycle.py @@ -19,6 +19,7 @@ import platform import shutil import sys +from pathlib import Path from unittest import mock import pytest @@ -220,3 +221,37 @@ def test_lifecycle_installs_gpg_dirmngr(lifecycle_service, mocker): mock_install.assert_called_once_with( ["gpg", "dirmngr"], refresh_package_cache=False ) + + +@pytest.mark.parametrize( + ("project_location", "assets_dir", "expected_keys_path"), + [ + # These locations come from yaml_utils._SNAP_PROJECT_FILES + # snapcraft.yaml locations where the keys are expected to be in snap/keys + ("snapcraft.yaml", "snap", "snap/keys"), + ("snap/snapcraft.yaml", "snap", "snap/keys"), + (".snapcraft.yaml", "snap", "snap/keys"), + # snapcraft.yaml location where the keys are expected to be somewhere else + ("build-aux/snap/snapcraft.yaml", "build-aux/snap", "build-aux/snap/keys"), + ], +) +def test_local_keys_path( + new_dir, lifecycle_service, project_location, assets_dir, expected_keys_path +): + """Check that _get_local_keys_path() is correct given the location of snapcraft.yaml.""" + snap_dir = new_dir / Path(project_location).parent + snap_dir.mkdir(exist_ok=True, parents=True) + + # The project file itself doesn't really matter, but must exist + project_yaml = snap_dir / "snapcraft.yaml" + project_yaml.touch() + + # app = application.create_app() + keys_dir = Path(assets_dir) / "keys" + + # If the keys dir doesn't exist the method should return None + assert not keys_dir.is_dir() + assert lifecycle_service._get_local_keys_path() is None + + keys_dir.mkdir(exist_ok=True, parents=True) + assert lifecycle_service._get_local_keys_path() == Path(expected_keys_path)