]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[cloud] Omit uploading empty blocks to EBS snapshots
authorMichael Brown <mcb30@ipxe.org>
Mon, 23 Mar 2026 15:34:41 +0000 (15:34 +0000)
committerMichael Brown <mcb30@ipxe.org>
Mon, 23 Mar 2026 16:00:05 +0000 (16:00 +0000)
Signed-off-by: Michael Brown <mcb30@ipxe.org>
contrib/cloud/aws-import

index a4585aad8cf66003ebf758faa6ec7f894a195f25..f6aded8f3a319664dacc61303b7376617c9a9f1c 100755 (executable)
@@ -12,6 +12,7 @@ import subprocess
 import boto3
 
 BLOCKSIZE = 512 * 1024
+EMPTY_CHECKSUM = b64encode(sha256(b'\0' * BLOCKSIZE).digest()).decode()
 
 
 def detect_architecture(image):
@@ -30,6 +31,7 @@ def create_snapshot(region, description, image, tags):
                                      Description=description,
                                      Tags=tags)
     snapshot_id = snapshot['SnapshotId']
+    changed = 0
     with open(image, 'rb') as fh:
         for block in count():
             data = fh.read(BLOCKSIZE)
@@ -37,14 +39,17 @@ def create_snapshot(region, description, image, tags):
                 break
             data = data.ljust(BLOCKSIZE, b'\0')
             checksum = b64encode(sha256(data).digest()).decode()
+            if checksum == EMPTY_CHECKSUM:
+                continue
             client.put_snapshot_block(SnapshotId=snapshot_id,
                                       BlockIndex=block,
                                       BlockData=data,
                                       DataLength=BLOCKSIZE,
                                       Checksum=checksum,
                                       ChecksumAlgorithm='SHA256')
+            changed += 1
     client.complete_snapshot(SnapshotId=snapshot_id,
-                             ChangedBlocksCount=block)
+                             ChangedBlocksCount=changed)
     return snapshot_id