Added JobDefinition to cloudformation
This commit is contained in:
parent
9805a279c7
commit
629503398c
@ -19,7 +19,7 @@ from moto.ecs import ecs_backends
|
|||||||
from moto.logs import logs_backends
|
from moto.logs import logs_backends
|
||||||
|
|
||||||
from .exceptions import InvalidParameterValueException, InternalFailure, ClientException
|
from .exceptions import InvalidParameterValueException, InternalFailure, ClientException
|
||||||
from .utils import make_arn_for_compute_env, make_arn_for_job_queue, make_arn_for_task_def
|
from .utils import make_arn_for_compute_env, make_arn_for_job_queue, make_arn_for_task_def, lowercase_first_key
|
||||||
from moto.ec2.exceptions import InvalidSubnetIdError
|
from moto.ec2.exceptions import InvalidSubnetIdError
|
||||||
from moto.ec2.models import INSTANCE_TYPES as EC2_INSTANCE_TYPES
|
from moto.ec2.models import INSTANCE_TYPES as EC2_INSTANCE_TYPES
|
||||||
from moto.iam.exceptions import IAMNotFoundException
|
from moto.iam.exceptions import IAMNotFoundException
|
||||||
@ -64,18 +64,11 @@ class ComputeEnvironment(BaseModel):
|
|||||||
backend = batch_backends[region_name]
|
backend = batch_backends[region_name]
|
||||||
properties = cloudformation_json['Properties']
|
properties = cloudformation_json['Properties']
|
||||||
|
|
||||||
# Need to deal with difference case from cloudformation compute_resources, e.g. instanceRole vs InstanceRole
|
|
||||||
# Hacky fix to normalise keys
|
|
||||||
new_comp_res = {}
|
|
||||||
for key, value in properties['ComputeResources'].items():
|
|
||||||
new_key = key[0].lower() + key[1:]
|
|
||||||
new_comp_res[new_key] = value
|
|
||||||
|
|
||||||
env = backend.create_compute_environment(
|
env = backend.create_compute_environment(
|
||||||
resource_name,
|
resource_name,
|
||||||
properties['Type'],
|
properties['Type'],
|
||||||
properties.get('State', 'ENABLED'),
|
properties.get('State', 'ENABLED'),
|
||||||
new_comp_res,
|
lowercase_first_key(properties['ComputeResources']),
|
||||||
properties['ServiceRole']
|
properties['ServiceRole']
|
||||||
)
|
)
|
||||||
arn = env[1]
|
arn = env[1]
|
||||||
@ -132,13 +125,7 @@ class JobQueue(BaseModel):
|
|||||||
|
|
||||||
# Need to deal with difference case from cloudformation compute_resources, e.g. instanceRole vs InstanceRole
|
# Need to deal with difference case from cloudformation compute_resources, e.g. instanceRole vs InstanceRole
|
||||||
# Hacky fix to normalise keys, is making me think I want to start spamming cAsEiNsEnSiTiVe dictionaries
|
# Hacky fix to normalise keys, is making me think I want to start spamming cAsEiNsEnSiTiVe dictionaries
|
||||||
compute_envs = []
|
compute_envs = [lowercase_first_key(dict_item) for dict_item in properties['ComputeEnvironmentOrder']]
|
||||||
for compute_env in properties['ComputeEnvironmentOrder']:
|
|
||||||
tmp_compute_env_order = {}
|
|
||||||
for key, value in compute_env.items():
|
|
||||||
new_key = key[0].lower() + key[1:]
|
|
||||||
tmp_compute_env_order[new_key] = value
|
|
||||||
compute_envs.append(tmp_compute_env_order)
|
|
||||||
|
|
||||||
queue = backend.create_job_queue(
|
queue = backend.create_job_queue(
|
||||||
queue_name=resource_name,
|
queue_name=resource_name,
|
||||||
@ -228,6 +215,27 @@ class JobDefinition(BaseModel):
|
|||||||
|
|
||||||
return result
|
return result
|
||||||
|
|
||||||
|
@property
|
||||||
|
def physical_resource_id(self):
|
||||||
|
return self.arn
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def create_from_cloudformation_json(cls, resource_name, cloudformation_json, region_name):
|
||||||
|
backend = batch_backends[region_name]
|
||||||
|
properties = cloudformation_json['Properties']
|
||||||
|
|
||||||
|
res = backend.register_job_definition(
|
||||||
|
def_name=resource_name,
|
||||||
|
parameters=lowercase_first_key(properties.get('Parameters', {})),
|
||||||
|
_type='container',
|
||||||
|
retry_strategy=lowercase_first_key(properties['RetryStrategy']),
|
||||||
|
container_properties=lowercase_first_key(properties['ContainerProperties'])
|
||||||
|
)
|
||||||
|
|
||||||
|
arn = res[1]
|
||||||
|
|
||||||
|
return backend.get_job_definition_by_arn(arn)
|
||||||
|
|
||||||
|
|
||||||
class Job(threading.Thread, BaseModel):
|
class Job(threading.Thread, BaseModel):
|
||||||
def __init__(self, name, job_def, job_queue, log_backend):
|
def __init__(self, name, job_def, job_queue, log_backend):
|
||||||
|
@ -11,3 +11,12 @@ def make_arn_for_job_queue(account_id, name, region_name):
|
|||||||
|
|
||||||
def make_arn_for_task_def(account_id, name, revision, region_name):
|
def make_arn_for_task_def(account_id, name, revision, region_name):
|
||||||
return "arn:aws:batch:{0}:{1}:job-definition/{2}:{3}".format(region_name, account_id, name, revision)
|
return "arn:aws:batch:{0}:{1}:job-definition/{2}:{3}".format(region_name, account_id, name, revision)
|
||||||
|
|
||||||
|
|
||||||
|
def lowercase_first_key(some_dict):
|
||||||
|
new_dict = {}
|
||||||
|
for key, value in some_dict.items():
|
||||||
|
new_key = key[0].lower() + key[1:]
|
||||||
|
new_dict[new_key] = value
|
||||||
|
|
||||||
|
return new_dict
|
||||||
|
@ -162,3 +162,86 @@ def test_create_job_queue_cf():
|
|||||||
job_queue_resource['PhysicalResourceId'].startswith('arn:aws:batch:')
|
job_queue_resource['PhysicalResourceId'].startswith('arn:aws:batch:')
|
||||||
job_queue_resource['PhysicalResourceId'].should.contain('test_stack')
|
job_queue_resource['PhysicalResourceId'].should.contain('test_stack')
|
||||||
job_queue_resource['PhysicalResourceId'].should.contain('job-queue/')
|
job_queue_resource['PhysicalResourceId'].should.contain('job-queue/')
|
||||||
|
|
||||||
|
|
||||||
|
@mock_cloudformation()
|
||||||
|
@mock_ec2
|
||||||
|
@mock_ecs
|
||||||
|
@mock_iam
|
||||||
|
@mock_batch
|
||||||
|
def test_create_job_def_cf():
|
||||||
|
ec2_client, iam_client, ecs_client, logs_client, batch_client = _get_clients()
|
||||||
|
vpc_id, subnet_id, sg_id, iam_arn = _setup(ec2_client, iam_client)
|
||||||
|
|
||||||
|
create_environment_template = {
|
||||||
|
'Resources': {
|
||||||
|
"ComputeEnvironment": {
|
||||||
|
"Type": "AWS::Batch::ComputeEnvironment",
|
||||||
|
"Properties": {
|
||||||
|
"Type": "MANAGED",
|
||||||
|
"ComputeResources": {
|
||||||
|
"Type": "EC2",
|
||||||
|
"MinvCpus": 0,
|
||||||
|
"DesiredvCpus": 0,
|
||||||
|
"MaxvCpus": 64,
|
||||||
|
"InstanceTypes": [
|
||||||
|
"optimal"
|
||||||
|
],
|
||||||
|
"Subnets": [subnet_id],
|
||||||
|
"SecurityGroupIds": [sg_id],
|
||||||
|
"InstanceRole": iam_arn
|
||||||
|
},
|
||||||
|
"ServiceRole": iam_arn
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
"JobQueue": {
|
||||||
|
"Type": "AWS::Batch::JobQueue",
|
||||||
|
"Properties": {
|
||||||
|
"Priority": 1,
|
||||||
|
"ComputeEnvironmentOrder": [
|
||||||
|
{
|
||||||
|
"Order": 1,
|
||||||
|
"ComputeEnvironment": {"Ref": "ComputeEnvironment"}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
"JobDefinition": {
|
||||||
|
"Type": "AWS::Batch::JobDefinition",
|
||||||
|
"Properties": {
|
||||||
|
"Type": "container",
|
||||||
|
"ContainerProperties": {
|
||||||
|
"Image": {
|
||||||
|
"Fn::Join": ["", ["137112412989.dkr.ecr.", {"Ref": "AWS::Region"}, ".amazonaws.com/amazonlinux:latest"]]
|
||||||
|
},
|
||||||
|
"Vcpus": 2,
|
||||||
|
"Memory": 2000,
|
||||||
|
"Command": ["echo", "Hello world"]
|
||||||
|
},
|
||||||
|
"RetryStrategy": {
|
||||||
|
"Attempts": 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
cf_json = json.dumps(create_environment_template)
|
||||||
|
|
||||||
|
cf_conn = boto3.client('cloudformation', DEFAULT_REGION)
|
||||||
|
stack_id = cf_conn.create_stack(
|
||||||
|
StackName='test_stack',
|
||||||
|
TemplateBody=cf_json,
|
||||||
|
)['StackId']
|
||||||
|
|
||||||
|
stack_resources = cf_conn.list_stack_resources(StackName=stack_id)
|
||||||
|
len(stack_resources['StackResourceSummaries']).should.equal(3)
|
||||||
|
|
||||||
|
job_def_resource = list(filter(lambda item: item['ResourceType'] == 'AWS::Batch::JobDefinition', stack_resources['StackResourceSummaries']))[0]
|
||||||
|
|
||||||
|
job_def_resource['ResourceStatus'].should.equal('CREATE_COMPLETE')
|
||||||
|
# Spot checks on the ARN
|
||||||
|
job_def_resource['PhysicalResourceId'].startswith('arn:aws:batch:')
|
||||||
|
job_def_resource['PhysicalResourceId'].should.contain('test_stack-JobDef')
|
||||||
|
job_def_resource['PhysicalResourceId'].should.contain('job-definition/')
|
||||||
|
Loading…
Reference in New Issue
Block a user