Add default ecs attributes and format in response obj (#1346)
* Initialize EC2ContainerServiceBackend and ContainerInstance objects with region_name * Initialize ContainerInstance with default attributes * These attributes are automatically applied by ECS when a container is registered * Docs: http://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-placement-constraints.html#attributes * Format container_instance.attributes for response_object * Python3 * Only use available ECS regions for ecs_backends * Sort dictionaries on key='name' using lambda * Sort all dicts in tests using lambda
This commit is contained in:
parent
caec929506
commit
04c5198a0c
3 changed files with 148 additions and 10 deletions
|
|
@ -2,6 +2,7 @@ from __future__ import unicode_literals
|
|||
import uuid
|
||||
from datetime import datetime
|
||||
from random import random, randint
|
||||
import boto3
|
||||
|
||||
import pytz
|
||||
from moto.core.exceptions import JsonRESTError
|
||||
|
|
@ -261,7 +262,7 @@ class Service(BaseObject):
|
|||
|
||||
class ContainerInstance(BaseObject):
|
||||
|
||||
def __init__(self, ec2_instance_id):
|
||||
def __init__(self, ec2_instance_id, region_name):
|
||||
self.ec2_instance_id = ec2_instance_id
|
||||
self.agent_connected = True
|
||||
self.status = 'ACTIVE'
|
||||
|
|
@ -321,14 +322,29 @@ class ContainerInstance(BaseObject):
|
|||
'agentHash': '4023248',
|
||||
'dockerVersion': 'DockerVersion: 1.5.0'
|
||||
}
|
||||
|
||||
self.attributes = {}
|
||||
ec2_backend = ec2_backends[region_name]
|
||||
ec2_instance = ec2_backend.get_instance(ec2_instance_id)
|
||||
self.attributes = {
|
||||
'ecs.ami-id': ec2_instance.image_id,
|
||||
'ecs.availability-zone': ec2_instance.placement,
|
||||
'ecs.instance-type': ec2_instance.instance_type,
|
||||
'ecs.os-type': ec2_instance.platform if ec2_instance.platform == 'windows' else 'linux' # options are windows and linux, linux is default
|
||||
}
|
||||
|
||||
@property
|
||||
def response_object(self):
|
||||
response_object = self.gen_response_object()
|
||||
response_object['attributes'] = [self._format_attribute(name, value) for name, value in response_object['attributes'].items()]
|
||||
return response_object
|
||||
|
||||
def _format_attribute(self, name, value):
|
||||
formatted_attr = {
|
||||
'name': name,
|
||||
}
|
||||
if value is not None:
|
||||
formatted_attr['value'] = value
|
||||
return formatted_attr
|
||||
|
||||
|
||||
class ContainerInstanceFailure(BaseObject):
|
||||
|
||||
|
|
@ -347,12 +363,19 @@ class ContainerInstanceFailure(BaseObject):
|
|||
|
||||
class EC2ContainerServiceBackend(BaseBackend):
|
||||
|
||||
def __init__(self):
|
||||
def __init__(self, region_name):
|
||||
super(EC2ContainerServiceBackend, self).__init__()
|
||||
self.clusters = {}
|
||||
self.task_definitions = {}
|
||||
self.tasks = {}
|
||||
self.services = {}
|
||||
self.container_instances = {}
|
||||
self.region_name = region_name
|
||||
|
||||
def reset(self):
|
||||
region_name = self.region_name
|
||||
self.__dict__ = {}
|
||||
self.__init__(region_name)
|
||||
|
||||
def describe_task_definition(self, task_definition_str):
|
||||
task_definition_name = task_definition_str.split('/')[-1]
|
||||
|
|
@ -669,7 +692,7 @@ class EC2ContainerServiceBackend(BaseBackend):
|
|||
cluster_name = cluster_str.split('/')[-1]
|
||||
if cluster_name not in self.clusters:
|
||||
raise Exception("{0} is not a cluster".format(cluster_name))
|
||||
container_instance = ContainerInstance(ec2_instance_id)
|
||||
container_instance = ContainerInstance(ec2_instance_id, self.region_name)
|
||||
if not self.container_instances.get(cluster_name):
|
||||
self.container_instances[cluster_name] = {}
|
||||
container_instance_id = container_instance.container_instance_arn.split(
|
||||
|
|
@ -866,6 +889,5 @@ class EC2ContainerServiceBackend(BaseBackend):
|
|||
yield task_fam
|
||||
|
||||
|
||||
ecs_backends = {}
|
||||
for region, ec2_backend in ec2_backends.items():
|
||||
ecs_backends[region] = EC2ContainerServiceBackend()
|
||||
available_regions = boto3.session.Session().get_available_regions("ecs")
|
||||
ecs_backends = {region: EC2ContainerServiceBackend(region) for region in available_regions}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue