ECS: Added schedulingStrategy support
Co-authored-by: Jonas Gratz <jgratz@newstore.com>
This commit is contained in:
parent
42d486f9b0
commit
b75e78a3cd
@ -179,7 +179,7 @@ class Task(BaseObject):
|
|||||||
|
|
||||||
class Service(BaseObject):
|
class Service(BaseObject):
|
||||||
|
|
||||||
def __init__(self, cluster, service_name, task_definition, desired_count, load_balancers=None):
|
def __init__(self, cluster, service_name, task_definition, desired_count, load_balancers=None, scheduling_strategy=None):
|
||||||
self.cluster_arn = cluster.arn
|
self.cluster_arn = cluster.arn
|
||||||
self.arn = 'arn:aws:ecs:us-east-1:012345678910:service/{0}'.format(
|
self.arn = 'arn:aws:ecs:us-east-1:012345678910:service/{0}'.format(
|
||||||
service_name)
|
service_name)
|
||||||
@ -202,6 +202,7 @@ class Service(BaseObject):
|
|||||||
}
|
}
|
||||||
]
|
]
|
||||||
self.load_balancers = load_balancers if load_balancers is not None else []
|
self.load_balancers = load_balancers if load_balancers is not None else []
|
||||||
|
self.scheduling_strategy = scheduling_strategy if scheduling_strategy is not None else 'REPLICA'
|
||||||
self.pending_count = 0
|
self.pending_count = 0
|
||||||
|
|
||||||
@property
|
@property
|
||||||
@ -214,6 +215,7 @@ class Service(BaseObject):
|
|||||||
del response_object['name'], response_object['arn']
|
del response_object['name'], response_object['arn']
|
||||||
response_object['serviceName'] = self.name
|
response_object['serviceName'] = self.name
|
||||||
response_object['serviceArn'] = self.arn
|
response_object['serviceArn'] = self.arn
|
||||||
|
response_object['schedulingStrategy'] = self.scheduling_strategy
|
||||||
|
|
||||||
for deployment in response_object['deployments']:
|
for deployment in response_object['deployments']:
|
||||||
if isinstance(deployment['createdAt'], datetime):
|
if isinstance(deployment['createdAt'], datetime):
|
||||||
@ -655,7 +657,7 @@ class EC2ContainerServiceBackend(BaseBackend):
|
|||||||
raise Exception("Could not find task {} on cluster {}".format(
|
raise Exception("Could not find task {} on cluster {}".format(
|
||||||
task_str, cluster_name))
|
task_str, cluster_name))
|
||||||
|
|
||||||
def create_service(self, cluster_str, service_name, task_definition_str, desired_count, load_balancers=None):
|
def create_service(self, cluster_str, service_name, task_definition_str, desired_count, load_balancers=None, scheduling_strategy=None):
|
||||||
cluster_name = cluster_str.split('/')[-1]
|
cluster_name = cluster_str.split('/')[-1]
|
||||||
if cluster_name in self.clusters:
|
if cluster_name in self.clusters:
|
||||||
cluster = self.clusters[cluster_name]
|
cluster = self.clusters[cluster_name]
|
||||||
@ -665,7 +667,7 @@ class EC2ContainerServiceBackend(BaseBackend):
|
|||||||
desired_count = desired_count if desired_count is not None else 0
|
desired_count = desired_count if desired_count is not None else 0
|
||||||
|
|
||||||
service = Service(cluster, service_name,
|
service = Service(cluster, service_name,
|
||||||
task_definition, desired_count, load_balancers)
|
task_definition, desired_count, load_balancers, scheduling_strategy)
|
||||||
cluster_service_pair = '{0}:{1}'.format(cluster_name, service_name)
|
cluster_service_pair = '{0}:{1}'.format(cluster_name, service_name)
|
||||||
self.services[cluster_service_pair] = service
|
self.services[cluster_service_pair] = service
|
||||||
|
|
||||||
|
@ -154,8 +154,9 @@ class EC2ContainerServiceResponse(BaseResponse):
|
|||||||
task_definition_str = self._get_param('taskDefinition')
|
task_definition_str = self._get_param('taskDefinition')
|
||||||
desired_count = self._get_int_param('desiredCount')
|
desired_count = self._get_int_param('desiredCount')
|
||||||
load_balancers = self._get_param('loadBalancers')
|
load_balancers = self._get_param('loadBalancers')
|
||||||
|
scheduling_strategy = self._get_param('schedulingStrategy')
|
||||||
service = self.ecs_backend.create_service(
|
service = self.ecs_backend.create_service(
|
||||||
cluster_str, service_name, task_definition_str, desired_count, load_balancers)
|
cluster_str, service_name, task_definition_str, desired_count, load_balancers, scheduling_strategy)
|
||||||
return json.dumps({
|
return json.dumps({
|
||||||
'service': service.response_object
|
'service': service.response_object
|
||||||
})
|
})
|
||||||
|
@ -304,6 +304,52 @@ def test_create_service():
|
|||||||
response['service']['status'].should.equal('ACTIVE')
|
response['service']['status'].should.equal('ACTIVE')
|
||||||
response['service']['taskDefinition'].should.equal(
|
response['service']['taskDefinition'].should.equal(
|
||||||
'arn:aws:ecs:us-east-1:012345678910:task-definition/test_ecs_task:1')
|
'arn:aws:ecs:us-east-1:012345678910:task-definition/test_ecs_task:1')
|
||||||
|
response['service']['schedulingStrategy'].should.equal('REPLICA')
|
||||||
|
|
||||||
|
@mock_ecs
|
||||||
|
def test_create_service_scheduling_strategy():
|
||||||
|
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'}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
)
|
||||||
|
response = client.create_service(
|
||||||
|
cluster='test_ecs_cluster',
|
||||||
|
serviceName='test_ecs_service',
|
||||||
|
taskDefinition='test_ecs_task',
|
||||||
|
desiredCount=2,
|
||||||
|
schedulingStrategy='DAEMON',
|
||||||
|
)
|
||||||
|
response['service']['clusterArn'].should.equal(
|
||||||
|
'arn:aws:ecs:us-east-1:012345678910:cluster/test_ecs_cluster')
|
||||||
|
response['service']['desiredCount'].should.equal(2)
|
||||||
|
len(response['service']['events']).should.equal(0)
|
||||||
|
len(response['service']['loadBalancers']).should.equal(0)
|
||||||
|
response['service']['pendingCount'].should.equal(0)
|
||||||
|
response['service']['runningCount'].should.equal(0)
|
||||||
|
response['service']['serviceArn'].should.equal(
|
||||||
|
'arn:aws:ecs:us-east-1:012345678910:service/test_ecs_service')
|
||||||
|
response['service']['serviceName'].should.equal('test_ecs_service')
|
||||||
|
response['service']['status'].should.equal('ACTIVE')
|
||||||
|
response['service']['taskDefinition'].should.equal(
|
||||||
|
'arn:aws:ecs:us-east-1:012345678910:task-definition/test_ecs_task:1')
|
||||||
|
response['service']['schedulingStrategy'].should.equal('DAEMON')
|
||||||
|
|
||||||
|
|
||||||
@mock_ecs
|
@mock_ecs
|
||||||
@ -411,6 +457,72 @@ def test_describe_services():
|
|||||||
response['services'][0]['deployments'][0]['status'].should.equal('PRIMARY')
|
response['services'][0]['deployments'][0]['status'].should.equal('PRIMARY')
|
||||||
|
|
||||||
|
|
||||||
|
@mock_ecs
|
||||||
|
def test_describe_services_scheduling_strategy():
|
||||||
|
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,
|
||||||
|
schedulingStrategy='DAEMON'
|
||||||
|
)
|
||||||
|
_ = 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',
|
||||||
|
'arn:aws:ecs:us-east-1:012345678910:service/test_ecs_service2',
|
||||||
|
'test_ecs_service3']
|
||||||
|
)
|
||||||
|
len(response['services']).should.equal(3)
|
||||||
|
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')
|
||||||
|
|
||||||
|
response['services'][0]['deployments'][0]['desiredCount'].should.equal(2)
|
||||||
|
response['services'][0]['deployments'][0]['pendingCount'].should.equal(2)
|
||||||
|
response['services'][0]['deployments'][0]['runningCount'].should.equal(0)
|
||||||
|
response['services'][0]['deployments'][0]['status'].should.equal('PRIMARY')
|
||||||
|
|
||||||
|
response['services'][0]['schedulingStrategy'].should.equal('REPLICA')
|
||||||
|
response['services'][1]['schedulingStrategy'].should.equal('DAEMON')
|
||||||
|
response['services'][2]['schedulingStrategy'].should.equal('REPLICA')
|
||||||
|
|
||||||
|
|
||||||
@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')
|
||||||
@ -449,6 +561,7 @@ def test_update_service():
|
|||||||
desiredCount=0
|
desiredCount=0
|
||||||
)
|
)
|
||||||
response['service']['desiredCount'].should.equal(0)
|
response['service']['desiredCount'].should.equal(0)
|
||||||
|
response['service']['schedulingStrategy'].should.equal('REPLICA')
|
||||||
|
|
||||||
|
|
||||||
@mock_ecs
|
@mock_ecs
|
||||||
@ -515,10 +628,12 @@ def test_delete_service():
|
|||||||
'arn:aws:ecs:us-east-1:012345678910:service/test_ecs_service')
|
'arn:aws:ecs:us-east-1:012345678910:service/test_ecs_service')
|
||||||
response['service']['serviceName'].should.equal('test_ecs_service')
|
response['service']['serviceName'].should.equal('test_ecs_service')
|
||||||
response['service']['status'].should.equal('ACTIVE')
|
response['service']['status'].should.equal('ACTIVE')
|
||||||
|
response['service']['schedulingStrategy'].should.equal('REPLICA')
|
||||||
response['service']['taskDefinition'].should.equal(
|
response['service']['taskDefinition'].should.equal(
|
||||||
'arn:aws:ecs:us-east-1:012345678910:task-definition/test_ecs_task:1')
|
'arn:aws:ecs:us-east-1:012345678910:task-definition/test_ecs_task:1')
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@mock_ec2
|
@mock_ec2
|
||||||
@mock_ecs
|
@mock_ecs
|
||||||
def test_register_container_instance():
|
def test_register_container_instance():
|
||||||
|
Loading…
Reference in New Issue
Block a user