237 lines
		
	
	
		
			8.9 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			237 lines
		
	
	
		
			8.9 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| """Unit tests for es-supported APIs."""
 | |
| import boto3
 | |
| import pytest
 | |
| import sure  # noqa # pylint: disable=unused-import
 | |
| from botocore.exceptions import ClientError
 | |
| from moto import mock_es
 | |
| 
 | |
| # 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
 | |
| 
 | |
| 
 | |
| @pytest.mark.parametrize(
 | |
|     "name", ["getmoto.org", "search-is-$$$", "dev_or_test", "dev/test", "1love", "DEV"]
 | |
| )
 | |
| @mock_es
 | |
| def test_create_domain_invalid_name(name):
 | |
|     client = boto3.client("es", region_name="us-east-2")
 | |
|     with pytest.raises(ClientError) as exc:
 | |
|         client.create_elasticsearch_domain(DomainName=name)
 | |
|     err = exc.value.response["Error"]
 | |
|     err["Message"].should.equal(
 | |
|         f"1 validation error detected: Value '{name}' at 'domainName' failed to satisfy constraint: Member must satisfy regular expression pattern: [a-z][a-z0-9\\-]+"
 | |
|     )
 | |
|     err["Code"].should.equal("ValidationException")
 | |
| 
 | |
| 
 | |
| @mock_es
 | |
| def test_create_elasticsearch_domain_minimal():
 | |
|     client = boto3.client("es", region_name="us-east-2")
 | |
|     resp = client.create_elasticsearch_domain(DomainName="motosearch")
 | |
| 
 | |
|     resp.should.have.key("DomainStatus")
 | |
|     domain = resp["DomainStatus"]
 | |
|     domain.should.have.key("DomainName").equals("motosearch")
 | |
|     domain.should.have.key("DomainId")
 | |
|     domain.should.have.key("ARN").equals(
 | |
|         f"arn:aws:es:us-east-2:domain/{domain['DomainId']}"
 | |
|     )
 | |
|     domain.should.have.key("Created").equals(True)
 | |
|     domain.should.have.key("Deleted").equals(False)
 | |
|     domain.should.have.key("Processing").equals(False)
 | |
|     domain.should.have.key("UpgradeProcessing").equals(False)
 | |
|     domain.shouldnt.have.key("ElasticsearchVersion")
 | |
| 
 | |
| 
 | |
| @mock_es
 | |
| def test_create_elasticsearch_domain():
 | |
|     client = boto3.client("es", region_name="us-east-2")
 | |
|     resp = client.create_elasticsearch_domain(
 | |
|         DomainName="motosearch",
 | |
|         ElasticsearchVersion="7.10",
 | |
|         ElasticsearchClusterConfig={
 | |
|             "InstanceType": "m3.large.elasticsearch",
 | |
|             "InstanceCount": 1,
 | |
|             "DedicatedMasterEnabled": True,
 | |
|             "DedicatedMasterType": "m3.large.elasticsearch",
 | |
|             "DedicatedMasterCount": 1,
 | |
|             "ZoneAwarenessEnabled": False,
 | |
|             "WarmEnabled": False,
 | |
|             "ColdStorageOptions": {"Enabled": False},
 | |
|         },
 | |
|         EBSOptions={
 | |
|             "EBSEnabled": True,
 | |
|             "VolumeType": "io2",
 | |
|             "VolumeSize": 10,
 | |
|             "Iops": 1,
 | |
|         },
 | |
|         AccessPolicies="some unvalidated accesspolicy",
 | |
|         SnapshotOptions={"AutomatedSnapshotStartHour": 1},
 | |
|         VPCOptions={"SubnetIds": ["s1"], "SecurityGroupIds": ["sg1"]},
 | |
|         CognitoOptions={"Enabled": False},
 | |
|         EncryptionAtRestOptions={"Enabled": False},
 | |
|         NodeToNodeEncryptionOptions={"Enabled": False},
 | |
|         AdvancedOptions={"option": "value"},
 | |
|         LogPublishingOptions={"log1": {"Enabled": False}},
 | |
|         DomainEndpointOptions={"EnforceHTTPS": True, "CustomEndpointEnabled": False},
 | |
|         AdvancedSecurityOptions={"Enabled": False},
 | |
|         AutoTuneOptions={"DesiredState": "ENABLED"},
 | |
|     )
 | |
| 
 | |
|     domain = resp["DomainStatus"]
 | |
|     domain.should.have.key("DomainId")
 | |
|     domain.should.have.key("Created").equals(True)
 | |
|     domain.should.have.key("ElasticsearchVersion").equals("7.10")
 | |
| 
 | |
|     domain.should.have.key("ElasticsearchClusterConfig")
 | |
|     cluster_config = domain["ElasticsearchClusterConfig"]
 | |
|     cluster_config.should.have.key("ColdStorageOptions").equals({"Enabled": False})
 | |
|     cluster_config.should.have.key("DedicatedMasterCount").equals(1)
 | |
|     cluster_config.should.have.key("DedicatedMasterType").equals(
 | |
|         "m3.large.elasticsearch"
 | |
|     )
 | |
|     cluster_config.should.have.key("WarmEnabled").equals(False)
 | |
| 
 | |
|     domain.should.have.key("EBSOptions")
 | |
|     ebs = domain["EBSOptions"]
 | |
|     ebs.should.have.key("EBSEnabled").equals(True)
 | |
|     ebs.should.have.key("Iops").equals(1)
 | |
|     ebs.should.have.key("VolumeSize").equals(10)
 | |
|     ebs.should.have.key("VolumeType").equals("io2")
 | |
| 
 | |
|     domain.should.have.key("AccessPolicies").equals("some unvalidated accesspolicy")
 | |
| 
 | |
|     domain.should.have.key("SnapshotOptions")
 | |
|     snapshots = domain["SnapshotOptions"]
 | |
|     snapshots.should.have.key("AutomatedSnapshotStartHour").equals(1)
 | |
| 
 | |
|     domain.should.have.key("VPCOptions")
 | |
|     vpcs = domain["VPCOptions"]
 | |
|     vpcs.should.have.key("SubnetIds").equals(["s1"])
 | |
|     vpcs.should.have.key("SecurityGroupIds").equals(["sg1"])
 | |
| 
 | |
|     domain.should.have.key("CognitoOptions")
 | |
|     cognito = domain["CognitoOptions"]
 | |
|     cognito.should.have.key("Enabled").equals(False)
 | |
| 
 | |
|     domain.should.have.key("EncryptionAtRestOptions")
 | |
|     encryption_at_rest = domain["EncryptionAtRestOptions"]
 | |
|     encryption_at_rest.should.have.key("Enabled").equals(False)
 | |
| 
 | |
|     domain.should.have.key("NodeToNodeEncryptionOptions")
 | |
|     encryption = domain["NodeToNodeEncryptionOptions"]
 | |
|     encryption.should.have.key("Enabled").equals(False)
 | |
| 
 | |
|     domain.should.have.key("AdvancedOptions")
 | |
|     advanced = domain["AdvancedOptions"]
 | |
|     advanced.should.have.key("option").equals("value")
 | |
| 
 | |
|     domain.should.have.key("LogPublishingOptions")
 | |
|     advanced = domain["LogPublishingOptions"]
 | |
|     advanced.should.have.key("log1").equals({"Enabled": False})
 | |
| 
 | |
|     domain.should.have.key("DomainEndpointOptions")
 | |
|     endpoint = domain["DomainEndpointOptions"]
 | |
|     endpoint.should.have.key("EnforceHTTPS").equals(True)
 | |
|     endpoint.should.have.key("CustomEndpointEnabled").equals(False)
 | |
| 
 | |
|     domain.should.have.key("AdvancedSecurityOptions")
 | |
|     advanced_security = domain["AdvancedSecurityOptions"]
 | |
|     advanced_security.should.have.key("Enabled").equals(False)
 | |
| 
 | |
|     domain.should.have.key("AutoTuneOptions")
 | |
|     auto_tune = domain["AutoTuneOptions"]
 | |
|     auto_tune.should.have.key("State").equals("ENABLED")
 | |
| 
 | |
| 
 | |
| @mock_es
 | |
| def test_delete_elasticsearch_domain():
 | |
|     client = boto3.client("es", region_name="ap-southeast-1")
 | |
|     client.create_elasticsearch_domain(DomainName="motosearch")
 | |
|     client.delete_elasticsearch_domain(DomainName="motosearch")
 | |
| 
 | |
|     client.list_domain_names()["DomainNames"].should.equal([])
 | |
| 
 | |
| 
 | |
| @mock_es
 | |
| def test_missing_delete_elasticsearch_domain():
 | |
|     client = boto3.client("es", region_name="ap-southeast-1")
 | |
|     with pytest.raises(ClientError) as exc:
 | |
|         client.delete_elasticsearch_domain(DomainName="unknown")
 | |
| 
 | |
|     meta = exc.value.response["ResponseMetadata"]
 | |
|     meta["HTTPStatusCode"].should.equal(409)
 | |
| 
 | |
|     err = exc.value.response["Error"]
 | |
|     err["Code"].should.equal("ResourceNotFoundException")
 | |
|     err["Message"].should.equal("Domain not found: unknown")
 | |
| 
 | |
| 
 | |
| @mock_es
 | |
| def test_describe_invalid_domain():
 | |
|     client = boto3.client("es", region_name="us-east-2")
 | |
|     with pytest.raises(ClientError) as exc:
 | |
|         client.describe_elasticsearch_domain(DomainName="moto.org")
 | |
|     meta = exc.value.response["ResponseMetadata"]
 | |
|     meta["HTTPStatusCode"].should.equal(400)
 | |
|     err = exc.value.response["Error"]
 | |
|     err["Message"].should.equal(
 | |
|         "1 validation error detected: Value 'moto.org' at 'domainName' failed to satisfy constraint: Member must satisfy regular expression pattern: [a-z][a-z0-9\\-]+"
 | |
|     )
 | |
|     err["Code"].should.equal("ValidationException")
 | |
| 
 | |
| 
 | |
| @mock_es
 | |
| def test_describe_unknown_domain():
 | |
|     client = boto3.client("es", region_name="ap-southeast-1")
 | |
|     with pytest.raises(ClientError) as exc:
 | |
|         client.describe_elasticsearch_domain(DomainName="unknown")
 | |
| 
 | |
|     meta = exc.value.response["ResponseMetadata"]
 | |
|     meta["HTTPStatusCode"].should.equal(409)
 | |
| 
 | |
|     err = exc.value.response["Error"]
 | |
|     err["Code"].should.equal("ResourceNotFoundException")
 | |
|     err["Message"].should.equal("Domain not found: unknown")
 | |
| 
 | |
| 
 | |
| @mock_es
 | |
| def test_describe_elasticsearch_domain():
 | |
|     client = boto3.client("es", region_name="ap-southeast-1")
 | |
|     client.create_elasticsearch_domain(DomainName="motosearch")
 | |
|     resp = client.describe_elasticsearch_domain(DomainName="motosearch")
 | |
| 
 | |
|     resp.should.have.key("DomainStatus")
 | |
|     domain = resp["DomainStatus"]
 | |
|     domain.should.have.key("DomainName").equals("motosearch")
 | |
|     domain.should.have.key("DomainId")
 | |
|     domain.should.have.key("ARN").equals(
 | |
|         f"arn:aws:es:ap-southeast-1:domain/{domain['DomainId']}"
 | |
|     )
 | |
|     domain.should.have.key("Created").equals(True)
 | |
|     domain.should.have.key("Deleted").equals(False)
 | |
|     domain.should.have.key("Processing").equals(False)
 | |
|     domain.should.have.key("UpgradeProcessing").equals(False)
 | |
|     domain.shouldnt.have.key("ElasticsearchVersion")
 | |
| 
 | |
| 
 | |
| @mock_es
 | |
| def test_list_domain_names_initial():
 | |
|     client = boto3.client("es", region_name="eu-west-1")
 | |
|     resp = client.list_domain_names()
 | |
| 
 | |
|     resp.should.have.key("DomainNames").equals([])
 | |
| 
 | |
| 
 | |
| @mock_es
 | |
| def test_list_domain_names_with_multiple_domains():
 | |
|     client = boto3.client("es", region_name="eu-west-1")
 | |
|     domain_names = [f"env{i}" for i in range(1, 5)]
 | |
|     for name in domain_names:
 | |
|         client.create_elasticsearch_domain(DomainName=name)
 | |
|     resp = client.list_domain_names()
 | |
| 
 | |
|     resp.should.have.key("DomainNames").length_of(4)
 | |
|     for name in domain_names:
 | |
|         resp["DomainNames"].should.contain({"DomainName": name})
 |