245 lines
		
	
	
		
			8.0 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			245 lines
		
	
	
		
			8.0 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| from botocore.exceptions import ClientError
 | |
| import boto3
 | |
| import sure  # noqa # pylint: disable=unused-import
 | |
| import json
 | |
| 
 | |
| from moto.core import ACCOUNT_ID
 | |
| from moto.ec2 import utils as ec2_utils
 | |
| 
 | |
| from moto import mock_ecs, mock_ec2
 | |
| import pytest
 | |
| from tests import EXAMPLE_AMI_ID
 | |
| 
 | |
| 
 | |
| @mock_ecs
 | |
| def test_list_account_settings_initial():
 | |
|     client = boto3.client("ecs", region_name="eu-west-1")
 | |
| 
 | |
|     resp = client.list_account_settings()
 | |
|     resp.should.have.key("settings").equal([])
 | |
| 
 | |
| 
 | |
| @mock_ecs
 | |
| @pytest.mark.parametrize(
 | |
|     "name",
 | |
|     ["containerInstanceLongArnFormat", "serviceLongArnFormat", "taskLongArnFormat"],
 | |
| )
 | |
| @pytest.mark.parametrize("value", ["enabled", "disabled"])
 | |
| def test_put_account_setting(name, value):
 | |
|     client = boto3.client("ecs", region_name="eu-west-1")
 | |
| 
 | |
|     resp = client.put_account_setting(name=name, value=value)
 | |
|     resp.should.have.key("setting")
 | |
|     resp["setting"].should.equal({"name": name, "value": value})
 | |
| 
 | |
| 
 | |
| @mock_ecs
 | |
| def test_list_account_setting():
 | |
|     client = boto3.client("ecs", region_name="eu-west-1")
 | |
| 
 | |
|     client.put_account_setting(name="containerInstanceLongArnFormat", value="enabled")
 | |
|     client.put_account_setting(name="serviceLongArnFormat", value="disabled")
 | |
|     client.put_account_setting(name="taskLongArnFormat", value="enabled")
 | |
| 
 | |
|     resp = client.list_account_settings()
 | |
|     resp.should.have.key("settings").length_of(3)
 | |
|     resp["settings"].should.contain(
 | |
|         {"name": "containerInstanceLongArnFormat", "value": "enabled"}
 | |
|     )
 | |
|     resp["settings"].should.contain(
 | |
|         {"name": "serviceLongArnFormat", "value": "disabled"}
 | |
|     )
 | |
|     resp["settings"].should.contain({"name": "taskLongArnFormat", "value": "enabled"})
 | |
| 
 | |
|     resp = client.list_account_settings(name="serviceLongArnFormat")
 | |
|     resp.should.have.key("settings").length_of(1)
 | |
|     resp["settings"].should.contain(
 | |
|         {"name": "serviceLongArnFormat", "value": "disabled"}
 | |
|     )
 | |
| 
 | |
|     resp = client.list_account_settings(value="enabled")
 | |
|     resp.should.have.key("settings").length_of(2)
 | |
|     resp["settings"].should.contain(
 | |
|         {"name": "containerInstanceLongArnFormat", "value": "enabled"}
 | |
|     )
 | |
|     resp["settings"].should.contain({"name": "taskLongArnFormat", "value": "enabled"})
 | |
| 
 | |
| 
 | |
| @mock_ecs
 | |
| def test_list_account_settings_wrong_name():
 | |
|     client = boto3.client("ecs", region_name="eu-west-1")
 | |
| 
 | |
|     with pytest.raises(ClientError) as exc:
 | |
|         client.list_account_settings(name="unknown")
 | |
|     err = exc.value.response["Error"]
 | |
|     err["Code"].should.equal("InvalidParameterException")
 | |
|     err["Message"].should.equal(
 | |
|         "unknown should be one of [serviceLongArnFormat,taskLongArnFormat,containerInstanceLongArnFormat,containerLongArnFormat,awsvpcTrunking,containerInsights,dualStackIPv6]"
 | |
|     )
 | |
| 
 | |
| 
 | |
| @mock_ecs
 | |
| def test_delete_account_setting():
 | |
|     client = boto3.client("ecs", region_name="eu-west-1")
 | |
| 
 | |
|     client.put_account_setting(name="containerInstanceLongArnFormat", value="enabled")
 | |
|     client.put_account_setting(name="serviceLongArnFormat", value="enabled")
 | |
|     client.put_account_setting(name="taskLongArnFormat", value="enabled")
 | |
| 
 | |
|     resp = client.list_account_settings()
 | |
|     resp.should.have.key("settings").length_of(3)
 | |
| 
 | |
|     client.delete_account_setting(name="serviceLongArnFormat")
 | |
| 
 | |
|     resp = client.list_account_settings()
 | |
|     resp.should.have.key("settings").length_of(2)
 | |
|     resp["settings"].should.contain(
 | |
|         {"name": "containerInstanceLongArnFormat", "value": "enabled"}
 | |
|     )
 | |
|     resp["settings"].should.contain({"name": "taskLongArnFormat", "value": "enabled"})
 | |
| 
 | |
| 
 | |
| @mock_ec2
 | |
| @mock_ecs
 | |
| def test_put_account_setting_changes_service_arn():
 | |
|     client = boto3.client("ecs", region_name="eu-west-1")
 | |
|     client.put_account_setting(name="serviceLongArnFormat", value="disabled")
 | |
| 
 | |
|     _ = client.create_cluster(clusterName="dummy-cluster")
 | |
|     _ = client.register_task_definition(
 | |
|         family="test_ecs_task",
 | |
|         containerDefinitions=[
 | |
|             {
 | |
|                 "name": "hello_world",
 | |
|                 "image": "docker/hello-world:latest",
 | |
|                 "cpu": 1024,
 | |
|                 "memory": 400,
 | |
|             }
 | |
|         ],
 | |
|     )
 | |
|     client.create_service(
 | |
|         cluster="dummy-cluster",
 | |
|         serviceName="test-ecs-service",
 | |
|         taskDefinition="test_ecs_task",
 | |
|         desiredCount=2,
 | |
|         launchType="FARGATE",
 | |
|         tags=[{"key": "ResourceOwner", "value": "Dummy"}],
 | |
|     )
 | |
| 
 | |
|     # Initial response is short (setting serviceLongArnFormat=disabled)
 | |
|     response = client.list_services(cluster="dummy-cluster", launchType="FARGATE")
 | |
|     service_arn = response["serviceArns"][0]
 | |
|     service_arn.should.equal(
 | |
|         "arn:aws:ecs:eu-west-1:{}:service/test-ecs-service".format(ACCOUNT_ID)
 | |
|     )
 | |
| 
 | |
|     # Second invocation returns long ARN's by default, after deleting the preference
 | |
|     client.delete_account_setting(name="serviceLongArnFormat")
 | |
|     response = client.list_services(cluster="dummy-cluster", launchType="FARGATE")
 | |
|     service_arn = response["serviceArns"][0]
 | |
|     service_arn.should.equal(
 | |
|         "arn:aws:ecs:eu-west-1:{}:service/dummy-cluster/test-ecs-service".format(
 | |
|             ACCOUNT_ID
 | |
|         )
 | |
|     )
 | |
| 
 | |
| 
 | |
| @mock_ec2
 | |
| @mock_ecs
 | |
| def test_put_account_setting_changes_containerinstance_arn():
 | |
|     ecs_client = boto3.client("ecs", region_name="us-east-1")
 | |
|     ec2 = boto3.resource("ec2", region_name="us-east-1")
 | |
| 
 | |
|     test_cluster_name = "test_ecs_cluster"
 | |
| 
 | |
|     ecs_client.create_cluster(clusterName=test_cluster_name)
 | |
| 
 | |
|     test_instance = ec2.create_instances(
 | |
|         ImageId=EXAMPLE_AMI_ID, MinCount=1, MaxCount=1
 | |
|     )[0]
 | |
| 
 | |
|     instance_id_document = json.dumps(
 | |
|         ec2_utils.generate_instance_identity_document(test_instance)
 | |
|     )
 | |
| 
 | |
|     # Initial ARN should be long
 | |
|     response = ecs_client.register_container_instance(
 | |
|         cluster=test_cluster_name, instanceIdentityDocument=instance_id_document
 | |
|     )
 | |
|     full_arn = response["containerInstance"]["containerInstanceArn"]
 | |
|     full_arn.should.match(
 | |
|         f"arn:aws:ecs:us-east-1:{ACCOUNT_ID}:container-instance/{test_cluster_name}/[a-z0-9-]+$"
 | |
|     )
 | |
| 
 | |
|     # Now disable long-format
 | |
|     ecs_client.put_account_setting(
 | |
|         name="containerInstanceLongArnFormat", value="disabled"
 | |
|     )
 | |
|     response = ecs_client.register_container_instance(
 | |
|         cluster=test_cluster_name, instanceIdentityDocument=instance_id_document
 | |
|     )
 | |
|     full_arn = response["containerInstance"]["containerInstanceArn"]
 | |
|     full_arn.should.match(
 | |
|         f"arn:aws:ecs:us-east-1:{ACCOUNT_ID}:container-instance/[a-z0-9-]+$"
 | |
|     )
 | |
| 
 | |
| 
 | |
| @mock_ec2
 | |
| @mock_ecs
 | |
| def test_run_task_default_cluster_new_arn_format():
 | |
|     client = boto3.client("ecs", region_name="us-east-1")
 | |
|     ec2 = boto3.resource("ec2", region_name="us-east-1")
 | |
| 
 | |
|     test_cluster_name = "default"
 | |
| 
 | |
|     client.create_cluster(clusterName=test_cluster_name)
 | |
| 
 | |
|     test_instance = ec2.create_instances(
 | |
|         ImageId=EXAMPLE_AMI_ID, MinCount=1, MaxCount=1
 | |
|     )[0]
 | |
| 
 | |
|     instance_id_document = json.dumps(
 | |
|         ec2_utils.generate_instance_identity_document(test_instance)
 | |
|     )
 | |
| 
 | |
|     client.register_container_instance(
 | |
|         cluster=test_cluster_name, instanceIdentityDocument=instance_id_document
 | |
|     )
 | |
| 
 | |
|     client.register_task_definition(
 | |
|         family="test_ecs_task",
 | |
|         containerDefinitions=[
 | |
|             {
 | |
|                 "name": "hello_world",
 | |
|                 "image": "docker/hello-world:latest",
 | |
|                 "cpu": 1024,
 | |
|                 "memory": 400,
 | |
|             }
 | |
|         ],
 | |
|     )
 | |
|     # Initial ARN is long-format
 | |
|     client.put_account_setting(name="taskLongArnFormat", value="enabled")
 | |
|     response = client.run_task(
 | |
|         launchType="FARGATE",
 | |
|         overrides={},
 | |
|         taskDefinition="test_ecs_task",
 | |
|         count=1,
 | |
|         startedBy="moto",
 | |
|     )
 | |
|     response["tasks"][0]["taskArn"].should.match(
 | |
|         f"arn:aws:ecs:us-east-1:{ACCOUNT_ID}:task/{test_cluster_name}/[a-z0-9-]+$"
 | |
|     )
 | |
| 
 | |
|     # Enable short-format for the next task
 | |
|     client.put_account_setting(name="taskLongArnFormat", value="disabled")
 | |
|     response = client.run_task(
 | |
|         launchType="FARGATE",
 | |
|         overrides={},
 | |
|         taskDefinition="test_ecs_task",
 | |
|         count=1,
 | |
|         startedBy="moto",
 | |
|     )
 | |
|     response["tasks"][0]["taskArn"].should.match(
 | |
|         f"arn:aws:ecs:us-east-1:{ACCOUNT_ID}:task/[a-z0-9-]+$"
 | |
|     )
 |