234 lines
		
	
	
		
			8.6 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
		
		
			
		
	
	
			234 lines
		
	
	
		
			8.6 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| 
								 | 
							
								"""Unit tests for servicediscovery-supported APIs."""
							 | 
						||
| 
								 | 
							
								import boto3
							 | 
						||
| 
								 | 
							
								import pytest
							 | 
						||
| 
								 | 
							
								import sure  # noqa # pylint: disable=unused-import
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								from botocore.exceptions import ClientError
							 | 
						||
| 
								 | 
							
								from moto import mock_servicediscovery
							 | 
						||
| 
								 | 
							
								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_servicediscovery
							 | 
						||
| 
								 | 
							
								def test_create_http_namespace():
							 | 
						||
| 
								 | 
							
								    client = boto3.client("servicediscovery", region_name="eu-west-1")
							 | 
						||
| 
								 | 
							
								    client.create_http_namespace(Name="mynamespace")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    resp = client.list_namespaces()
							 | 
						||
| 
								 | 
							
								    resp.should.have.key("Namespaces").length_of(1)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    namespace = resp["Namespaces"][0]
							 | 
						||
| 
								 | 
							
								    namespace.should.have.key("Id").match("ns-[a-z0-9]{16}")
							 | 
						||
| 
								 | 
							
								    namespace.should.have.key("Arn").match(
							 | 
						||
| 
								 | 
							
								        f"arn:aws:servicediscovery:eu-west-1:{ACCOUNT_ID}:namespace/{namespace['Id']}"
							 | 
						||
| 
								 | 
							
								    )
							 | 
						||
| 
								 | 
							
								    namespace.should.have.key("Name").equals("mynamespace")
							 | 
						||
| 
								 | 
							
								    namespace.should.have.key("Type").equals("HTTP")
							 | 
						||
| 
								 | 
							
								    namespace.should.have.key("CreateDate")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    namespace.should.have.key("Properties")
							 | 
						||
| 
								 | 
							
								    props = namespace["Properties"]
							 | 
						||
| 
								 | 
							
								    props.should.have.key("DnsProperties").equals({"SOA": {}})
							 | 
						||
| 
								 | 
							
								    props.should.have.key("HttpProperties").equals({"HttpName": "mynamespace"})
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@mock_servicediscovery
							 | 
						||
| 
								 | 
							
								def test_get_http_namespace_minimal():
							 | 
						||
| 
								 | 
							
								    client = boto3.client("servicediscovery", region_name="eu-west-1")
							 | 
						||
| 
								 | 
							
								    client.create_http_namespace(Name="mynamespace")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    ns_id = client.list_namespaces()["Namespaces"][0]["Id"]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    resp = client.get_namespace(Id=ns_id)
							 | 
						||
| 
								 | 
							
								    resp.should.have.key("Namespace")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    namespace = resp["Namespace"]
							 | 
						||
| 
								 | 
							
								    namespace.should.have.key("Id").match(ns_id)
							 | 
						||
| 
								 | 
							
								    namespace.should.have.key("Arn").match(
							 | 
						||
| 
								 | 
							
								        f"arn:aws:servicediscovery:eu-west-1:{ACCOUNT_ID}:namespace/{namespace['Id']}"
							 | 
						||
| 
								 | 
							
								    )
							 | 
						||
| 
								 | 
							
								    namespace.should.have.key("Name").equals("mynamespace")
							 | 
						||
| 
								 | 
							
								    namespace.should.have.key("Type").equals("HTTP")
							 | 
						||
| 
								 | 
							
								    namespace.should.have.key("CreateDate")
							 | 
						||
| 
								 | 
							
								    namespace.should.have.key("CreatorRequestId")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    namespace.should.have.key("Properties")
							 | 
						||
| 
								 | 
							
								    props = namespace["Properties"]
							 | 
						||
| 
								 | 
							
								    props.should.have.key("DnsProperties").equals({"SOA": {}})
							 | 
						||
| 
								 | 
							
								    props.should.have.key("HttpProperties").equals({"HttpName": "mynamespace"})
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    namespace.shouldnt.have.key("Description")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@mock_servicediscovery
							 | 
						||
| 
								 | 
							
								def test_get_http_namespace():
							 | 
						||
| 
								 | 
							
								    client = boto3.client("servicediscovery", region_name="eu-west-1")
							 | 
						||
| 
								 | 
							
								    client.create_http_namespace(
							 | 
						||
| 
								 | 
							
								        Name="mynamespace", CreatorRequestId="crid", Description="mu fancy namespace"
							 | 
						||
| 
								 | 
							
								    )
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    ns_id = client.list_namespaces()["Namespaces"][0]["Id"]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    resp = client.get_namespace(Id=ns_id)
							 | 
						||
| 
								 | 
							
								    resp.should.have.key("Namespace")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    namespace = resp["Namespace"]
							 | 
						||
| 
								 | 
							
								    namespace.should.have.key("Id").match(ns_id)
							 | 
						||
| 
								 | 
							
								    namespace.should.have.key("Arn").match(
							 | 
						||
| 
								 | 
							
								        f"arn:aws:servicediscovery:eu-west-1:{ACCOUNT_ID}:namespace/{namespace['Id']}"
							 | 
						||
| 
								 | 
							
								    )
							 | 
						||
| 
								 | 
							
								    namespace.should.have.key("Name").equals("mynamespace")
							 | 
						||
| 
								 | 
							
								    namespace.should.have.key("Type").equals("HTTP")
							 | 
						||
| 
								 | 
							
								    namespace.should.have.key("CreateDate")
							 | 
						||
| 
								 | 
							
								    namespace.should.have.key("CreatorRequestId").equals("crid")
							 | 
						||
| 
								 | 
							
								    namespace.should.have.key("Description").equals("mu fancy namespace")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    namespace.should.have.key("Properties")
							 | 
						||
| 
								 | 
							
								    props = namespace["Properties"]
							 | 
						||
| 
								 | 
							
								    props.should.have.key("DnsProperties").equals({"SOA": {}})
							 | 
						||
| 
								 | 
							
								    props.should.have.key("HttpProperties").equals({"HttpName": "mynamespace"})
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@mock_servicediscovery
							 | 
						||
| 
								 | 
							
								def test_delete_namespace():
							 | 
						||
| 
								 | 
							
								    client = boto3.client("servicediscovery", region_name="eu-west-1")
							 | 
						||
| 
								 | 
							
								    client.create_http_namespace(Name="mynamespace")
							 | 
						||
| 
								 | 
							
								    ns_id = client.list_namespaces()["Namespaces"][0]["Id"]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    resp = client.delete_namespace(Id=ns_id)
							 | 
						||
| 
								 | 
							
								    resp.should.have.key("OperationId")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    # Calling delete again while this is in progress results in an error:
							 | 
						||
| 
								 | 
							
								    #    Another operation of type DeleteNamespace and id dlmpkcn33aovnztwdpsdplgtheuhgcap-k6x64euq is in progress
							 | 
						||
| 
								 | 
							
								    # list_operations is empty after successfull deletion - old operations from this namespace should be deleted
							 | 
						||
| 
								 | 
							
								    # list_namespaces is also empty (obvs)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    client.list_namespaces()["Namespaces"].should.equal([])
							 | 
						||
| 
								 | 
							
								    client.list_operations()["Operations"].should.equal([])
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@mock_servicediscovery
							 | 
						||
| 
								 | 
							
								def test_delete_unknown_namespace():
							 | 
						||
| 
								 | 
							
								    client = boto3.client("servicediscovery", region_name="eu-west-1")
							 | 
						||
| 
								 | 
							
								    with pytest.raises(ClientError) as exc:
							 | 
						||
| 
								 | 
							
								        client.delete_namespace(Id="unknown")
							 | 
						||
| 
								 | 
							
								    err = exc.value.response["Error"]
							 | 
						||
| 
								 | 
							
								    err["Code"].should.equal("NamespaceNotFound")
							 | 
						||
| 
								 | 
							
								    err["Message"].should.equal("unknown")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@mock_servicediscovery
							 | 
						||
| 
								 | 
							
								def test_get_unknown_namespace():
							 | 
						||
| 
								 | 
							
								    client = boto3.client("servicediscovery", region_name="eu-west-1")
							 | 
						||
| 
								 | 
							
								    with pytest.raises(ClientError) as exc:
							 | 
						||
| 
								 | 
							
								        client.get_namespace(Id="unknown")
							 | 
						||
| 
								 | 
							
								    err = exc.value.response["Error"]
							 | 
						||
| 
								 | 
							
								    err["Code"].should.equal("NamespaceNotFound")
							 | 
						||
| 
								 | 
							
								    err["Message"].should.equal("unknown")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@mock_servicediscovery
							 | 
						||
| 
								 | 
							
								def test_create_private_dns_namespace_minimal():
							 | 
						||
| 
								 | 
							
								    client = boto3.client("servicediscovery", region_name="eu-west-1")
							 | 
						||
| 
								 | 
							
								    client.create_private_dns_namespace(Name="dns_ns", Vpc="vpc_id")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    ns_id = client.list_namespaces()["Namespaces"][0]["Id"]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    resp = client.get_namespace(Id=ns_id)
							 | 
						||
| 
								 | 
							
								    resp.should.have.key("Namespace")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    namespace = resp["Namespace"]
							 | 
						||
| 
								 | 
							
								    namespace.should.have.key("Id").match(ns_id)
							 | 
						||
| 
								 | 
							
								    namespace.should.have.key("Name").equals("dns_ns")
							 | 
						||
| 
								 | 
							
								    namespace.should.have.key("Type").equals("DNS_PRIVATE")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    namespace.should.have.key("Properties")
							 | 
						||
| 
								 | 
							
								    props = namespace["Properties"]
							 | 
						||
| 
								 | 
							
								    props.should.have.key("DnsProperties")
							 | 
						||
| 
								 | 
							
								    props["DnsProperties"].should.have.key("HostedZoneId")
							 | 
						||
| 
								 | 
							
								    props["DnsProperties"].shouldnt.have.key("SOA")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@mock_servicediscovery
							 | 
						||
| 
								 | 
							
								def test_create_private_dns_namespace():
							 | 
						||
| 
								 | 
							
								    client = boto3.client("servicediscovery", region_name="eu-west-1")
							 | 
						||
| 
								 | 
							
								    client.create_private_dns_namespace(
							 | 
						||
| 
								 | 
							
								        Name="dns_ns",
							 | 
						||
| 
								 | 
							
								        Vpc="vpc_id",
							 | 
						||
| 
								 | 
							
								        Description="my private dns",
							 | 
						||
| 
								 | 
							
								        Properties={"DnsProperties": {"SOA": {"TTL": 123}}},
							 | 
						||
| 
								 | 
							
								    )
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    ns_id = client.list_namespaces()["Namespaces"][0]["Id"]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    resp = client.get_namespace(Id=ns_id)
							 | 
						||
| 
								 | 
							
								    resp.should.have.key("Namespace")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    namespace = resp["Namespace"]
							 | 
						||
| 
								 | 
							
								    namespace.should.have.key("Id").match(ns_id)
							 | 
						||
| 
								 | 
							
								    namespace.should.have.key("Name").equals("dns_ns")
							 | 
						||
| 
								 | 
							
								    namespace.should.have.key("Type").equals("DNS_PRIVATE")
							 | 
						||
| 
								 | 
							
								    namespace.should.have.key("Description").equals("my private dns")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    namespace.should.have.key("Properties")
							 | 
						||
| 
								 | 
							
								    props = namespace["Properties"]
							 | 
						||
| 
								 | 
							
								    props.should.have.key("DnsProperties")
							 | 
						||
| 
								 | 
							
								    props["DnsProperties"].should.have.key("HostedZoneId")
							 | 
						||
| 
								 | 
							
								    props["DnsProperties"].should.have.key("SOA").equals({"TTL": 123})
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@mock_servicediscovery
							 | 
						||
| 
								 | 
							
								def test_create_private_dns_namespace_with_duplicate_vpc():
							 | 
						||
| 
								 | 
							
								    client = boto3.client("servicediscovery", region_name="eu-west-1")
							 | 
						||
| 
								 | 
							
								    client.create_private_dns_namespace(Name="dns_ns", Vpc="vpc_id")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    with pytest.raises(ClientError) as exc:
							 | 
						||
| 
								 | 
							
								        client.create_private_dns_namespace(Name="sth else", Vpc="vpc_id")
							 | 
						||
| 
								 | 
							
								    err = exc.value.response["Error"]
							 | 
						||
| 
								 | 
							
								    err["Code"].should.equal("ConflictingDomainExists")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@mock_servicediscovery
							 | 
						||
| 
								 | 
							
								def test_create_public_dns_namespace_minimal():
							 | 
						||
| 
								 | 
							
								    client = boto3.client("servicediscovery", region_name="us-east-2")
							 | 
						||
| 
								 | 
							
								    client.create_public_dns_namespace(Name="public_dns_ns")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    ns_id = client.list_namespaces()["Namespaces"][0]["Id"]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    resp = client.get_namespace(Id=ns_id)
							 | 
						||
| 
								 | 
							
								    resp.should.have.key("Namespace")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    namespace = resp["Namespace"]
							 | 
						||
| 
								 | 
							
								    namespace.should.have.key("Id").match(ns_id)
							 | 
						||
| 
								 | 
							
								    namespace.should.have.key("Name").equals("public_dns_ns")
							 | 
						||
| 
								 | 
							
								    namespace.should.have.key("Type").equals("DNS_PUBLIC")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@mock_servicediscovery
							 | 
						||
| 
								 | 
							
								def test_create_public_dns_namespace():
							 | 
						||
| 
								 | 
							
								    client = boto3.client("servicediscovery", region_name="us-east-2")
							 | 
						||
| 
								 | 
							
								    client.create_public_dns_namespace(
							 | 
						||
| 
								 | 
							
								        Name="public_dns_ns",
							 | 
						||
| 
								 | 
							
								        CreatorRequestId="cri",
							 | 
						||
| 
								 | 
							
								        Description="my public dns",
							 | 
						||
| 
								 | 
							
								        Properties={"DnsProperties": {"SOA": {"TTL": 124}}},
							 | 
						||
| 
								 | 
							
								    )
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    ns_id = client.list_namespaces()["Namespaces"][0]["Id"]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    resp = client.get_namespace(Id=ns_id)
							 | 
						||
| 
								 | 
							
								    resp.should.have.key("Namespace")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    namespace = resp["Namespace"]
							 | 
						||
| 
								 | 
							
								    namespace.should.have.key("Id").match(ns_id)
							 | 
						||
| 
								 | 
							
								    namespace.should.have.key("Name").equals("public_dns_ns")
							 | 
						||
| 
								 | 
							
								    namespace.should.have.key("Type").equals("DNS_PUBLIC")
							 | 
						||
| 
								 | 
							
								    namespace.should.have.key("Description").equals("my public dns")
							 | 
						||
| 
								 | 
							
								    namespace.should.have.key("CreatorRequestId").equals("cri")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    namespace.should.have.key("Properties").should.have.key("DnsProperties")
							 | 
						||
| 
								 | 
							
								    dns_props = namespace["Properties"]["DnsProperties"]
							 | 
						||
| 
								 | 
							
								    dns_props.should.equal({"HostedZoneId": "hzi", "SOA": {"TTL": 124}})
							 |