@@ -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