Skip to content

Commit d395623

Browse files
committed
Enforce one platform policy for GardenLinux canonical names
Signed-off-by: Tobias Wolf <[email protected]> On-behalf-of: SAP <[email protected]>
1 parent d64300c commit d395623

File tree

4 files changed

+41
-33
lines changed

4 files changed

+41
-33
lines changed

src/gardenlinux/features/cname.py

Lines changed: 17 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -51,15 +51,15 @@ def __init__(self, cname, arch=None, commit_hash=None, version=None):
5151
self._commit_id = None
5252
self._feature_elements_cached = None
5353
self._feature_flags_cached = None
54-
self._feature_platforms_cached = None
54+
self._feature_platform_cached = None
5555
self._feature_set_cached = None
5656
self._flavor = None
5757
self._version = None
5858

5959
commit_id_or_hash = None
6060

6161
re_match = re.match(
62-
"([a-zA-Z0-9]+([\\_\\-][a-zA-Z0-9]+)*?)(-([a-z0-9]+)(-([a-z0-9.]+)-([a-z0-9]+))*)?$",
62+
"([a-zA-Z0-9]+([\\_\\-][a-zA-Z0-9]+)*?)(-([a-z0-9]+)(-([a-z0-9\\.\\+~]+)-([a-z0-9]+))*)?$",
6363
cname,
6464
)
6565

@@ -83,7 +83,7 @@ def __init__(self, cname, arch=None, commit_hash=None, version=None):
8383
if self._version is None and version is not None:
8484
# Support version values formatted as <version>-<commit_hash>
8585
if commit_hash is None:
86-
re_match = re.match("([a-z0-9.]+)(-([a-z0-9]+))?$", version)
86+
re_match = re.match("([a-z0-9\\.\\+~]+)(-([a-z0-9]+))?$", version)
8787
assert re_match, f"Not a valid version {version}"
8888

8989
commit_id_or_hash = re_match[3]
@@ -117,7 +117,7 @@ def cname(self) -> str:
117117
:return: (str) CName
118118
:since: 0.7.0
119119
"""
120-
assert self._flavor is not None, "CName flavor is not set!"
120+
121121
cname = self._flavor
122122

123123
if self._arch is not None:
@@ -233,10 +233,13 @@ def feature_set_platform(self) -> str:
233233
:since: 0.11.0
234234
"""
235235

236-
if self._feature_platforms_cached is not None:
237-
return ",".join(self._feature_platforms_cached)
236+
if self._feature_platform_cached is not None:
237+
return self._feature_platform_cached
238+
239+
platforms = Parser().filter_as_dict(self.flavor)["platform"]
240+
assert len(platforms) < 2, "Only one platform is supported"
238241

239-
return ",".join(Parser().filter_as_dict(self.flavor)["platform"])
242+
return platforms[0]
240243

241244
@property
242245
def release_metadata_string(self) -> str:
@@ -248,10 +251,11 @@ def release_metadata_string(self) -> str:
248251
"""
249252

250253
features = Parser().filter_as_dict(self.flavor)
254+
assert len(features["platform"]) == 1, "Only one platform is supported"
251255

252256
elements = ",".join(features["element"])
253257
flags = ",".join(features["flag"])
254-
platforms = ",".join(features["platform"])
258+
platform = features["platform"][0]
255259

256260
metadata = f"""
257261
ID={GL_RELEASE_ID}
@@ -264,7 +268,7 @@ def release_metadata_string(self) -> str:
264268
BUG_REPORT_URL="{GL_BUG_REPORT_URL}"
265269
GARDENLINUX_CNAME="{self.cname}"
266270
GARDENLINUX_FEATURES="{self.feature_set}"
267-
GARDENLINUX_FEATURES_PLATFORMS="{platforms}"
271+
GARDENLINUX_FEATURES_PLATFORMS="{platform}"
268272
GARDENLINUX_FEATURES_ELEMENTS="{elements}"
269273
GARDENLINUX_FEATURES_FLAGS="{flags}"
270274
GARDENLINUX_VERSION="{self.version}"
@@ -282,24 +286,9 @@ def platform(self) -> str:
282286
:return: (str) Feature set platforms
283287
:since: 0.7.0
284288
"""
285-
assert self._flavor is not None, "Flavor not set!"
286289

287290
return self.feature_set_platform
288291

289-
@property
290-
def platforms(self) -> List[str]:
291-
"""
292-
Returns the platforms for the cname parsed.
293-
294-
:return: (str) Platforms
295-
:since: 0.11.0
296-
"""
297-
298-
if self._feature_platforms_cached is not None:
299-
return self._feature_platforms_cached
300-
301-
return Parser().filter_as_dict(self.flavor)["platform"]
302-
303292
@property
304293
def version(self) -> Optional[str]:
305294
"""
@@ -395,9 +384,10 @@ def load_from_release_file(self, release_file: PathLike | str) -> None:
395384
UNNAMED_SECTION, "GARDENLINUX_FEATURES_FLAGS"
396385
).split(",")
397386

398-
self._feature_platforms_cached = release_config.get(
399-
UNNAMED_SECTION, "GARDENLINUX_FEATURES_PLATFORMS"
400-
).split(",")
387+
platforms = release_config.get(UNNAMED_SECTION, "GARDENLINUX_FEATURES_PLATFORMS").split(",")
388+
assert len(platforms) < 2, "Only one platform is supported"
389+
390+
self._feature_platform_cached = platforms[0]
401391

402392
def save_to_release_file(
403393
self, release_file: PathLike | str, overwrite: Optional[bool] = False

src/gardenlinux/s3/s3_artifacts.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -172,7 +172,7 @@ def upload_from_directory(
172172
secureboot = "_trustedboot" in feature_list
173173

174174
metadata = {
175-
"platform": cname_object.platform,
175+
"platform": cname_object.feature_set_platform,
176176
"architecture": cname_object.arch,
177177
"base_image": None,
178178
"build_committish": commit_hash,
@@ -220,7 +220,7 @@ def upload_from_directory(
220220

221221
s3_tags = {
222222
"architecture": re_object.sub("+", cname_object.arch),
223-
"platform": re_object.sub("+", cname_object.platform),
223+
"platform": re_object.sub("+", cname_object.feature_set_platform),
224224
"version": re_object.sub("+", cname_object.version),
225225
"committish": commit_hash,
226226
"md5sum": md5sum,

tests/s3/conftest.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,9 @@ class S3Env:
2222

2323

2424
def make_cname(
25-
flavor: str = "kvm-container",
25+
flavor: str = "container",
2626
arch: str = "amd64",
27-
version: str = "1234.1",
27+
version: str = "1234.1~post1",
2828
commit: str = "abc123",
2929
) -> str:
3030
"""

tests/s3/test_s3_artifacts.py

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
from gardenlinux.s3.s3_artifacts import S3Artifacts
1010

1111
RELEASE_DATA = """
12-
GARDENLINUX_VERSION = 1234.1
12+
GARDENLINUX_VERSION = 1234.1~post1
1313
GARDENLINUX_COMMIT_ID = abc123
1414
GARDENLINUX_COMMIT_ID_LONG = abc123long
1515
GARDENLINUX_FEATURES = _usi,_trustedboot
@@ -124,7 +124,7 @@ def test_upload_from_directory_success(s3_setup):
124124
Bucket=env.bucket_name, Key=f"objects/{env.cname}/{env.cname}-file1"
125125
)
126126
tags = {tag["Key"]: tag["Value"] for tag in raw_tags_response["TagSet"]}
127-
assert tags["platform"] == "container+kvm"
127+
assert tags["version"] == "1234.1+post1"
128128

129129

130130
def test_upload_from_directory_with_delete(s3_setup):
@@ -192,6 +192,24 @@ def test_upload_from_directory_invalid_dir_raises(s3_setup):
192192
artifacts.upload_from_directory(env.cname, "/invalid/path")
193193

194194

195+
def test_upload_from_directory_not_only_one_platform(s3_setup):
196+
"""
197+
RuntimeError if more than one platform is in release file.
198+
"""
199+
# Arrange
200+
env = s3_setup
201+
cname = "container-kvm-amd64-1234.1~post1-abc123"
202+
203+
release_path = env.tmp_path / f"{cname}.release"
204+
release_path.write_text(RELEASE_DATA)
205+
206+
artifacts = S3Artifacts(env.bucket_name)
207+
208+
# Act / Assert
209+
with pytest.raises(AssertionError, match="Only one platform is supported"):
210+
artifacts.upload_from_directory(cname, env.tmp_path)
211+
212+
195213
def test_upload_from_directory_version_mismatch_raises(s3_setup):
196214
"""
197215
RuntimeError if version in release file does not match cname.

0 commit comments

Comments
 (0)