Skip to content

Commit adab6da

Browse files
committed
Validate provided checksum after successful import
Use the 'checksum' hash value in the yaml files to verify the image integrity after it has been successfully imported. Show a warning, if either the hash algorithm or the hash value does not match the expected fields. Fixes #340 Signed-off-by: Gondermann <[email protected]>
1 parent 54987c8 commit adab6da

File tree

2 files changed

+25
-2
lines changed

2 files changed

+25
-2
lines changed

openstack_image_manager/manage.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -313,6 +313,8 @@ def process_images(self, images) -> set:
313313
versions[version["version"]]["meta"][
314314
"image_build_date"
315315
] = version["build_date"]
316+
if "checksum" in version:
317+
versions[version["version"]]["checksum"] = version["checksum"]
316318
if "id" in version:
317319
versions[version["version"]]["id"] = version["id"]
318320
except Exception:
@@ -611,6 +613,26 @@ def process_image(
611613
if not self.CONF.dry_run:
612614
import_result = self.import_image(image, name, url, versions, version)
613615
if import_result:
616+
if "checksum" in versions[version]:
617+
hashAlgo, hashValue = versions[version]["checksum"].split(":", 2)
618+
619+
if hashAlgo != import_result.hash_algo:
620+
logger.warning(
621+
"Provided checksum algorithm '%s' does not equal the expected algorithm '%s'"
622+
% (hashAlgo, import_result.hash_algo)
623+
)
624+
logger.warning(
625+
"Checksum for '%s' will be ignored..."
626+
% name
627+
)
628+
elif hashValue != import_result.hash_value:
629+
logger.warning(
630+
"Provided checksum for '%s' does not match backend checksum!"
631+
% name
632+
)
633+
else:
634+
logger.info("Backend checksum matches expected value")
635+
614636
logger.info(
615637
"Import of '%s' successfully completed, reloading images" % name
616638
)

test/unit/test_manage.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131
versions:
3232
- version: '1'
3333
url: http://url.com
34-
checksum: '1234'
34+
checksum: 'sha512:1234'
3535
'''
3636

3737
# sample image dict as generated from FAKE_YML
@@ -93,7 +93,8 @@ def setUp(self):
9393
self.fake_image = Image(**FAKE_IMAGE_DATA)
9494
self.fake_name = '%s (%s)' % (self.fake_image_dict['name'], '1')
9595
self.fake_url = 'http://url.com'
96-
self.versions = {'1': {'url': self.fake_url, 'meta': {'image_source': self.fake_url}}}
96+
self.fake_checksum = 'sha512:1234'
97+
self.versions = {'1': {'url': self.fake_url, 'meta': {'image_source': self.fake_url}, 'checksum': self.fake_checksum}}
9798
self.sorted_versions = ['2', '1']
9899
self.previous_image = self.fake_image
99100
self.imported_image = self.fake_image

0 commit comments

Comments
 (0)