Skip to content

Commit 7c09cfb

Browse files
Add checksum_url option
Signed-off-by: Matthias Harzer <matthias.harzer@inovex.de>
1 parent cf69edf commit 7c09cfb

2 files changed

Lines changed: 50 additions & 13 deletions

File tree

etc/schema.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ meta:
4545
versions:
4646
build_date: any(day(), timestamp())
4747
checksum: regex(r'\w+:([a-f0-9]{32}|[a-f0-9]{40}|[a-f0-9]{64}|[a-f0-9]{128})$', name='valid checksum', required=False)
48+
checksum_url: regex(r'^(http|ftp)s?:\/\/\w+.*', name='valid URL', required=False)
4849
checksums_url: regex(r'^(http|ftp)s?:\/\/\w+.*', name='valid URL', required=False)
4950
hidden: bool(required=False)
5051
image_description: str(required=False)

openstack_image_manager/main.py

Lines changed: 49 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,15 @@ def read_image_files(self, return_all_images=False) -> list:
174174
logger.error(exc)
175175
return all_images
176176

177-
def get_checksum(self, url: str, checksums_url: str) -> str:
177+
def is_checksum(self, string: str) -> bool:
178+
return (
179+
len(string) == 128
180+
or len(string) == 64
181+
or len(string) == 40
182+
or len(string) == 32
183+
) and "." not in string
184+
185+
def get_checksum_from_checksums_url(self, url: str, checksums_url: str) -> str:
178186
"""
179187
Get the checksum of an upstream image by parsing its corresponding checksums file
180188
@@ -191,15 +199,27 @@ def get_checksum(self, url: str, checksums_url: str) -> str:
191199
if filename in line:
192200
split = line.split(" ")
193201
for elem in split:
194-
if (
195-
len(elem) == 128
196-
or len(elem) == 64
197-
or len(elem) == 40
198-
or len(elem) == 32
199-
) and "." not in elem:
202+
if self.is_checksum(elem):
200203
return elem
201204
return ""
202205

206+
def get_checksum_from_checksum_url(self, checksum_url: str) -> str:
207+
"""
208+
Get the checksum from a checksum_url
209+
210+
Params:
211+
checksum_url: the URL of the checksum file
212+
213+
Returns:
214+
the checksum, if it is available or else an empty string
215+
"""
216+
checksum_file_content = requests.get(checksum_url).text.strip()
217+
218+
if self.is_checksum(checksum_file_content):
219+
return checksum_file_content
220+
221+
return ""
222+
203223
def create_connection(self) -> None:
204224
if "OS_AUTH_URL" in os.environ:
205225
self.conn = openstack.connect()
@@ -323,13 +343,21 @@ def process_images(self, images) -> set:
323343
versions[version["version"]]["hidden"] = version["hidden"]
324344

325345
if version["version"] == "latest": #
346+
if "checksums_url" in version and "checksum_url" in version:
347+
raise ValueError(
348+
'You may only specify either "checksums_url" or "checksum_url", not both'
349+
)
326350
if "checksums_url" in version:
327351
versions[version["version"]]["checksums_url"] = version[
328352
"checksums_url"
329353
]
354+
elif "checksum_url" in version:
355+
versions[version["version"]]["checksum_url"] = version[
356+
"checksum_url"
357+
]
330358
else:
331359
raise ValueError(
332-
'Key "checksums_url" is required when using version "latest"'
360+
'Key "checksums_url" or "checksum_url" is required when using version "latest"'
333361
)
334362

335363
if "meta" in version:
@@ -609,13 +637,21 @@ def process_image(
609637
existence = image["name"] in cloud_images
610638

611639
if version == "latest":
612-
checksums_url = versions[version]["checksums_url"]
613-
upstream_checksum = self.get_checksum(
614-
versions[version]["url"], checksums_url
615-
)
640+
checksums_url = versions[version].get("checksums_url")
641+
checksum_url = versions[version].get("checksum_url")
642+
643+
if checksums_url:
644+
upstream_checksum = self.get_checksum_from_checksums_url(
645+
versions[version]["url"], checksums_url
646+
)
647+
else:
648+
upstream_checksum = self.get_checksum_from_checksum_url(
649+
checksum_url
650+
)
651+
616652
if not upstream_checksum:
617653
logger.error(
618-
f"Could not find checksum for image '{image['name']}', check the checksums_url"
654+
f"Could not find checksum for image '{image['name']}', check the checksums_url or checksum_url"
619655
)
620656
return existing_images, imported_image, previous_image
621657

0 commit comments

Comments
 (0)