Skip to content

Commit 66bad29

Browse files
committed
Add support to generate container tags based on given version input
Signed-off-by: Tobias Wolf <[email protected]> On-behalf-of: SAP <[email protected]>
1 parent df87d4b commit 66bad29

File tree

4 files changed

+165
-32
lines changed

4 files changed

+165
-32
lines changed

src/gardenlinux/features/__main__.py

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
"cname",
2121
"cname_base",
2222
"container_name",
23+
"container_tag",
2324
"commit_id",
2425
"features",
2526
"platforms",
@@ -37,6 +38,7 @@
3738
CamelCase splitter RegExp
3839
"""
3940

41+
4042
def main() -> None:
4143
"""
4244
gl-features-parse main()
@@ -109,15 +111,26 @@ def main() -> None:
109111
commit_id_or_hash = cname.commit_id
110112
version = cname.version
111113

112-
if arch is None or arch == "" and (args.type in ("cname", "container_name", "arch")):
114+
if (arch is None or arch == "") and (
115+
args.type in ("cname", "container_name", "arch")
116+
):
113117
raise RuntimeError(
114118
"Architecture could not be determined and no default architecture set"
115119
)
116120

117-
if (
118-
version is None
119-
or version == ""
120-
and (args.type in ("cname", "commit_id", "version", "version_and_commit_id"))
121+
if (commit_id_or_hash is None or commit_id_or_hash == "") and (
122+
args.type in ("container_tag", "commit_id", "version_and_commit_id")
123+
):
124+
raise RuntimeError("Commit ID not specified")
125+
126+
if (version is None or version == "") and (
127+
args.type
128+
in (
129+
"container_tag",
130+
"commit_id",
131+
"version",
132+
"version_and_commit_id",
133+
)
121134
):
122135
raise RuntimeError("Version not specified and no default version set")
123136

@@ -136,7 +149,7 @@ def main() -> None:
136149
"graph",
137150
"platforms",
138151
):
139-
if args.type == "graph" or len(args.ignore) > 1:
152+
if args.type == "graph" or len(args.ignore) > 0:
140153
features_parser = Parser(gardenlinux_root, feature_dir_name)
141154

142155
print_output_from_features_parser(
@@ -146,6 +159,8 @@ def main() -> None:
146159
print_output_from_cname(args.type, cname)
147160
elif args.type == "commit_id":
148161
print(commit_id_or_hash[:8])
162+
elif args.type == "container_tag":
163+
print(re.sub("\\W+", "-", f"{version}-{commit_id_or_hash[:8]}"))
149164
elif args.type == "version":
150165
print(version)
151166
elif args.type == "version_and_commit_id":

src/gardenlinux/features/parser.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,15 +30,15 @@ class Parser(object):
3030
Apache License, Version 2.0
3131
"""
3232

33-
_GARDENLINUX_ROOT: str = "."
33+
_GARDENLINUX_ROOT: str = os.getenv("GL_ROOT_DIR", ".")
3434
"""
3535
Default GardenLinux root directory
3636
"""
3737

3838
def __init__(
3939
self,
40-
gardenlinux_root: str | None = None,
41-
feature_dir_name: str = "features",
40+
gardenlinux_root: Optional[str] = None,
41+
feature_dir_name: Optional[str] = "features",
4242
logger: Optional[logging.Logger] = None,
4343
):
4444
"""

tests/features/test_main.py

Lines changed: 136 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,9 @@
44
import pytest
55

66
import gardenlinux.features.__main__ as fema
7-
from gardenlinux.features import CName
7+
from gardenlinux.features import CName, Parser
8+
9+
from ..constants import GL_ROOT_DIR
810

911
# -------------------------------
1012
# Helper function tests
@@ -148,7 +150,16 @@ def test_main_prints_arch(monkeypatch, capsys):
148150

149151
def test_main_prints_container_name(monkeypatch, capsys):
150152
# Arrange
151-
argv = ["prog", "--arch", "amd64", "--cname", "container-pythonDev", "--version", "1.0", "container_name"]
153+
argv = [
154+
"prog",
155+
"--arch",
156+
"amd64",
157+
"--cname",
158+
"container-pythonDev",
159+
"--version",
160+
"1.0",
161+
"container_name",
162+
]
152163
monkeypatch.setattr(sys, "argv", argv)
153164
monkeypatch.setattr(fema, "Parser", lambda *a, **kw: None)
154165

@@ -160,6 +171,31 @@ def test_main_prints_container_name(monkeypatch, capsys):
160171
assert "container-python-dev" in out
161172

162173

174+
def test_main_prints_container_tag(monkeypatch, capsys):
175+
# Arrange
176+
argv = [
177+
"prog",
178+
"--arch",
179+
"amd64",
180+
"--cname",
181+
"flav",
182+
"--version",
183+
"1.0",
184+
"--commit",
185+
"~post1",
186+
"container_tag",
187+
]
188+
monkeypatch.setattr(sys, "argv", argv)
189+
monkeypatch.setattr(fema, "Parser", lambda *a, **kw: None)
190+
191+
# Act
192+
fema.main()
193+
194+
# Assert
195+
out = capsys.readouterr().out.strip()
196+
assert "1-0-post1" == out
197+
198+
163199
def test_main_prints_commit_id(monkeypatch, capsys):
164200
# Arrange
165201
argv = ["prog", "--arch", "amd64", "--cname", "flav", "commit_id"]
@@ -252,14 +288,49 @@ def test_main_prints_version_and_commit_id(monkeypatch, capsys):
252288
assert "1.2.3-abcdef12" == captured.out.strip()
253289

254290

255-
def test_main_arch_raises_missing_verison(monkeypatch, capsys):
291+
def test_main_requires_cname(monkeypatch):
292+
# Arrange
293+
monkeypatch.setattr(sys, "argv", ["prog", "arch"])
294+
monkeypatch.setattr(fema, "Parser", lambda *a, **kw: None)
295+
296+
# Act / Assert
297+
with pytest.raises(SystemExit):
298+
fema.main()
299+
300+
301+
def test_main_raises_no_arch_no_default(monkeypatch):
302+
# Arrange
303+
# args.type == 'cname, arch is None and no default_arch set
304+
argv = ["prog", "--cname", "flav", "cname"]
305+
monkeypatch.setattr(sys, "argv", argv)
306+
monkeypatch.setattr(
307+
fema,
308+
"Parser",
309+
lambda *a, **kw: types.SimpleNamespace(filter=lambda *a, **k: None),
310+
)
311+
312+
# Act / Assert
313+
with pytest.raises(RuntimeError, match="Architecture could not be determined"):
314+
fema.main()
315+
316+
317+
def test_main_raises_missing_commit_id(monkeypatch, capsys):
256318
# Arrange
257-
argv = ["prog", "--arch", "amd64", "--cname", "flav", "arch"]
319+
argv = [
320+
"prog",
321+
"--arch",
322+
"amd64",
323+
"--cname",
324+
"flav",
325+
"--version",
326+
"1.0",
327+
"version_and_commit_id",
328+
]
258329
monkeypatch.setattr(sys, "argv", argv)
259330
monkeypatch.setattr(fema, "Parser", lambda *a, **kw: None)
260331

261332
# Act / Assert
262-
with pytest.raises(RuntimeError):
333+
with pytest.raises(RuntimeError, match="Commit ID not specified"):
263334
fema.main()
264335

265336

@@ -302,27 +373,71 @@ def sort_subset(subset, length):
302373
assert "flav" in captured.out
303374

304375

305-
def test_main_requires_cname(monkeypatch):
376+
def test_main_with_exclude_cname_print_elements(monkeypatch, capsys):
306377
# Arrange
307-
monkeypatch.setattr(sys, "argv", ["prog", "arch"])
308-
monkeypatch.setattr(fema, "Parser", lambda *a, **kw: None)
378+
monkeypatch.setattr(
379+
sys,
380+
"argv",
381+
[
382+
"prog",
383+
"--feature-dir",
384+
f"{GL_ROOT_DIR}/features",
385+
"--cname",
386+
"kvm-gardener_prod",
387+
"--ignore",
388+
"cloud",
389+
"--arch",
390+
"amd64",
391+
"--version",
392+
"local",
393+
"--commit",
394+
"today",
395+
"elements",
396+
],
397+
)
309398

310-
# Act / Assert
311-
with pytest.raises(SystemExit):
312-
fema.main()
399+
# Act
400+
fema.main()
401+
402+
# Assert
403+
captured = capsys.readouterr().out.strip()
313404

405+
assert (
406+
"log,sap,ssh,base,server,gardener"
407+
== captured
408+
)
314409

315-
def test_main_raises_no_arch_no_default(monkeypatch):
410+
411+
def test_main_with_exclude_cname_print_features(monkeypatch, capsys):
316412
# Arrange
317-
# args.type == 'cname, arch is None and no default_arch set
318-
argv = ["prog", "--cname", "flav", "cname"]
319-
monkeypatch.setattr(sys, "argv", argv)
320413
monkeypatch.setattr(
321-
fema,
322-
"Parser",
323-
lambda *a, **kw: types.SimpleNamespace(filter=lambda *a, **k: None),
414+
sys,
415+
"argv",
416+
[
417+
"prog",
418+
"--feature-dir",
419+
f"{GL_ROOT_DIR}/features",
420+
"--cname",
421+
"kvm-gardener_prod",
422+
"--ignore",
423+
"cloud",
424+
"--arch",
425+
"amd64",
426+
"--version",
427+
"local",
428+
"--commit",
429+
"today",
430+
"features",
431+
],
324432
)
325433

326-
# Act / Assert
327-
with pytest.raises(RuntimeError, match="Architecture could not be determined"):
328-
fema.main()
434+
# Act
435+
fema.main()
436+
437+
# Assert
438+
captured = capsys.readouterr().out.strip()
439+
440+
assert (
441+
"log,sap,ssh,_boot,_ignite,kvm,_nopkg,_prod,_slim,base,server,gardener"
442+
== captured
443+
)

tests/s3/test_s3_artifacts.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -120,8 +120,10 @@ def test_upload_from_directory_success(s3_setup):
120120
assert metadata["require_uefi"] is True
121121
assert metadata["secureboot"] is True
122122

123-
raw_tags_response = env.s3.meta.client.get_object_tagging(Bucket=env.bucket_name, Key=f"objects/{env.cname}/{env.cname}-file1")
124-
tags = { tag['Key']: tag['Value'] for tag in raw_tags_response["TagSet"] }
123+
raw_tags_response = env.s3.meta.client.get_object_tagging(
124+
Bucket=env.bucket_name, Key=f"objects/{env.cname}/{env.cname}-file1"
125+
)
126+
tags = {tag["Key"]: tag["Value"] for tag in raw_tags_response["TagSet"]}
125127
assert tags["platform"] == "container+kvm"
126128

127129

@@ -260,6 +262,7 @@ def test_upload_from_directory_invalid_artifact_name(s3_setup):
260262
bucket = env.s3.Bucket(env.bucket_name)
261263
assert len(list(bucket.objects.filter(Prefix=f"meta/singles/{env.cname}"))) == 1
262264

265+
263266
def test_upload_from_directory_commit_mismatch_raises(s3_setup):
264267
"""Raise RuntimeError when commit ID is not matching with cname."""
265268
# Arrange

0 commit comments

Comments
 (0)