Skip to content

Commit 8fb920e

Browse files
committed
Expand release-information with history of releases.json files
Ticket: ENT-13001
1 parent d8033bd commit 8fb920e

File tree

2 files changed

+130
-2
lines changed

2 files changed

+130
-2
lines changed

src/cfengine_cli/masterfiles/analyze.py

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,3 +91,36 @@ def finalize_vcf(versions_dict, checksums_dict, files_dict):
9191
)
9292

9393
return versions_dict, checksums_dict, files_dict
94+
95+
96+
def filter_unstable_releases(data):
97+
# Filter the data to only include stable releases (not debug, alpha, or beta releases):
98+
filtered_data = []
99+
100+
for release_data in data.get("releases", []):
101+
if release_data.get("debug") is True:
102+
continue
103+
if release_data.get("alpha") is True:
104+
continue
105+
if release_data.get("beta") is True:
106+
continue
107+
108+
filtered_data.append(release_data)
109+
110+
return filtered_data
111+
112+
113+
def sort_release_data(file_checksums_dict):
114+
# Newest versions first, and files sorted alphabetically within each version
115+
for v in file_checksums_dict.keys():
116+
file_checksums_dict[v] = dict_sorted_by_key(file_checksums_dict[v])
117+
118+
sorted_dict = OrderedDict(
119+
sorted(
120+
file_checksums_dict.items(),
121+
key=lambda p: version_as_comparable_list(p[0]),
122+
reverse=True,
123+
)
124+
)
125+
126+
return sorted_dict

src/cfengine_cli/masterfiles/generate_release_information.py

Lines changed: 97 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,21 @@
1-
from cfengine_cli.masterfiles.download import download_all_versions
1+
from cfengine_cli.masterfiles.download import (
2+
ENTERPRISE_RELEASES_URL,
3+
download_all_versions,
4+
)
25
from cfengine_cli.masterfiles.generate_vcf_download import generate_vcf_download
6+
from cfengine_cli.masterfiles.analyze import filter_unstable_releases, sort_release_data
37
from cfengine_cli.masterfiles.generate_vcf_git_checkout import generate_vcf_git_checkout
48
from cfengine_cli.masterfiles.check_download_matches_git import (
59
check_download_matches_git,
610
)
7-
from cfbs.utils import immediate_subdirectories, version_is_at_least
11+
from cfbs.utils import (
12+
get_json,
13+
immediate_subdirectories,
14+
version_is_at_least,
15+
write_json,
16+
CFBSNetworkError,
17+
CFBSExitError,
18+
)
819

920
DOWNLOAD_PATH = "downloaded_masterfiles"
1021

@@ -33,6 +44,8 @@ def generate_release_information_impl(
3344
)
3445
generate_vcf_download(DOWNLOAD_PATH, downloaded_versions)
3546

47+
generate_release_history()
48+
3649
if check:
3750
print(
3851
"Downloading releases of masterfiles from git (github.com) and generating "
@@ -52,3 +65,85 @@ def generate_release_information_impl(
5265
"(Run again with --check-against-git to download and compare with files "
5366
+ "from git, and generate -git.json files)"
5467
)
68+
69+
70+
def generate_release_history():
71+
print("Generating release history information...")
72+
73+
releases_data = download_releasedata()
74+
75+
stable_releases = filter_unstable_releases(releases_data)
76+
77+
file_checksums_dict = build_release_history(stable_releases)
78+
79+
sorted_releases = sort_release_data(file_checksums_dict)
80+
81+
write_json("./cfengine-enterprise/checksums.json", sorted_releases)
82+
83+
84+
def download_releasedata():
85+
# Downloading releases.json:
86+
try:
87+
releases_data = get_json(ENTERPRISE_RELEASES_URL)
88+
89+
except CFBSNetworkError:
90+
raise CFBSExitError(
91+
"Downloading CFEngine release data failed - check your Wi-Fi / network settings."
92+
)
93+
94+
return releases_data
95+
96+
97+
def build_release_history(filtered_releases):
98+
release_history = {}
99+
100+
for release_data in filtered_releases:
101+
if not release_data.get("version") or not release_data.get("URL"):
102+
continue
103+
104+
subdata, version = download_release_version_data(release_data)
105+
version_files = extract_version_files(subdata)
106+
107+
if version_files:
108+
release_history[version] = version_files
109+
110+
return release_history
111+
112+
113+
def download_release_version_data(release_data):
114+
# Downloads each versionnumber.json in releases.json
115+
version = release_data.get("version")
116+
url = release_data.get("URL")
117+
118+
try:
119+
return get_json(url), version
120+
except CFBSNetworkError:
121+
raise CFBSExitError(
122+
f"Downloading CFEngine release data for version {version} failed - check your Wi-Fi / network settings."
123+
)
124+
125+
126+
def extract_version_files(subdata):
127+
# Gets filenames and checksums for each file in the subdata of releases.json:
128+
artifacts = subdata.get("artifacts", {})
129+
version_files = {}
130+
131+
for asset_list in artifacts.values():
132+
for asset_data in asset_list:
133+
filename, checksum = extract_file_info(asset_data)
134+
135+
if filename and checksum:
136+
version_files[filename] = checksum
137+
138+
return version_files
139+
140+
141+
def extract_file_info(asset_data):
142+
url = asset_data.get("URL")
143+
checksum = asset_data.get("SHA256")
144+
145+
if url and checksum:
146+
filename = url.split("/")[-1]
147+
return filename, checksum
148+
149+
return None, None

0 commit comments

Comments
 (0)