Add ECS Descriptors (#772)

* Add support for "DescribeServices" in ecs mock

* Add support for "DescribeTaskDefinition" in ecs

* Let ecs responses handle baseobject for services
This commit is contained in:
Robert Sheehy 2016-11-23 18:56:12 -06:00 committed by Steve Pulec
parent 05c6fc6738
commit 17584e9aa4
3 changed files with 152 additions and 0 deletions

View File

@ -217,6 +217,20 @@ class EC2ContainerServiceBackend(BaseBackend):
task_arns.extend([task_definition.arn for task_definition in task_definition_list]) task_arns.extend([task_definition.arn for task_definition in task_definition_list])
return task_arns return task_arns
def describe_task_definition(self, task_definition_str):
task_definition_name = task_definition_str.split('/')[-1]
if ':' in task_definition_name:
family, revision = task_definition_name.split(':')
revision = int(revision)
else:
family = task_definition_name
revision = len(self.task_definitions.get(family, []))
if family in self.task_definitions and 0 < revision <= len(self.task_definitions[family]):
return self.task_definitions[family][revision-1]
else:
raise Exception("{0} is not a task_definition".format(task_definition_name))
def deregister_task_definition(self, task_definition_str): def deregister_task_definition(self, task_definition_str):
task_definition_name = task_definition_str.split('/')[-1] task_definition_name = task_definition_str.split('/')[-1]
family, revision = task_definition_name.split(':') family, revision = task_definition_name.split(':')
@ -347,6 +361,15 @@ class EC2ContainerServiceBackend(BaseBackend):
service_arns.append(self.services[key].arn) service_arns.append(self.services[key].arn)
return sorted(service_arns) return sorted(service_arns)
def describe_services(self, cluster_str, service_names):
cluster_name = cluster_str.split('/')[-1]
services = []
for service_name in service_names:
cluster_service_pair = '{0}:{1}'.format(cluster_name, service_name)
if cluster_service_pair in self.services:
services.append(self.services[cluster_service_pair])
return services
def update_service(self, cluster_str, service_name, task_definition_str, desired_count): def update_service(self, cluster_str, service_name, task_definition_str, desired_count):
cluster_name = cluster_str.split('/')[-1] cluster_name = cluster_str.split('/')[-1]
cluster_service_pair = '{0}:{1}'.format(cluster_name, service_name) cluster_service_pair = '{0}:{1}'.format(cluster_name, service_name)

View File

@ -70,6 +70,13 @@ class EC2ContainerServiceResponse(BaseResponse):
#'nextToken': str(uuid.uuid1()) #'nextToken': str(uuid.uuid1())
}) })
def describe_task_definition(self):
task_definition_str = self._get_param('taskDefinition')
task_definition = self.ecs_backend.describe_task_definition(task_definition_str)
return json.dumps({
'taskDefinition': task_definition.response_object
})
def deregister_task_definition(self): def deregister_task_definition(self):
task_definition_str = self._get_param('taskDefinition') task_definition_str = self._get_param('taskDefinition')
task_definition = self.ecs_backend.deregister_task_definition(task_definition_str) task_definition = self.ecs_backend.deregister_task_definition(task_definition_str)
@ -152,6 +159,15 @@ class EC2ContainerServiceResponse(BaseResponse):
# 'nextToken': str(uuid.uuid1()) # 'nextToken': str(uuid.uuid1())
}) })
def describe_services(self):
cluster_str = self._get_param('cluster')
service_names = self._get_param('services')
services = self.ecs_backend.describe_services(cluster_str, service_names)
return json.dumps({
'services': [service.response_object for service in services],
'failures': []
})
def update_service(self): def update_service(self):
cluster_str = self._get_param('cluster') cluster_str = self._get_param('cluster')
service_name = self._get_param('service') service_name = self._get_param('service')

View File

@ -132,6 +132,67 @@ def test_list_task_definitions():
response['taskDefinitionArns'][1].should.equal('arn:aws:ecs:us-east-1:012345678910:task-definition/test_ecs_task:2') response['taskDefinitionArns'][1].should.equal('arn:aws:ecs:us-east-1:012345678910:task-definition/test_ecs_task:2')
@mock_ecs
def test_describe_task_definition():
client = boto3.client('ecs', region_name='us-east-1')
_ = 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.register_task_definition(
family='test_ecs_task',
containerDefinitions=[
{
'name': 'hello_world2',
'image': 'docker/hello-world2:latest',
'cpu': 1024,
'memory': 400,
'essential': True,
'environment': [{
'name': 'AWS_ACCESS_KEY_ID',
'value': 'SOME_ACCESS_KEY2'
}],
'logConfiguration': {'logDriver': 'json-file'}
}
]
)
_ = client.register_task_definition(
family='test_ecs_task',
containerDefinitions=[
{
'name': 'hello_world3',
'image': 'docker/hello-world3:latest',
'cpu': 1024,
'memory': 400,
'essential': True,
'environment': [{
'name': 'AWS_ACCESS_KEY_ID',
'value': 'SOME_ACCESS_KEY3'
}],
'logConfiguration': {'logDriver': 'json-file'}
}
]
)
response = client.describe_task_definition(taskDefinition='test_ecs_task')
response['taskDefinition']['taskDefinitionArn'].should.equal('arn:aws:ecs:us-east-1:012345678910:task-definition/test_ecs_task:3')
response = client.describe_task_definition(taskDefinition='test_ecs_task:2')
response['taskDefinition']['taskDefinitionArn'].should.equal('arn:aws:ecs:us-east-1:012345678910:task-definition/test_ecs_task:2')
@mock_ecs @mock_ecs
def test_deregister_task_definition(): def test_deregister_task_definition():
client = boto3.client('ecs', region_name='us-east-1') client = boto3.client('ecs', region_name='us-east-1')
@ -251,6 +312,58 @@ def test_list_services():
response['serviceArns'][1].should.equal('arn:aws:ecs:us-east-1:012345678910:service/test_ecs_service2') response['serviceArns'][1].should.equal('arn:aws:ecs:us-east-1:012345678910:service/test_ecs_service2')
@mock_ecs
def test_describe_services():
client = boto3.client('ecs', region_name='us-east-1')
_ = client.create_cluster(
clusterName='test_ecs_cluster'
)
_ = 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='test_ecs_cluster',
serviceName='test_ecs_service1',
taskDefinition='test_ecs_task',
desiredCount=2
)
_ = client.create_service(
cluster='test_ecs_cluster',
serviceName='test_ecs_service2',
taskDefinition='test_ecs_task',
desiredCount=2
)
_ = client.create_service(
cluster='test_ecs_cluster',
serviceName='test_ecs_service3',
taskDefinition='test_ecs_task',
desiredCount=2
)
response = client.describe_services(
cluster='test_ecs_cluster',
services=['test_ecs_service1', 'test_ecs_service2']
)
len(response['services']).should.equal(2)
response['services'][0]['serviceArn'].should.equal('arn:aws:ecs:us-east-1:012345678910:service/test_ecs_service1')
response['services'][0]['serviceName'].should.equal('test_ecs_service1')
response['services'][1]['serviceArn'].should.equal('arn:aws:ecs:us-east-1:012345678910:service/test_ecs_service2')
response['services'][1]['serviceName'].should.equal('test_ecs_service2')
@mock_ecs @mock_ecs
def test_update_service(): def test_update_service():
client = boto3.client('ecs', region_name='us-east-1') client = boto3.client('ecs', region_name='us-east-1')