Skip to content

Commit 5126dc7

Browse files
authored
images info for release notes (#217)
* images info for release notes * working deployment platform classes * removing unused code * gitignore update * cleanup; tests for github cli * gitignore update * no glob for test artifacts metadata files
1 parent 1199aab commit 5126dc7

File tree

18 files changed

+2066
-10
lines changed

18 files changed

+2066
-10
lines changed

.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -169,3 +169,6 @@ bandit-report.json
169169

170170
# zot
171171
test-data/zot
172+
173+
s3_downloads/
174+
.github_release_id

src/gardenlinux/github/__main__.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import argparse
22

3+
from gardenlinux.constants import GARDENLINUX_GITHUB_RELEASE_BUCKET_NAME
34
from gardenlinux.logger import LoggerSetup
45

56
from .release import create_github_release, upload_to_github_release_page, write_to_release_id_file
@@ -30,7 +31,7 @@ def main():
3031
args = parser.parse_args()
3132

3233
if args.command == "create":
33-
body = create_github_release_notes(args.tag, args.commit)
34+
body = create_github_release_notes(args.tag, args.commit, GARDENLINUX_GITHUB_RELEASE_BUCKET_NAME)
3435
if args.dry_run:
3536
print("Dry Run ...")
3637
print("This release would be created:")

src/gardenlinux/github/release_notes/__init__.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
1-
from .helpers import get_package_list
1+
from .helpers import download_all_metadata_files, get_package_list
22
from .sections import (
33
release_notes_changes_section,
44
release_notes_compare_package_versions_section,
5+
release_notes_image_ids_section,
56
release_notes_software_components_section,
67
)
78

89

9-
def create_github_release_notes(gardenlinux_version, commitish):
10+
def create_github_release_notes(gardenlinux_version, commitish, releases_s3_bucket_name):
1011
package_list = get_package_list(gardenlinux_version)
1112

1213
output = ""
@@ -19,7 +20,9 @@ def create_github_release_notes(gardenlinux_version, commitish):
1920
gardenlinux_version, package_list
2021
)
2122

22-
# TODO: image ids
23+
metadata_files = download_all_metadata_files(gardenlinux_version, commitish, releases_s3_bucket_name)
24+
25+
output += release_notes_image_ids_section(metadata_files)
2326

2427
output += "\n"
2528
output += "## Kernel Module Build Container (kmodbuild)"
Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
from gardenlinux.constants import GARDENLINUX_GITHUB_RELEASE_BUCKET_NAME
2+
3+
4+
class DeploymentPlatform():
5+
artifacts_bucket_name = GARDENLINUX_GITHUB_RELEASE_BUCKET_NAME
6+
7+
def short_name(self):
8+
return "generic"
9+
10+
def full_name(self):
11+
return "Generic Deployment Platform"
12+
13+
def published_images_by_regions(self, image_metadata):
14+
published_image_metadata = image_metadata["published_image_metadata"]
15+
flavor_name = image_metadata["s3_key"].split("/")[-1]
16+
17+
regions = []
18+
for pset in published_image_metadata:
19+
for p in published_image_metadata[pset]:
20+
regions.append({"region": p["region_id"], "image_id": p["image_id"]})
21+
22+
return {"flavor": flavor_name, "regions": regions}
23+
24+
def image_extension(self):
25+
return "raw"
26+
27+
def artifact_for_flavor(self, flavor, markdown_format=True):
28+
base_url = f"https://{self.__class__.artifacts_bucket_name}.s3.amazonaws.com/objects"
29+
filename = f"{flavor}.{self.image_extension()}"
30+
download_url = f"{base_url}/{flavor}/{filename}"
31+
if markdown_format:
32+
return f"[{filename}]({download_url})"
33+
else:
34+
return download_url
35+
36+
def region_details(self, image_metadata):
37+
"""
38+
Generate the detailed region information for the collapsible section
39+
"""
40+
details = ""
41+
42+
match self.published_images_by_regions(image_metadata):
43+
case {"regions": regions}:
44+
for region in regions:
45+
match region:
46+
case {
47+
"region": region_name,
48+
"image_id": image_id,
49+
"image_name": image_name,
50+
}:
51+
details += f"**{region_name}:** {image_id} ({image_name})<br>"
52+
case {"region": region_name, "image_id": image_id}:
53+
details += f"**{region_name}:** {image_id}<br>"
54+
case {"details": details_dict}:
55+
for key, value in details_dict.items():
56+
details += f"**{key.replace('_', ' ').title()}:** {value}<br>"
57+
case {
58+
"gallery_images": gallery_images,
59+
"marketplace_images": marketplace_images,
60+
}:
61+
if gallery_images:
62+
details += "**Gallery Images:**<br>"
63+
for img in gallery_images:
64+
details += f"• {img['hyper_v_generation']} ({img['azure_cloud']}): {img['image_id']}<br>"
65+
if marketplace_images:
66+
details += "**Marketplace Images:**<br>"
67+
for img in marketplace_images:
68+
details += f"• {img['hyper_v_generation']}: {img['urn']}<br>"
69+
case {"gallery_images": gallery_images}:
70+
details += "**Gallery Images:**<br>"
71+
for img in gallery_images:
72+
details += f"• {img['hyper_v_generation']} ({img['azure_cloud']}): {img['image_id']}<br>"
73+
case {"marketplace_images": marketplace_images}:
74+
details += "**Marketplace Images:**<br>"
75+
for img in marketplace_images:
76+
details += f"• {img['hyper_v_generation']}: {img['urn']}<br>"
77+
78+
return details
79+
80+
def summary_text(self, image_metadata):
81+
"""
82+
Generate the summary text for the collapsible section
83+
"""
84+
match self.published_images_by_regions(image_metadata):
85+
case {"regions": regions}:
86+
count = len(regions)
87+
return f"{count} regions"
88+
case {"details": _}:
89+
return "Global availability"
90+
case {
91+
"gallery_images": gallery_images,
92+
"marketplace_images": marketplace_images,
93+
}:
94+
gallery_count = len(gallery_images)
95+
marketplace_count = len(marketplace_images)
96+
return f"{gallery_count} gallery + {marketplace_count} marketplace images"
97+
case {"gallery_images": gallery_images}:
98+
gallery_count = len(gallery_images)
99+
return f"{gallery_count} gallery images"
100+
case {"marketplace_images": marketplace_images}:
101+
marketplace_count = len(marketplace_images)
102+
return f"{marketplace_count} marketplace images"
103+
case _:
104+
return "Details available"
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
from . import DeploymentPlatform
2+
3+
4+
class AliCloud(DeploymentPlatform):
5+
def short_name(self):
6+
return "ali"
7+
8+
def full_name(self):
9+
return "Alibaba Cloud"
10+
11+
def image_extension(self):
12+
return "qcow2"
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
from . import DeploymentPlatform
2+
3+
4+
class AmazonWebServices(DeploymentPlatform):
5+
def short_name(self):
6+
return "aws"
7+
8+
def full_name(self):
9+
return "Amazon Web Services"
10+
11+
def published_images_by_regions(self, image_metadata):
12+
published_image_metadata = image_metadata["published_image_metadata"]
13+
flavor_name = image_metadata["s3_key"].split("/")[-1]
14+
15+
regions = []
16+
for pset in published_image_metadata:
17+
for p in published_image_metadata[pset]:
18+
regions.append({"region": p["aws_region_id"], "image_id": p["ami_id"]})
19+
20+
return {"flavor": flavor_name, "regions": regions}
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
from . import DeploymentPlatform
2+
3+
4+
class Azure(DeploymentPlatform):
5+
def short_name(self):
6+
return "azure"
7+
8+
def full_name(self):
9+
return "Microsoft Azure"
10+
11+
def image_extension(self):
12+
return "vhd"
13+
14+
def published_images_by_regions(self, image_metadata):
15+
published_image_metadata = image_metadata["published_image_metadata"]
16+
flavor_name = image_metadata["s3_key"].split("/")[-1]
17+
18+
gallery_images = []
19+
marketplace_images = []
20+
21+
for pset in published_image_metadata:
22+
if pset == "published_gallery_images":
23+
for gallery_image in published_image_metadata[pset]:
24+
gallery_images.append(
25+
{
26+
"hyper_v_generation": gallery_image["hyper_v_generation"],
27+
"azure_cloud": gallery_image["azure_cloud"],
28+
"image_id": gallery_image["community_gallery_image_id"],
29+
}
30+
)
31+
32+
if pset == "published_marketplace_images":
33+
for market_image in published_image_metadata[pset]:
34+
marketplace_images.append(
35+
{
36+
"hyper_v_generation": market_image["hyper_v_generation"],
37+
"urn": market_image["urn"],
38+
}
39+
)
40+
41+
return {
42+
"flavor": flavor_name,
43+
"gallery_images": gallery_images,
44+
"marketplace_images": marketplace_images,
45+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
from . import DeploymentPlatform
2+
3+
4+
class GoogleCloud(DeploymentPlatform):
5+
def short_name(self):
6+
return "gcp"
7+
8+
def full_name(self):
9+
return "Google Cloud Platform"
10+
11+
def image_extension(self):
12+
return "gcpimage.tar.gz"
13+
14+
def published_images_by_regions(self, image_metadata):
15+
published_image_metadata = image_metadata["published_image_metadata"]
16+
flavor_name = image_metadata["s3_key"].split("/")[-1]
17+
18+
details = {}
19+
if "gcp_image_name" in published_image_metadata:
20+
details["image_name"] = published_image_metadata["gcp_image_name"]
21+
if "gcp_project_name" in published_image_metadata:
22+
details["project"] = published_image_metadata["gcp_project_name"]
23+
details["availability"] = "Global (all regions)"
24+
25+
return {"flavor": flavor_name, "details": details}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
from . import DeploymentPlatform
2+
3+
4+
class OpenStack(DeploymentPlatform):
5+
def short_name(self):
6+
return "openstack"
7+
8+
def full_name(self):
9+
return "OpenStack"
10+
11+
def published_images_by_regions(self, image_metadata):
12+
published_image_metadata = image_metadata["published_image_metadata"]
13+
flavor_name = image_metadata["s3_key"].split("/")[-1]
14+
15+
regions = []
16+
if "published_openstack_images" in published_image_metadata:
17+
for image in published_image_metadata["published_openstack_images"]:
18+
regions.append(
19+
{
20+
"region": image["region_name"],
21+
"image_id": image["image_id"],
22+
"image_name": image["image_name"],
23+
}
24+
)
25+
26+
return {"flavor": flavor_name, "regions": regions}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
from .openstack import OpenStack
2+
3+
4+
class OpenStackBareMetal(OpenStack):
5+
def short_name(self):
6+
return "openstackbaremetal"
7+
8+
def full_name(self):
9+
return "OpenStack Baremetal"

0 commit comments

Comments
 (0)