| 
									
										
										
										
											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 | 
					
						
							| 
									
										
										
										
											2022-08-13 09:49:43 +00:00
										 |  |  | from moto.core import DEFAULT_ACCOUNT_ID as ACCOUNT_ID | 
					
						
							| 
									
										
										
										
											2022-05-07 21:11:32 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | # 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) |