321 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			321 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| import time
 | |
| import boto3
 | |
| import pytest
 | |
| import sure  # noqa # pylint: disable=unused-import
 | |
| 
 | |
| from botocore.exceptions import ClientError
 | |
| from moto import mock_timestreamwrite, settings
 | |
| from moto.core import DEFAULT_ACCOUNT_ID as ACCOUNT_ID
 | |
| 
 | |
| 
 | |
| @mock_timestreamwrite
 | |
| def test_create_table():
 | |
|     ts = boto3.client("timestream-write", region_name="us-east-1")
 | |
|     ts.create_database(DatabaseName="mydatabase")
 | |
| 
 | |
|     resp = ts.create_table(
 | |
|         DatabaseName="mydatabase",
 | |
|         TableName="mytable",
 | |
|         RetentionProperties={
 | |
|             "MemoryStoreRetentionPeriodInHours": 7,
 | |
|             "MagneticStoreRetentionPeriodInDays": 42,
 | |
|         },
 | |
|     )
 | |
|     table = resp["Table"]
 | |
|     table.should.have.key("Arn").equal(
 | |
|         f"arn:aws:timestream:us-east-1:{ACCOUNT_ID}:database/mydatabase/table/mytable"
 | |
|     )
 | |
|     table.should.have.key("TableName").equal("mytable")
 | |
|     table.should.have.key("DatabaseName").equal("mydatabase")
 | |
|     table.should.have.key("TableStatus").equal("ACTIVE")
 | |
|     table.should.have.key("RetentionProperties").should.equal(
 | |
|         {
 | |
|             "MemoryStoreRetentionPeriodInHours": 7,
 | |
|             "MagneticStoreRetentionPeriodInDays": 42,
 | |
|         }
 | |
|     )
 | |
| 
 | |
| 
 | |
| @mock_timestreamwrite
 | |
| def test_create_table__with_magnetic_store_write_properties():
 | |
|     ts = boto3.client("timestream-write", region_name="us-east-1")
 | |
|     ts.create_database(DatabaseName="mydatabase")
 | |
| 
 | |
|     resp = ts.create_table(
 | |
|         DatabaseName="mydatabase",
 | |
|         TableName="mytable",
 | |
|         MagneticStoreWriteProperties={
 | |
|             "EnableMagneticStoreWrites": True,
 | |
|             "MagneticStoreRejectedDataLocation": {
 | |
|                 "S3Configuration": {"BucketName": "hithere"}
 | |
|             },
 | |
|         },
 | |
|     )
 | |
|     table = resp["Table"]
 | |
|     table.should.have.key("Arn").equal(
 | |
|         f"arn:aws:timestream:us-east-1:{ACCOUNT_ID}:database/mydatabase/table/mytable"
 | |
|     )
 | |
|     table.should.have.key("TableName").equal("mytable")
 | |
|     table.should.have.key("DatabaseName").equal("mydatabase")
 | |
|     table.should.have.key("TableStatus").equal("ACTIVE")
 | |
|     table.should.have.key("MagneticStoreWriteProperties").should.equal(
 | |
|         {
 | |
|             "EnableMagneticStoreWrites": True,
 | |
|             "MagneticStoreRejectedDataLocation": {
 | |
|                 "S3Configuration": {"BucketName": "hithere"}
 | |
|             },
 | |
|         }
 | |
|     )
 | |
| 
 | |
| 
 | |
| @mock_timestreamwrite
 | |
| def test_create_table_without_retention_properties():
 | |
|     ts = boto3.client("timestream-write", region_name="us-east-1")
 | |
|     ts.create_database(DatabaseName="mydatabase")
 | |
| 
 | |
|     resp = ts.create_table(DatabaseName="mydatabase", TableName="mytable")
 | |
|     table = resp["Table"]
 | |
|     table.should.have.key("Arn").equal(
 | |
|         f"arn:aws:timestream:us-east-1:{ACCOUNT_ID}:database/mydatabase/table/mytable"
 | |
|     )
 | |
|     table.should.have.key("TableName").equal("mytable")
 | |
|     table.should.have.key("DatabaseName").equal("mydatabase")
 | |
|     table.should.have.key("TableStatus").equal("ACTIVE")
 | |
|     table.should.have.key("RetentionProperties").equals(
 | |
|         {
 | |
|             "MemoryStoreRetentionPeriodInHours": 123,
 | |
|             "MagneticStoreRetentionPeriodInDays": 123,
 | |
|         }
 | |
|     )
 | |
| 
 | |
| 
 | |
| @mock_timestreamwrite
 | |
| def test_describe_table():
 | |
|     ts = boto3.client("timestream-write", region_name="us-east-1")
 | |
|     ts.create_database(DatabaseName="mydatabase")
 | |
| 
 | |
|     ts.create_table(
 | |
|         DatabaseName="mydatabase",
 | |
|         TableName="mytable",
 | |
|         RetentionProperties={
 | |
|             "MemoryStoreRetentionPeriodInHours": 10,
 | |
|             "MagneticStoreRetentionPeriodInDays": 12,
 | |
|         },
 | |
|     )
 | |
| 
 | |
|     table = ts.describe_table(DatabaseName="mydatabase", TableName="mytable")["Table"]
 | |
|     table.should.have.key("Arn").equal(
 | |
|         f"arn:aws:timestream:us-east-1:{ACCOUNT_ID}:database/mydatabase/table/mytable"
 | |
|     )
 | |
|     table.should.have.key("TableName").equal("mytable")
 | |
|     table.should.have.key("DatabaseName").equal("mydatabase")
 | |
|     table.should.have.key("TableStatus").equal("ACTIVE")
 | |
|     table.should.have.key("RetentionProperties").should.equal(
 | |
|         {
 | |
|             "MemoryStoreRetentionPeriodInHours": 10,
 | |
|             "MagneticStoreRetentionPeriodInDays": 12,
 | |
|         }
 | |
|     )
 | |
| 
 | |
| 
 | |
| @mock_timestreamwrite
 | |
| def test_describe_unknown_database():
 | |
|     ts = boto3.client("timestream-write", region_name="us-east-1")
 | |
|     ts.create_database(DatabaseName="mydatabase")
 | |
| 
 | |
|     with pytest.raises(ClientError) as exc:
 | |
|         ts.describe_table(DatabaseName="mydatabase", TableName="unknown")
 | |
|     err = exc.value.response["Error"]
 | |
|     err["Code"].should.equal("ResourceNotFoundException")
 | |
|     err["Message"].should.equal("The table unknown does not exist.")
 | |
| 
 | |
| 
 | |
| @mock_timestreamwrite
 | |
| def test_create_multiple_tables():
 | |
|     ts = boto3.client("timestream-write", region_name="us-east-1")
 | |
|     ts.create_database(DatabaseName="mydatabase")
 | |
| 
 | |
|     for idx in range(0, 5):
 | |
|         ts.create_table(
 | |
|             DatabaseName="mydatabase",
 | |
|             TableName=f"mytable_{idx}",
 | |
|             RetentionProperties={
 | |
|                 "MemoryStoreRetentionPeriodInHours": 7,
 | |
|                 "MagneticStoreRetentionPeriodInDays": 42,
 | |
|             },
 | |
|         )
 | |
| 
 | |
|     database = ts.describe_database(DatabaseName="mydatabase")["Database"]
 | |
| 
 | |
|     database.should.have.key("TableCount").equals(5)
 | |
| 
 | |
|     tables = ts.list_tables(DatabaseName="mydatabase")["Tables"]
 | |
|     tables.should.have.length_of(5)
 | |
|     set([t["DatabaseName"] for t in tables]).should.equal({"mydatabase"})
 | |
|     set([t["TableName"] for t in tables]).should.equal(
 | |
|         {"mytable_0", "mytable_1", "mytable_2", "mytable_3", "mytable_4"}
 | |
|     )
 | |
|     set([t["TableStatus"] for t in tables]).should.equal({"ACTIVE"})
 | |
| 
 | |
| 
 | |
| @mock_timestreamwrite
 | |
| def test_delete_table():
 | |
|     ts = boto3.client("timestream-write", region_name="us-east-1")
 | |
|     ts.create_database(DatabaseName="mydatabase")
 | |
| 
 | |
|     for idx in range(0, 3):
 | |
|         ts.create_table(
 | |
|             DatabaseName="mydatabase",
 | |
|             TableName=f"mytable_{idx}",
 | |
|             RetentionProperties={
 | |
|                 "MemoryStoreRetentionPeriodInHours": 7,
 | |
|                 "MagneticStoreRetentionPeriodInDays": 42,
 | |
|             },
 | |
|         )
 | |
| 
 | |
|     tables = ts.list_tables(DatabaseName="mydatabase")["Tables"]
 | |
|     tables.should.have.length_of(3)
 | |
| 
 | |
|     ts.delete_table(DatabaseName="mydatabase", TableName="mytable_1")
 | |
| 
 | |
|     tables = ts.list_tables(DatabaseName="mydatabase")["Tables"]
 | |
|     tables.should.have.length_of(2)
 | |
|     set([t["TableName"] for t in tables]).should.equal({"mytable_0", "mytable_2"})
 | |
| 
 | |
| 
 | |
| @mock_timestreamwrite
 | |
| def test_update_table():
 | |
|     ts = boto3.client("timestream-write", region_name="us-east-1")
 | |
|     ts.create_database(DatabaseName="mydatabase")
 | |
|     ts.create_table(DatabaseName="mydatabase", TableName="mytable")
 | |
| 
 | |
|     resp = ts.update_table(
 | |
|         DatabaseName="mydatabase",
 | |
|         TableName="mytable",
 | |
|         RetentionProperties={
 | |
|             "MemoryStoreRetentionPeriodInHours": 1,
 | |
|             "MagneticStoreRetentionPeriodInDays": 2,
 | |
|         },
 | |
|     )
 | |
|     table = resp["Table"]
 | |
|     table.should.have.key("RetentionProperties").equals(
 | |
|         {
 | |
|             "MagneticStoreRetentionPeriodInDays": 2,
 | |
|             "MemoryStoreRetentionPeriodInHours": 1,
 | |
|         }
 | |
|     )
 | |
| 
 | |
|     table = ts.describe_table(DatabaseName="mydatabase", TableName="mytable")["Table"]
 | |
|     table.should.have.key("Arn").equal(
 | |
|         f"arn:aws:timestream:us-east-1:{ACCOUNT_ID}:database/mydatabase/table/mytable"
 | |
|     )
 | |
|     table.should.have.key("TableName").equal("mytable")
 | |
|     table.should.have.key("DatabaseName").equal("mydatabase")
 | |
|     table.should.have.key("TableStatus").equal("ACTIVE")
 | |
|     table.should.have.key("RetentionProperties").equals(
 | |
|         {
 | |
|             "MagneticStoreRetentionPeriodInDays": 2,
 | |
|             "MemoryStoreRetentionPeriodInHours": 1,
 | |
|         }
 | |
|     )
 | |
| 
 | |
| 
 | |
| @mock_timestreamwrite
 | |
| def test_update_table__with_magnetic_store_write_properties():
 | |
|     ts = boto3.client("timestream-write", region_name="us-east-1")
 | |
|     ts.create_database(DatabaseName="mydatabase")
 | |
| 
 | |
|     ts.create_table(DatabaseName="mydatabase", TableName="mytable")
 | |
| 
 | |
|     resp = ts.update_table(
 | |
|         DatabaseName="mydatabase",
 | |
|         TableName="mytable",
 | |
|         MagneticStoreWriteProperties={
 | |
|             "EnableMagneticStoreWrites": True,
 | |
|             "MagneticStoreRejectedDataLocation": {
 | |
|                 "S3Configuration": {"BucketName": "hithere"}
 | |
|             },
 | |
|         },
 | |
|     )
 | |
|     table = resp["Table"]
 | |
|     table.should.have.key("Arn").equal(
 | |
|         f"arn:aws:timestream:us-east-1:{ACCOUNT_ID}:database/mydatabase/table/mytable"
 | |
|     )
 | |
|     table.should.have.key("TableName").equal("mytable")
 | |
|     table.should.have.key("DatabaseName").equal("mydatabase")
 | |
|     table.should.have.key("TableStatus").equal("ACTIVE")
 | |
|     table.should.have.key("MagneticStoreWriteProperties").should.equal(
 | |
|         {
 | |
|             "EnableMagneticStoreWrites": True,
 | |
|             "MagneticStoreRejectedDataLocation": {
 | |
|                 "S3Configuration": {"BucketName": "hithere"}
 | |
|             },
 | |
|         }
 | |
|     )
 | |
| 
 | |
| 
 | |
| @mock_timestreamwrite
 | |
| def test_write_records():
 | |
|     # The query-feature is not available at the moment,
 | |
|     # so there's no way for us to verify writing records is successful
 | |
|     # For now, we'll just send them off into the ether and pray
 | |
|     ts = boto3.client("timestream-write", region_name="us-east-1")
 | |
|     ts.create_database(DatabaseName="mydatabase")
 | |
|     ts.create_table(DatabaseName="mydatabase", TableName="mytable")
 | |
| 
 | |
|     # Sample records from https://docs.aws.amazon.com/timestream/latest/developerguide/code-samples.write.html
 | |
|     dimensions = [
 | |
|         {"Name": "region", "Value": "us-east-1"},
 | |
|         {"Name": "az", "Value": "az1"},
 | |
|         {"Name": "hostname", "Value": "host1"},
 | |
|     ]
 | |
| 
 | |
|     cpu_utilization = {
 | |
|         "Dimensions": dimensions,
 | |
|         "MeasureName": "cpu_utilization",
 | |
|         "MeasureValue": "13.5",
 | |
|         "MeasureValueType": "DOUBLE",
 | |
|         "Time": str(time.time()),
 | |
|     }
 | |
| 
 | |
|     memory_utilization = {
 | |
|         "Dimensions": dimensions,
 | |
|         "MeasureName": "memory_utilization",
 | |
|         "MeasureValue": "40",
 | |
|         "MeasureValueType": "DOUBLE",
 | |
|         "Time": str(time.time()),
 | |
|     }
 | |
| 
 | |
|     sample_records = [cpu_utilization, memory_utilization]
 | |
| 
 | |
|     resp = ts.write_records(
 | |
|         DatabaseName="mydatabase",
 | |
|         TableName="mytable",
 | |
|         Records=sample_records,
 | |
|     ).get("RecordsIngested", {})
 | |
|     resp["Total"].should.equal(len(sample_records))
 | |
|     (resp["MemoryStore"] + resp["MagneticStore"]).should.equal(resp["Total"])
 | |
| 
 | |
|     if not settings.TEST_SERVER_MODE:
 | |
|         from moto.timestreamwrite.models import timestreamwrite_backends
 | |
| 
 | |
|         backend = timestreamwrite_backends[ACCOUNT_ID]["us-east-1"]
 | |
|         records = backend.databases["mydatabase"].tables["mytable"].records
 | |
|         records.should.equal(sample_records)
 | |
| 
 | |
|         disk_utilization = {
 | |
|             "Dimensions": dimensions,
 | |
|             "MeasureName": "disk_utilization",
 | |
|             "MeasureValue": "100",
 | |
|             "MeasureValueType": "DOUBLE",
 | |
|             "Time": str(time.time()),
 | |
|         }
 | |
|         sample_records.append(disk_utilization)
 | |
| 
 | |
|         ts.write_records(
 | |
|             DatabaseName="mydatabase",
 | |
|             TableName="mytable",
 | |
|             Records=[disk_utilization],
 | |
|         )
 | |
|         records.should.equal(sample_records)
 |