Implementation: ECS Task Sets (#3152)
* initial implementation of taskSets. Fixed a bug with ECS Service where task_definition was a required parameter. * Added update_task_set and tests. DRYed up ClusterNotFoundException. General cleanup. * Added support for filtering tags on include parameter to describe_task_sets. Added additional tests. * Fix copy/pasta in ClusterNotFoundException * styling updates * Added TODO for delete_task_set force parameter * Updated multiple function and constructor calls to use named variables. Updated tests to reference variables instead of hardcoded strings. * Run black for formatting * Updated create_service function call to use named variables
This commit is contained in:
parent
fdeee07762
commit
1e5b8acac6
5 changed files with 683 additions and 34 deletions
|
|
@ -2637,3 +2637,332 @@ def test_ecs_task_definition_placement_constraints():
|
|||
response["taskDefinition"]["placementConstraints"].should.equal(
|
||||
[{"type": "memberOf", "expression": "attribute:ecs.instance-type =~ t2.*"}]
|
||||
)
|
||||
|
||||
|
||||
@mock_ecs
|
||||
def test_create_task_set():
|
||||
cluster_name = "test_ecs_cluster"
|
||||
service_name = "test_ecs_service"
|
||||
task_def_name = "test_ecs_task"
|
||||
|
||||
client = boto3.client("ecs", region_name="us-east-1")
|
||||
_ = client.create_cluster(clusterName=cluster_name)
|
||||
_ = client.register_task_definition(
|
||||
family="test_ecs_task",
|
||||
containerDefinitions=[
|
||||
{
|
||||
"name": "hello_world",
|
||||
"image": "docker/hello-world:latest",
|
||||
"cpu": 1024,
|
||||
"memory": 400,
|
||||
"essential": True,
|
||||
"environment": [
|
||||
{"name": "AWS_ACCESS_KEY_ID", "value": "SOME_ACCESS_KEY"}
|
||||
],
|
||||
"logConfiguration": {"logDriver": "json-file"},
|
||||
}
|
||||
],
|
||||
)
|
||||
_ = client.create_service(
|
||||
cluster=cluster_name,
|
||||
serviceName=service_name,
|
||||
taskDefinition=task_def_name,
|
||||
desiredCount=2,
|
||||
deploymentController={"type": "EXTERNAL"},
|
||||
)
|
||||
load_balancers = [
|
||||
{
|
||||
"targetGroupArn": "arn:aws:elasticloadbalancing:us-east-1:01234567890:targetgroup/c26b93c1bc35466ba792d5b08fe6a5bc/ec39113f8831453a",
|
||||
"containerName": "hello_world",
|
||||
"containerPort": 8080,
|
||||
},
|
||||
]
|
||||
|
||||
task_set = client.create_task_set(
|
||||
cluster=cluster_name,
|
||||
service=service_name,
|
||||
taskDefinition=task_def_name,
|
||||
loadBalancers=load_balancers,
|
||||
)["taskSet"]
|
||||
|
||||
cluster_arn = client.describe_clusters(clusters=[cluster_name])["clusters"][0][
|
||||
"clusterArn"
|
||||
]
|
||||
service_arn = client.describe_services(
|
||||
cluster=cluster_name, services=[service_name]
|
||||
)["services"][0]["serviceArn"]
|
||||
assert task_set["clusterArn"] == cluster_arn
|
||||
assert task_set["serviceArn"] == service_arn
|
||||
assert task_set["taskDefinition"].endswith("{0}:1".format(task_def_name))
|
||||
assert task_set["scale"] == {"value": 100.0, "unit": "PERCENT"}
|
||||
assert (
|
||||
task_set["loadBalancers"][0]["targetGroupArn"]
|
||||
== "arn:aws:elasticloadbalancing:us-east-1:01234567890:targetgroup/c26b93c1bc35466ba792d5b08fe6a5bc/ec39113f8831453a"
|
||||
)
|
||||
assert task_set["loadBalancers"][0]["containerPort"] == 8080
|
||||
assert task_set["loadBalancers"][0]["containerName"] == "hello_world"
|
||||
|
||||
|
||||
@mock_ecs
|
||||
def test_describe_task_sets():
|
||||
cluster_name = "test_ecs_cluster"
|
||||
service_name = "test_ecs_service"
|
||||
task_def_name = "test_ecs_task"
|
||||
|
||||
client = boto3.client("ecs", region_name="us-east-1")
|
||||
_ = client.create_cluster(clusterName=cluster_name)
|
||||
_ = client.register_task_definition(
|
||||
family=task_def_name,
|
||||
containerDefinitions=[
|
||||
{
|
||||
"name": "hello_world",
|
||||
"image": "docker/hello-world:latest",
|
||||
"cpu": 1024,
|
||||
"memory": 400,
|
||||
"essential": True,
|
||||
"environment": [
|
||||
{"name": "AWS_ACCESS_KEY_ID", "value": "SOME_ACCESS_KEY"}
|
||||
],
|
||||
"logConfiguration": {"logDriver": "json-file"},
|
||||
}
|
||||
],
|
||||
)
|
||||
_ = client.create_service(
|
||||
cluster=cluster_name,
|
||||
serviceName=service_name,
|
||||
taskDefinition=task_def_name,
|
||||
desiredCount=2,
|
||||
deploymentController={"type": "EXTERNAL"},
|
||||
)
|
||||
|
||||
load_balancers = [
|
||||
{
|
||||
"targetGroupArn": "arn:aws:elasticloadbalancing:us-east-1:01234567890:targetgroup/c26b93c1bc35466ba792d5b08fe6a5bc/ec39113f8831453a",
|
||||
"containerName": "hello_world",
|
||||
"containerPort": 8080,
|
||||
}
|
||||
]
|
||||
|
||||
_ = client.create_task_set(
|
||||
cluster=cluster_name,
|
||||
service=service_name,
|
||||
taskDefinition=task_def_name,
|
||||
loadBalancers=load_balancers,
|
||||
)
|
||||
task_sets = client.describe_task_sets(cluster=cluster_name, service=service_name)[
|
||||
"taskSets"
|
||||
]
|
||||
assert "tags" not in task_sets[0]
|
||||
|
||||
task_sets = client.describe_task_sets(
|
||||
cluster=cluster_name, service=service_name, include=["TAGS"],
|
||||
)["taskSets"]
|
||||
|
||||
cluster_arn = client.describe_clusters(clusters=[cluster_name])["clusters"][0][
|
||||
"clusterArn"
|
||||
]
|
||||
|
||||
service_arn = client.describe_services(
|
||||
cluster=cluster_name, services=[service_name]
|
||||
)["services"][0]["serviceArn"]
|
||||
|
||||
assert "tags" in task_sets[0]
|
||||
assert len(task_sets) == 1
|
||||
assert task_sets[0]["taskDefinition"].endswith("{0}:1".format(task_def_name))
|
||||
assert task_sets[0]["clusterArn"] == cluster_arn
|
||||
assert task_sets[0]["serviceArn"] == service_arn
|
||||
assert task_sets[0]["serviceArn"].endswith(service_name)
|
||||
assert task_sets[0]["scale"] == {"value": 100.0, "unit": "PERCENT"}
|
||||
assert task_sets[0]["taskSetArn"].endswith(task_sets[0]["id"])
|
||||
assert (
|
||||
task_sets[0]["loadBalancers"][0]["targetGroupArn"]
|
||||
== "arn:aws:elasticloadbalancing:us-east-1:01234567890:targetgroup/c26b93c1bc35466ba792d5b08fe6a5bc/ec39113f8831453a"
|
||||
)
|
||||
assert task_sets[0]["loadBalancers"][0]["containerPort"] == 8080
|
||||
assert task_sets[0]["loadBalancers"][0]["containerName"] == "hello_world"
|
||||
|
||||
|
||||
@mock_ecs
|
||||
def test_delete_task_set():
|
||||
cluster_name = "test_ecs_cluster"
|
||||
service_name = "test_ecs_service"
|
||||
task_def_name = "test_ecs_task"
|
||||
|
||||
client = boto3.client("ecs", region_name="us-east-1")
|
||||
_ = client.create_cluster(clusterName=cluster_name)
|
||||
_ = client.register_task_definition(
|
||||
family=task_def_name,
|
||||
containerDefinitions=[
|
||||
{
|
||||
"name": "hello_world",
|
||||
"image": "docker/hello-world:latest",
|
||||
"cpu": 1024,
|
||||
"memory": 400,
|
||||
"essential": True,
|
||||
"environment": [
|
||||
{"name": "AWS_ACCESS_KEY_ID", "value": "SOME_ACCESS_KEY"}
|
||||
],
|
||||
"logConfiguration": {"logDriver": "json-file"},
|
||||
}
|
||||
],
|
||||
)
|
||||
_ = client.create_service(
|
||||
cluster=cluster_name,
|
||||
serviceName=service_name,
|
||||
taskDefinition=task_def_name,
|
||||
desiredCount=2,
|
||||
deploymentController={"type": "EXTERNAL"},
|
||||
)
|
||||
|
||||
task_set = client.create_task_set(
|
||||
cluster=cluster_name, service=service_name, taskDefinition=task_def_name,
|
||||
)["taskSet"]
|
||||
|
||||
task_sets = client.describe_task_sets(
|
||||
cluster=cluster_name, service=service_name, taskSets=[task_set["taskSetArn"]],
|
||||
)["taskSets"]
|
||||
|
||||
assert len(task_sets) == 1
|
||||
|
||||
response = client.delete_task_set(
|
||||
cluster=cluster_name, service=service_name, taskSet=task_set["taskSetArn"],
|
||||
)
|
||||
assert response["taskSet"]["taskSetArn"] == task_set["taskSetArn"]
|
||||
|
||||
task_sets = client.describe_task_sets(
|
||||
cluster=cluster_name, service=service_name, taskSets=[task_set["taskSetArn"]],
|
||||
)["taskSets"]
|
||||
|
||||
assert len(task_sets) == 0
|
||||
|
||||
with assert_raises(ClientError):
|
||||
_ = client.delete_task_set(
|
||||
cluster=cluster_name, service=service_name, taskSet=task_set["taskSetArn"],
|
||||
)
|
||||
|
||||
|
||||
@mock_ecs
|
||||
def test_update_service_primary_task_set():
|
||||
cluster_name = "test_ecs_cluster"
|
||||
service_name = "test_ecs_service"
|
||||
task_def_name = "test_ecs_task"
|
||||
|
||||
client = boto3.client("ecs", region_name="us-east-1")
|
||||
_ = client.create_cluster(clusterName=cluster_name)
|
||||
_ = client.register_task_definition(
|
||||
family="test_ecs_task",
|
||||
containerDefinitions=[
|
||||
{
|
||||
"name": "hello_world",
|
||||
"image": "docker/hello-world:latest",
|
||||
"cpu": 1024,
|
||||
"memory": 400,
|
||||
"essential": True,
|
||||
"environment": [
|
||||
{"name": "AWS_ACCESS_KEY_ID", "value": "SOME_ACCESS_KEY"}
|
||||
],
|
||||
"logConfiguration": {"logDriver": "json-file"},
|
||||
}
|
||||
],
|
||||
)
|
||||
_ = client.create_service(
|
||||
cluster=cluster_name,
|
||||
serviceName=service_name,
|
||||
desiredCount=2,
|
||||
deploymentController={"type": "EXTERNAL"},
|
||||
)
|
||||
|
||||
task_set = client.create_task_set(
|
||||
cluster=cluster_name, service=service_name, taskDefinition=task_def_name,
|
||||
)["taskSet"]
|
||||
|
||||
service = client.describe_services(cluster=cluster_name, services=[service_name],)[
|
||||
"services"
|
||||
][0]
|
||||
|
||||
_ = client.update_service_primary_task_set(
|
||||
cluster=cluster_name,
|
||||
service=service_name,
|
||||
primaryTaskSet=task_set["taskSetArn"],
|
||||
)
|
||||
|
||||
service = client.describe_services(cluster=cluster_name, services=[service_name],)[
|
||||
"services"
|
||||
][0]
|
||||
assert service["taskSets"][0]["status"] == "PRIMARY"
|
||||
assert service["taskDefinition"] == service["taskSets"][0]["taskDefinition"]
|
||||
|
||||
another_task_set = client.create_task_set(
|
||||
cluster=cluster_name, service=service_name, taskDefinition=task_def_name,
|
||||
)["taskSet"]
|
||||
service = client.describe_services(cluster=cluster_name, services=[service_name],)[
|
||||
"services"
|
||||
][0]
|
||||
assert service["taskSets"][1]["status"] == "ACTIVE"
|
||||
|
||||
_ = client.update_service_primary_task_set(
|
||||
cluster=cluster_name,
|
||||
service=service_name,
|
||||
primaryTaskSet=another_task_set["taskSetArn"],
|
||||
)
|
||||
service = client.describe_services(cluster=cluster_name, services=[service_name],)[
|
||||
"services"
|
||||
][0]
|
||||
assert service["taskSets"][0]["status"] == "ACTIVE"
|
||||
assert service["taskSets"][1]["status"] == "PRIMARY"
|
||||
assert service["taskDefinition"] == service["taskSets"][1]["taskDefinition"]
|
||||
|
||||
|
||||
@mock_ecs
|
||||
def test_update_task_set():
|
||||
cluster_name = "test_ecs_cluster"
|
||||
service_name = "test_ecs_service"
|
||||
task_def_name = "test_ecs_task"
|
||||
|
||||
client = boto3.client("ecs", region_name="us-east-1")
|
||||
_ = client.create_cluster(clusterName=cluster_name)
|
||||
_ = client.register_task_definition(
|
||||
family=task_def_name,
|
||||
containerDefinitions=[
|
||||
{
|
||||
"name": "hello_world",
|
||||
"image": "docker/hello-world:latest",
|
||||
"cpu": 1024,
|
||||
"memory": 400,
|
||||
"essential": True,
|
||||
"environment": [
|
||||
{"name": "AWS_ACCESS_KEY_ID", "value": "SOME_ACCESS_KEY"}
|
||||
],
|
||||
"logConfiguration": {"logDriver": "json-file"},
|
||||
}
|
||||
],
|
||||
)
|
||||
_ = client.create_service(
|
||||
cluster=cluster_name,
|
||||
serviceName=service_name,
|
||||
desiredCount=2,
|
||||
deploymentController={"type": "EXTERNAL"},
|
||||
)
|
||||
|
||||
task_set = client.create_task_set(
|
||||
cluster=cluster_name, service=service_name, taskDefinition=task_def_name,
|
||||
)["taskSet"]
|
||||
|
||||
another_task_set = client.create_task_set(
|
||||
cluster=cluster_name, service=service_name, taskDefinition=task_def_name,
|
||||
)["taskSet"]
|
||||
assert another_task_set["scale"]["unit"] == "PERCENT"
|
||||
assert another_task_set["scale"]["value"] == 100.0
|
||||
|
||||
client.update_task_set(
|
||||
cluster=cluster_name,
|
||||
service=service_name,
|
||||
taskSet=task_set["taskSetArn"],
|
||||
scale={"value": 25.0, "unit": "PERCENT"},
|
||||
)
|
||||
|
||||
updated_task_set = client.describe_task_sets(
|
||||
cluster=cluster_name, service=service_name, taskSets=[task_set["taskSetArn"]],
|
||||
)["taskSets"][0]
|
||||
assert updated_task_set["scale"]["value"] == 25.0
|
||||
assert updated_task_set["scale"]["unit"] == "PERCENT"
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue