moto/tests/test_ebs/test_ebs.py

171 lines
5.8 KiB
Python
Raw Normal View History

2022-05-07 21:11:32 +00:00
"""Unit tests for ebs-supported APIs."""
import boto3
import hashlib
import sure # noqa # pylint: disable=unused-import
from moto import mock_ebs, mock_ec2
from moto.core import 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_ebs
def test_start_snapshot__minimal():
client = boto3.client("ebs", region_name="eu-west-1")
resp = client.start_snapshot(VolumeSize=720)
resp.should.have.key("SnapshotId")
resp.should.have.key("OwnerId").equals(ACCOUNT_ID)
resp.should.have.key("Status").equals("pending")
resp.should.have.key("StartTime")
resp.should.have.key("VolumeSize").equals(720)
resp.should.have.key("BlockSize").equals(512)
@mock_ebs
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",
)
resp.should.have.key("SnapshotId")
resp.should.have.key("OwnerId").equals(ACCOUNT_ID)
resp.should.have.key("Status").equals("pending")
resp.should.have.key("StartTime")
resp.should.have.key("VolumeSize").equals(120)
resp.should.have.key("BlockSize").equals(512)
resp.should.have.key("Tags").equals([{"Key": "kt", "Value": "vt"}])
resp.should.have.key("Description").equals("my fancy snapshot")
@mock_ebs
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)
resp.should.have.key("Status").equals("completed")
@mock_ebs
def test_put_snapshot_block():
data = b"data for this specific block"
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",
)
resp.should.have.key("Checksum").equals(checksum)
resp.should.have.key("ChecksumAlgorithm").equals("SHA256")
@mock_ebs
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"
)
resp.should.have.key("DataLength").equals(524288)
resp.should.have.key("BlockData")
resp["BlockData"].read().should.equal(b"data 2")
resp.should.have.key("Checksum")
resp.should.have.key("ChecksumAlgorithm").equals("SHA256")
@mock_ebs
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]
changed_idxes.should.equal([1, 3])
changed_blocks[0].should.have.key("FirstBlockToken")
changed_blocks[0].should.have.key("SecondBlockToken")
changed_blocks[1].should.have.key("FirstBlockToken")
changed_blocks[1].shouldnt.have.key("SecondBlockToken")
@mock_ebs
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)
resp.should.have.key("VolumeSize").equals(415)
resp.should.have.key("BlockSize").equals(512)
resp.should.have.key("Blocks").length_of(3)
[b["BlockIndex"] for b in resp["Blocks"]].should.equal([1, 2, 3])
@mock_ebs
@mock_ec2
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"]
resp.should.have.length_of(1)
resp[0].should.have.key("VolumeSize").equals(720)