Skip to content

Commit b71d79d

Browse files
Workaround for GL canonical names without a commit ID and changes for ADR (#306)
* Add workaround to accept GL canonical names without a commit ID * Allow artifact base names for S3 uploads to differ from GL canonical names * Fix `gardenlinux_epoch` value of S3 artifact metadata and add test for it Signed-off-by: Tobias Wolf <wolf@b1-systems.de> On-behalf-of: SAP <tobias.wolf@sap.com>
1 parent 7535722 commit b71d79d

File tree

13 files changed

+223
-105
lines changed

13 files changed

+223
-105
lines changed

.github/actions/features_parse/action.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ outputs:
1111
runs:
1212
using: composite
1313
steps:
14-
- uses: gardenlinux/python-gardenlinux-lib/.github/actions/setup@0.10.10
14+
- uses: gardenlinux/python-gardenlinux-lib/.github/actions/setup@0.10.11
1515
- id: result
1616
shell: bash
1717
run: |

.github/actions/flavors_parse/action.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ outputs:
1313
runs:
1414
using: composite
1515
steps:
16-
- uses: gardenlinux/python-gardenlinux-lib/.github/actions/setup@0.10.10
16+
- uses: gardenlinux/python-gardenlinux-lib/.github/actions/setup@0.10.11
1717
- id: matrix
1818
shell: bash
1919
run: |

.github/actions/setup/action.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ description: Installs the given GardenLinux Python library
44
inputs:
55
version:
66
description: GardenLinux Python library version
7-
default: "0.10.10"
7+
default: "0.10.11"
88
python_version:
99
description: Python version to setup
1010
default: "3.13"

.github/workflows/pytests.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ jobs:
1212
runs-on: ubuntu-latest
1313
strategy:
1414
matrix:
15-
python_version: ["3.13"]
15+
python_version: ["3.13", "3.14"]
1616
steps:
1717
- name: Checkout
1818
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1

poetry.lock

Lines changed: 3 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pyproject.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
[tool.poetry]
22
name = "gardenlinux"
3-
version = "0.10.10"
3+
version = "0.10.11"
44
description = "Contains tools to work with the features directory of gardenlinux, for example deducting dependencies from feature sets or validating cnames"
55
authors = ["Garden Linux Maintainers <contact@gardenlinux.io>"]
66
license = "Apache-2.0"
77
readme = "README.md"
88
packages = [{ include = "gardenlinux", from = "src" }]
99

1010
[tool.poetry.dependencies]
11-
python = ">=3.13, <3.14"
11+
python = ">=3.13, !=3.14.1"
1212
apt-repo = "^0.5"
1313
boto3 = "^1.42.10"
1414
click = "^8.3.1"

src/gardenlinux/features/cname.py

Lines changed: 60 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -69,17 +69,46 @@ def __init__(
6969

7070
commit_id_or_hash = None
7171

72-
re_match = re.match(
73-
"([a-zA-Z0-9]+([\\_\\-][a-zA-Z0-9]+)*?)(-([a-z0-9]+)(-([a-z0-9.]+)-([a-z0-9]+))*)?$",
74-
cname,
72+
if version is not None:
73+
# Support version values formatted as <version>-<commit_hash>
74+
if commit_hash is None:
75+
re_match = re.match("([a-z0-9.]+)(-([a-z0-9]+))?$", version)
76+
assert re_match, f"Not a valid version {version}"
77+
78+
commit_id_or_hash = re_match[3]
79+
version = re_match[1]
80+
else:
81+
commit_id_or_hash = commit_hash
82+
83+
re_object = re.compile(
84+
"([a-zA-Z0-9]+([\\_\\-][a-zA-Z0-9]+)*?)(-([a-z0-9]+)(-([a-z0-9.]+)-([a-z0-9]+))*)?$"
7585
)
7686

87+
re_match = re_object.match(cname)
88+
89+
# Workaround Garden Linux canonical names without mandatory final commit hash
90+
if (
91+
not re_match
92+
and commit_id_or_hash
93+
and re.match(
94+
"([a-zA-Z0-9]+([\\_\\-][a-zA-Z0-9]+)*?)(-([a-z0-9]+)(-([a-z0-9.]+))*)?$",
95+
cname,
96+
)
97+
):
98+
re_match = re_object.match(f"{cname}-{commit_id_or_hash}")
99+
77100
assert re_match, f"Not a valid Garden Linux canonical name {cname}"
78101

79102
if re_match.lastindex == 1:
80103
self._flavor = re_match[1]
81104
else:
82-
commit_id_or_hash = re_match[7]
105+
if commit_id_or_hash is None:
106+
commit_id_or_hash = re_match[7]
107+
elif re_match.group(7) is not None:
108+
assert commit_id_or_hash.startswith(re_match[7]), (
109+
f"Mismatch between Garden Linux canonical name '{cname}' and given commit ID '{commit_id_or_hash}' detected"
110+
)
111+
83112
self._flavor = re_match[1]
84113
self._version = re_match[6]
85114

@@ -91,17 +120,13 @@ def __init__(
91120
if self._arch is None and arch is not None:
92121
self._arch = arch
93122

94-
if self._version is None and version is not None:
95-
# Support version values formatted as <version>-<commit_hash>
96-
if commit_hash is None:
97-
re_match = re.match("([a-z0-9.]+)(-([a-z0-9]+))?$", version)
98-
assert re_match, f"Not a valid version {version}"
99-
100-
commit_id_or_hash = re_match[3]
101-
self._version = re_match[1]
102-
else:
103-
commit_id_or_hash = commit_hash
123+
if version is not None:
124+
if self._version is None:
104125
self._version = version
126+
else:
127+
assert version == self._version, (
128+
f"Mismatch between Garden Linux canonical name '{cname}' and given version '{version}' detected"
129+
)
105130

106131
if commit_id_or_hash is not None:
107132
self._commit_id = commit_id_or_hash[:8]
@@ -312,21 +337,36 @@ def release_metadata_string(self) -> str:
312337
assert len(features["platform"]) < 2
313338
"Only one platform is supported"
314339

340+
commit_hash = self.commit_hash
341+
commit_id = self.commit_id
315342
elements = ",".join(features["element"])
316343
flags = ",".join(features["flag"])
317344
platform = features["platform"][0]
318345
platforms = ",".join(features["platform"])
319346
platform_variant = self.platform_variant
347+
version = self.version
348+
349+
if commit_id is None:
350+
commit_id = ""
351+
352+
if commit_hash is None:
353+
commit_hash = commit_id
320354

321355
if platform_variant is None:
322356
platform_variant = ""
323357

358+
if version is None:
359+
pretty_name = f"{GL_DISTRIBUTION_NAME} unsupported version"
360+
version = ""
361+
else:
362+
pretty_name = f"{GL_DISTRIBUTION_NAME} {version}"
363+
324364
metadata = f"""
325365
ID={GL_RELEASE_ID}
326366
ID_LIKE=debian
327367
NAME="{GL_DISTRIBUTION_NAME}"
328-
PRETTY_NAME="{GL_DISTRIBUTION_NAME} {self.version}"
329-
IMAGE_VERSION={self.version}
368+
PRETTY_NAME="{pretty_name}"
369+
IMAGE_VERSION={version}
330370
VARIANT_ID="{self.flavor}-{self.arch}"
331371
HOME_URL="{GL_HOME_URL}"
332372
SUPPORT_URL="{GL_SUPPORT_URL}"
@@ -338,9 +378,9 @@ def release_metadata_string(self) -> str:
338378
GARDENLINUX_FEATURES_FLAGS="{flags}"
339379
GARDENLINUX_PLATFORM="{platform}"
340380
GARDENLINUX_PLATFORM_VARIANT="{platform_variant}"
341-
GARDENLINUX_VERSION="{self.version}"
342-
GARDENLINUX_COMMIT_ID="{self.commit_id}"
343-
GARDENLINUX_COMMIT_ID_LONG="{self.commit_hash}"
381+
GARDENLINUX_VERSION="{version}"
382+
GARDENLINUX_COMMIT_ID="{commit_id}"
383+
GARDENLINUX_COMMIT_ID_LONG="{commit_hash}"
344384
""".strip()
345385

346386
return metadata
@@ -365,7 +405,7 @@ def version_and_commit_id(self) -> Optional[str]:
365405
:since: 0.7.0
366406
"""
367407

368-
if self._commit_id is None:
408+
if self._version is None or self._commit_id is None:
369409
return None
370410

371411
return f"{self._version}-{self._commit_id}"

src/gardenlinux/s3/__main__.py

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,6 @@
99

1010
from .s3_artifacts import S3Artifacts
1111

12-
_ARGS_ACTION_ALLOWED = [
13-
"download-artifacts-from-bucket",
14-
"upload-artifacts-to-bucket",
15-
]
16-
1712

1813
def main() -> None:
1914
"""
@@ -25,17 +20,22 @@ def main() -> None:
2520
parser = argparse.ArgumentParser()
2621

2722
parser.add_argument("--bucket", dest="bucket")
28-
parser.add_argument("--cname", required=False, dest="cname")
2923
parser.add_argument("--path", required=False, dest="path")
3024
parser.add_argument("--dry-run", action="store_true")
3125

32-
parser.add_argument("action", nargs="?", choices=_ARGS_ACTION_ALLOWED)
26+
subparsers = parser.add_subparsers(dest="action")
27+
28+
download_parser = subparsers.add_parser("download-artifacts-from-bucket")
29+
download_parser.add_argument("--cname", required=False, dest="cname")
30+
31+
upload_parser = subparsers.add_parser("upload-artifacts-to-bucket")
32+
upload_parser.add_argument("--artifact-name", required=False, dest="artifact_name")
3333

3434
args = parser.parse_args()
3535

3636
if args.action == "download-artifacts-from-bucket":
3737
S3Artifacts(args.bucket).download_to_directory(args.cname, args.path)
3838
elif args.action == "upload-artifacts-to-bucket":
3939
S3Artifacts(args.bucket).upload_from_directory(
40-
args.cname, args.path, dry_run=args.dry_run
40+
args.artifact_name, args.path, dry_run=args.dry_run
4141
)

0 commit comments

Comments
 (0)