moto/tests/test_ebs/test_ebs.py
2024-01-27 19:38:09 +00:00

170 lines
5.4 KiB
Python

import hashlib
import boto3
from moto import mock_aws
from moto.core import DEFAULT_ACCOUNT_ID as ACCOUNT_ID
# See our Development Tips on writing tests for hints on how to write good tests:
# http://docs.getmoto.org/en/latest/docs/contributing/development_tips/tests.html
@mock_aws
def test_start_snapshot__minimal():
client = boto3.client("ebs", region_name="eu-west-1")
resp = client.start_snapshot(VolumeSize=720)
assert "SnapshotId" in resp
assert resp["OwnerId"] == ACCOUNT_ID
assert resp["Status"] == "pending"
assert "StartTime" in resp
assert resp["VolumeSize"] == 720
assert resp["BlockSize"] == 512
@mock_aws
def test_start_snapshot():
client = boto3.client("ebs", region_name="eu-west-1")
resp = client.start_snapshot(
VolumeSize=120,
Tags=[{"Key": "kt", "Value": "vt"}],
Description="my fancy snapshot",
)
assert "SnapshotId" in resp
assert resp["OwnerId"] == ACCOUNT_ID
assert resp["Status"] == "pending"
assert "StartTime" in resp
assert resp["VolumeSize"] == 120
assert resp["BlockSize"] == 512
assert resp["Tags"] == [{"Key": "kt", "Value": "vt"}]
assert resp["Description"] == "my fancy snapshot"
@mock_aws
def test_complete_snapshot():
client = boto3.client("ebs", region_name="ap-southeast-1")
snapshot_id = client.start_snapshot(VolumeSize=720)["SnapshotId"]
resp = client.complete_snapshot(SnapshotId=snapshot_id, ChangedBlocksCount=0)
assert resp["Status"] == "completed"
@mock_aws
def test_put_snapshot_block():
data = b"data for this specific block\xbf"
checksum = hashlib.sha256(data).hexdigest()
client = boto3.client("ebs", region_name="eu-west-1")
snapshot_id = client.start_snapshot(VolumeSize=720)["SnapshotId"]
resp = client.put_snapshot_block(
SnapshotId=snapshot_id,
BlockIndex=5,
BlockData=data,
DataLength=524288,
Checksum=checksum,
ChecksumAlgorithm="SHA256",
)
assert resp["Checksum"] == checksum
assert resp["ChecksumAlgorithm"] == "SHA256"
@mock_aws
def test_get_snapshot_block():
client = boto3.client("ebs", region_name="eu-west-1")
snapshot_id = client.start_snapshot(VolumeSize=720)["SnapshotId"]
for idx, data in [(1, b"data 1"), (2, b"data 2"), (3, b"data 3")]:
checksum = hashlib.sha256(data).hexdigest()
client.put_snapshot_block(
SnapshotId=snapshot_id,
BlockIndex=idx,
BlockData=data,
DataLength=524288,
Checksum=checksum,
ChecksumAlgorithm="SHA256",
)
resp = client.get_snapshot_block(
SnapshotId=snapshot_id, BlockIndex=2, BlockToken="n/a"
)
assert resp["DataLength"] == 524288
assert "BlockData" in resp
assert resp["BlockData"].read() == b"data 2"
assert "Checksum" in resp
assert resp["ChecksumAlgorithm"] == "SHA256"
@mock_aws
def test_list_changed_blocks():
client = boto3.client("ebs", region_name="ap-southeast-1")
snapshot_id1 = client.start_snapshot(VolumeSize=415)["SnapshotId"]
snapshot_id2 = client.start_snapshot(VolumeSize=415)["SnapshotId"]
for idx, data in [(1, b"data 1"), (2, b"data 2"), (3, b"data 3")]:
checksum = hashlib.sha256(data).hexdigest()
client.put_snapshot_block(
SnapshotId=snapshot_id1,
BlockIndex=idx,
BlockData=data,
DataLength=524288,
Checksum=checksum,
ChecksumAlgorithm="SHA256",
)
for idx, data in [(1, b"data 1.1"), (2, b"data 2"), (4, b"data 3.1")]:
checksum = hashlib.sha256(data).hexdigest()
client.put_snapshot_block(
SnapshotId=snapshot_id2,
BlockIndex=idx,
BlockData=data,
DataLength=524288,
Checksum=checksum,
ChecksumAlgorithm="SHA256",
)
resp = client.list_changed_blocks(
FirstSnapshotId=snapshot_id1, SecondSnapshotId=snapshot_id2
)
changed_blocks = resp["ChangedBlocks"]
changed_idxes = [b["BlockIndex"] for b in changed_blocks]
assert changed_idxes == [1, 3]
assert "FirstBlockToken" in changed_blocks[0]
assert "SecondBlockToken" in changed_blocks[0]
assert "FirstBlockToken" in changed_blocks[1]
assert "SecondBlockToken" not in changed_blocks[1]
@mock_aws
def test_list_snapshot_blocks():
client = boto3.client("ebs", region_name="ap-southeast-1")
snapshot_id = client.start_snapshot(VolumeSize=415)["SnapshotId"]
for idx, data in [(1, b"data 1"), (2, b"data 2"), (3, b"data 3")]:
checksum = hashlib.sha256(data).hexdigest()
client.put_snapshot_block(
SnapshotId=snapshot_id,
BlockIndex=idx,
BlockData=data,
DataLength=524288,
Checksum=checksum,
ChecksumAlgorithm="SHA256",
)
resp = client.list_snapshot_blocks(SnapshotId=snapshot_id)
assert resp["VolumeSize"] == 415
assert resp["BlockSize"] == 512
assert len(resp["Blocks"]) == 3
assert [b["BlockIndex"] for b in resp["Blocks"]] == [1, 2, 3]
@mock_aws
def test_start_snapshot__should_be_created_in_ec2():
ebs = boto3.client("ebs", region_name="eu-north-1")
ec2 = boto3.client("ec2", region_name="eu-north-1")
snapshot_id = ebs.start_snapshot(VolumeSize=720)["SnapshotId"]
resp = ec2.describe_snapshots(SnapshotIds=[snapshot_id])["Snapshots"]
assert len(resp) == 1
assert resp[0]["VolumeSize"] == 720