Skip to content

Commit

Permalink
Add label interpolation to repo baseurl
Browse files Browse the repository at this point in the history
Fixes: #36
  • Loading branch information
lubomir committed Aug 29, 2024
1 parent cc37c56 commit f1da167
Show file tree
Hide file tree
Showing 4 changed files with 89 additions and 4 deletions.
11 changes: 11 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,16 @@
# Changelog

## Unreleased

### Added

- The repos specified directly in the input file can now interpolate base image
labels too. The specification for which image to use is the same as for the
repofiles origin.

This only works for `baseurl`.


## [0.7.0] - 2024-08-05

### Added
Expand Down
7 changes: 6 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,12 @@ contentOrigin:
repos:
# List of objects with repoid and baseurl
- repoid: fedora
baseurl: https://kojipkgs.fedoraproject.org/compose/rawhide/latest-Fedora-Rawhide/compose/Everything/$basearch/os/
baseurl: https://kojipkgs.fedoraproject.org/compose/rawhide/{compose-id}/compose/Everything/$basearch/os/
# The baseurl can reference labels from a base image, such as the
# compose-id above. The image to get the labels from can be specified
# either directly or via a Containerfile.
varsFromImage: registry.fedoraproject.org/fedora:latest
varsFromContainerfile: Containerfile
# You can list any option that would be in .repo file here too.
# For example sslverify, proxy or excludepkgs might be of interest
repofiles:
Expand Down
21 changes: 18 additions & 3 deletions rpm_lockfile/content_origin/repos.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
import os

from . import Repo
from .. import utils


class RepoOrigin:
Expand All @@ -7,12 +10,24 @@ class RepoOrigin:
"properties": {
"repoid": {"type": "string"},
"baseurl": {"type": "string"},
"varsFromImage": {"type": "string"},
"varsFromContainerfile": {"type": "string"},
},
"required": ["repoid", "baseurl"],
}

def __init__(self, *args, **kwargs):
pass
def __init__(self, config_dir):
self.config_dir = config_dir

def collect(self, sources):
yield from (Repo.from_dict(s) for s in sources)
for source in sources:
image = source.pop("varsFromImage", None)
containerfile = source.pop("varsFromContainerfile", None)
vars = utils.get_labels(image, self._get_container_file(containerfile))
source["baseurl"] = utils.subst_vars(source["baseurl"], vars)
yield Repo.from_dict(source)

def _get_container_file(self, containerfile):
if containerfile:
return os.path.join(self.config_dir, containerfile)
return None
54 changes: 54 additions & 0 deletions tests/content_origin/test_repos.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
from unittest.mock import patch

from rpm_lockfile.content_origin import Repo
from rpm_lockfile.content_origin.repos import RepoOrigin


def test_collect_simple(tmpdir):
baseurl = "https://example.com/repo"
config = [{"repoid": "a", "baseurl": baseurl}]
origin = RepoOrigin(tmpdir)
repos = list(origin.collect(config))

assert repos == [Repo(repoid="a", baseurl=baseurl)]


LABELS = {
"vcs-ref": "abcdef",
"architecture": "x86_64",
}

TEMPLATE_CONFIG = {
"repoid": "a", "baseurl": "https://example.com/{architecture}/repo"
}
EXPANDED_REPO = Repo(repoid="a", baseurl="https://example.com/x86_64/repo")


def test_collect_with_vars_from_image(tmpdir):
origin = RepoOrigin(tmpdir)
image = "registry.example.com/image:latest"

with patch("rpm_lockfile.utils.get_labels") as mock_get_labels:
mock_get_labels.return_value = LABELS
repos = list(origin.collect([TEMPLATE_CONFIG | {"varsFromImage": image}]))

assert repos == [EXPANDED_REPO]
mock_get_labels.assert_called_once_with(image, None)


def test_collect_with_vars_from_containerfile(tmpdir):
origin = RepoOrigin(tmpdir)
(tmpdir / "Containerfile").write_text(
"FROM registry.example.com/image:latest\nRUN date\n", encoding="utf-8"
)

with patch("rpm_lockfile.utils.get_labels") as mock_get_labels:
mock_get_labels.return_value = LABELS
repos = list(
origin.collect(
[TEMPLATE_CONFIG | {"varsFromContainerfile": "Containerfile"}]
)
)

assert repos == [EXPANDED_REPO]
mock_get_labels.assert_called_once_with(None, tmpdir / "Containerfile")

0 comments on commit f1da167

Please sign in to comment.