Skip to content

Commit d3838d5

Browse files
committed
Add support to parse and return the GardenLinux "cname"
Relates: gardenlinux/gardenlinux#2830 Signed-off-by: Tobias Wolf <[email protected]>
1 parent 1bcdff0 commit d3838d5

File tree

4 files changed

+203
-120
lines changed

4 files changed

+203
-120
lines changed

pyproject.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ boto3 = "*"
2626
black = "^24.8.0"
2727

2828
[tool.poetry.scripts]
29+
gl-cname = "src.python_gardenlinux_lib.cname:main"
2930
flavors-parse = "src.python_gardenlinux_lib.flavors.parse_flavors:main"
3031

3132
[tool.pytest.ini_options]

src/python_gardenlinux_lib/cname.py

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
#!/usr/bin/env python3
2+
3+
from .features import parse_features
4+
5+
from functools import reduce
6+
from os.path import basename, dirname
7+
8+
import argparse
9+
import re
10+
11+
12+
def main():
13+
parser = argparse.ArgumentParser()
14+
15+
parser.add_argument("--arch", dest="arch")
16+
parser.add_argument("--feature-dir", default="features")
17+
parser.add_argument("--version", dest="version")
18+
parser.add_argument("cname")
19+
20+
args = parser.parse_args()
21+
22+
re_match = re.match(
23+
"([a-zA-Z0-9]+(-[a-zA-Z0-9\\_\\-]*?)?)(-([a-z0-9]+)(-([a-z0-9.]+)-([a-z0-9]+))*)?$",
24+
args.cname
25+
)
26+
27+
assert re_match, f"not a valid cname {args.cname}"
28+
29+
if re_match.lastindex == 1:
30+
cname_base, arch = re_match[1].split("-", 1)
31+
commit_id = None
32+
version = None
33+
else:
34+
arch = re_match[4]
35+
cname_base = re_match[1]
36+
commit_id = re_match[7]
37+
version = re_match[6]
38+
39+
if args.arch is not None:
40+
arch = args.arch
41+
42+
if args.version is not None:
43+
re_match = re.match("([a-z0-9.]+)(-([a-z0-9]+))?$", args.cname)
44+
assert re_match, f"not a valid version {args.version}"
45+
46+
commit_id = re_match[3]
47+
version = re_match[1]
48+
49+
gardenlinux_root = dirname(args.feature_dir)
50+
feature_dir_name = basename(args.feature_dir)
51+
52+
if gardenlinux_root == "":
53+
gardenlinux_root = "."
54+
55+
graph = parse_features.get_features_graph(
56+
cname_base, gardenlinux_root, feature_dir_name
57+
)
58+
59+
sorted_features = parse_features.sort_nodes(graph)
60+
61+
minimal_feature_set = get_minimal_feature_set(graph)
62+
63+
sorted_minimal_features = parse_features.sort_set(
64+
minimal_feature_set, sorted_features
65+
)
66+
67+
cname_base = get_cname_base(sorted_minimal_features)
68+
69+
cname = f"{cname_base}-{arch}"
70+
if commit_id is not None:
71+
cname += f"-{version}-{commit_id}"
72+
73+
print(cname)
74+
75+
def get_cname_base(sorted_features):
76+
return reduce(
77+
lambda a, b : a + ("-" if not b.startswith("_") else "") + b, sorted_features
78+
)
79+
80+
def get_minimal_feature_set(graph):
81+
return set([node for (node, degree) in graph.in_degree() if degree == 0])
82+
83+
84+
if __name__ == "__main__":
85+
main()
Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
#!/usr/bin/env python3
2+
3+
# It is important that this list is sorted in descending length of the entries
4+
GL_MEDIA_TYPES = [
5+
"gcpimage.tar.gz.log",
6+
"firecracker.tar.gz",
7+
"platform.test.log",
8+
"platform.test.xml",
9+
"gcpimage.tar.gz",
10+
"chroot.test.log",
11+
"chroot.test.xml",
12+
"pxe.tar.gz.log",
13+
"root.squashfs",
14+
"manifest.log",
15+
"release.log",
16+
"pxe.tar.gz",
17+
"qcow2.log",
18+
"test-log",
19+
"boot.efi",
20+
"manifest",
21+
"vmdk.log",
22+
"tar.log",
23+
"uki.log",
24+
"vmlinuz",
25+
"release",
26+
"vhd.log",
27+
"ova.log",
28+
"raw.log",
29+
"oci.log",
30+
"initrd",
31+
"tar.gz",
32+
"qcow2",
33+
"tar",
34+
"iso",
35+
"oci",
36+
"vhd",
37+
"vmdk",
38+
"ova",
39+
"uki",
40+
"raw",
41+
]
42+
43+
GL_MEDIA_TYPE_LOOKUP = {
44+
"tar": "application/io.gardenlinux.image.archive.format.tar",
45+
"tar.gz": "application/io.gardenlinux.image.archive.format.tar.gz",
46+
"pxe.tar.gz": "application/io.gardenlinux.image.archive.format.pxe.tar.gz",
47+
"iso": "application/io.gardenlinux.image.archive.format.iso",
48+
"oci": "application/io.gardenlinux.image.archive.format.oci",
49+
"firecracker.tar.gz": "application/io.gardenlinux.image.archive.format.firecracker.tar.gz",
50+
"qcow2": "application/io.gardenlinux.image.format.qcow2",
51+
"vhd": "application/io.gardenlinux.image.format.vhd",
52+
"gcpimage.tar.gz": "application/io.gardenlinux.image.format.gcpimage.tar.gz",
53+
"vmdk": "application/io.gardenlinux.image.format.vmdk",
54+
"ova": "application/io.gardenlinux.image.format.ova",
55+
"uki": "application/io.gardenlinux.uki",
56+
"uki.log": "application/io.gardenlinux.log",
57+
"raw": "application/io.gardenlinux.image.archive.format.raw",
58+
"manifest.log": "application/io.gardenlinux.log",
59+
"release.log": "application/io.gardenlinux.log",
60+
"test-log": "application/io.gardenlinux.test-log",
61+
"manifest": "application/io.gardenlinux.manifest",
62+
"tar.log": "application/io.gardenlinux.log",
63+
"release": "application/io.gardenlinux.release",
64+
"raw.log": "application/io.gardenlinux.log",
65+
"qcow2.log": "application/io.gardenlinux.log",
66+
"pxe.tar.gz.log": "application/io.gardenlinux.log",
67+
"gcpimage.tar.gz.log": "application/io.gardenlinux.log",
68+
"vmdk.log": "application/io.gardenlinux.log",
69+
"vhd.log": "application/io.gardenlinux.log",
70+
"ova.log": "application/io.gardenlinux.log",
71+
"vmlinuz": "application/io.gardenlinux.kernel",
72+
"initrd": "application/io.gardenlinux.initrd",
73+
"root.squashfs": "application/io.gardenlinux.squashfs",
74+
"boot.efi": "application/io.gardenlinux.efi",
75+
"platform.test.log": "application/io.gardenlinux.io.platform.test.log",
76+
"platform.test.xml": "application/io.gardenlinux.io.platform.test.xml",
77+
"chroot.test.log": "application/io.gardenlinux.io.chroot.test.log",
78+
"chroot.test.xml": "application/io.gardenlinux.io.chroot.test.xml",
79+
"oci.log": "application/io.gardenlinux.log",
80+
}

0 commit comments

Comments
 (0)