moto/tests/test_batch/test_cloudformation.py

265 lines
8.7 KiB
Python
Raw Normal View History

from __future__ import unicode_literals
import time
import datetime
import boto3
from botocore.exceptions import ClientError
import sure # noqa
2019-10-31 15:44:26 +00:00
from moto import (
mock_batch,
mock_iam,
mock_ec2,
mock_ecs,
mock_logs,
mock_cloudformation,
)
import functools
import nose
import json
2019-10-31 15:44:26 +00:00
DEFAULT_REGION = "eu-central-1"
def _get_clients():
2019-10-31 15:44:26 +00:00
return (
boto3.client("ec2", region_name=DEFAULT_REGION),
boto3.client("iam", region_name=DEFAULT_REGION),
boto3.client("ecs", region_name=DEFAULT_REGION),
boto3.client("logs", region_name=DEFAULT_REGION),
boto3.client("batch", region_name=DEFAULT_REGION),
)
def _setup(ec2_client, iam_client):
"""
Do prerequisite setup
:return: VPC ID, Subnet ID, Security group ID, IAM Role ARN
:rtype: tuple
"""
2019-10-31 15:44:26 +00:00
resp = ec2_client.create_vpc(CidrBlock="172.30.0.0/24")
vpc_id = resp["Vpc"]["VpcId"]
resp = ec2_client.create_subnet(
2019-10-31 15:44:26 +00:00
AvailabilityZone="eu-central-1a", CidrBlock="172.30.0.0/25", VpcId=vpc_id
)
2019-10-31 15:44:26 +00:00
subnet_id = resp["Subnet"]["SubnetId"]
resp = ec2_client.create_security_group(
2019-10-31 15:44:26 +00:00
Description="test_sg_desc", GroupName="test_sg", VpcId=vpc_id
)
2019-10-31 15:44:26 +00:00
sg_id = resp["GroupId"]
resp = iam_client.create_role(
2019-10-31 15:44:26 +00:00
RoleName="TestRole", AssumeRolePolicyDocument="some_policy"
)
2019-10-31 15:44:26 +00:00
iam_arn = resp["Role"]["Arn"]
2019-12-13 17:52:37 +00:00
iam_client.create_instance_profile(InstanceProfileName="TestRole")
iam_client.add_role_to_instance_profile(
InstanceProfileName="TestRole", RoleName="TestRole"
)
return vpc_id, subnet_id, sg_id, iam_arn
@mock_cloudformation()
@mock_ec2
@mock_ecs
@mock_iam
@mock_batch
def test_create_env_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 = {
2019-10-31 15:44:26 +00:00
"Resources": {
"ComputeEnvironment": {
"Type": "AWS::Batch::ComputeEnvironment",
"Properties": {
"Type": "MANAGED",
"ComputeResources": {
"Type": "EC2",
"MinvCpus": 0,
"DesiredvCpus": 0,
"MaxvCpus": 64,
2019-10-31 15:44:26 +00:00
"InstanceTypes": ["optimal"],
"Subnets": [subnet_id],
"SecurityGroupIds": [sg_id],
2019-12-13 17:52:37 +00:00
"InstanceRole": iam_arn.replace("role", "instance-profile"),
},
2019-10-31 15:44:26 +00:00
"ServiceRole": iam_arn,
},
}
}
}
cf_json = json.dumps(create_environment_template)
2019-10-31 15:44:26 +00:00
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)
2019-10-31 15:44:26 +00:00
stack_resources["StackResourceSummaries"][0]["ResourceStatus"].should.equal(
"CREATE_COMPLETE"
)
2017-10-20 00:06:30 +00:00
# Spot checks on the ARN
2019-10-31 15:44:26 +00:00
stack_resources["StackResourceSummaries"][0]["PhysicalResourceId"].startswith(
"arn:aws:batch:"
)
stack_resources["StackResourceSummaries"][0]["PhysicalResourceId"].should.contain(
"test_stack"
)
2017-10-20 00:06:30 +00:00
@mock_cloudformation()
@mock_ec2
@mock_ecs
@mock_iam
@mock_batch
def test_create_job_queue_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 = {
2019-10-31 15:44:26 +00:00
"Resources": {
2017-10-20 00:06:30 +00:00
"ComputeEnvironment": {
"Type": "AWS::Batch::ComputeEnvironment",
"Properties": {
"Type": "MANAGED",
"ComputeResources": {
"Type": "EC2",
"MinvCpus": 0,
"DesiredvCpus": 0,
"MaxvCpus": 64,
2019-10-31 15:44:26 +00:00
"InstanceTypes": ["optimal"],
2017-10-20 00:06:30 +00:00
"Subnets": [subnet_id],
"SecurityGroupIds": [sg_id],
2019-12-13 17:52:37 +00:00
"InstanceRole": iam_arn.replace("role", "instance-profile"),
2017-10-20 00:06:30 +00:00
},
2019-10-31 15:44:26 +00:00
"ServiceRole": iam_arn,
},
2017-10-20 00:06:30 +00:00
},
"JobQueue": {
"Type": "AWS::Batch::JobQueue",
"Properties": {
"Priority": 1,
"ComputeEnvironmentOrder": [
{
"Order": 1,
2019-10-31 15:44:26 +00:00
"ComputeEnvironment": {"Ref": "ComputeEnvironment"},
2017-10-20 00:06:30 +00:00
}
2019-10-31 15:44:26 +00:00
],
},
2017-10-20 00:06:30 +00:00
},
}
}
cf_json = json.dumps(create_environment_template)
2019-10-31 15:44:26 +00:00
cf_conn = boto3.client("cloudformation", DEFAULT_REGION)
stack_id = cf_conn.create_stack(StackName="test_stack", TemplateBody=cf_json)[
"StackId"
]
2017-10-20 00:06:30 +00:00
stack_resources = cf_conn.list_stack_resources(StackName=stack_id)
2019-10-31 15:44:26 +00:00
len(stack_resources["StackResourceSummaries"]).should.equal(2)
2017-10-20 00:06:30 +00:00
2019-10-31 15:44:26 +00:00
job_queue_resource = list(
filter(
lambda item: item["ResourceType"] == "AWS::Batch::JobQueue",
stack_resources["StackResourceSummaries"],
)
)[0]
2017-10-20 00:06:30 +00:00
2019-10-31 15:44:26 +00:00
job_queue_resource["ResourceStatus"].should.equal("CREATE_COMPLETE")
2017-10-20 00:06:30 +00:00
# Spot checks on the ARN
2019-10-31 15:44:26 +00:00
job_queue_resource["PhysicalResourceId"].startswith("arn:aws:batch:")
job_queue_resource["PhysicalResourceId"].should.contain("test_stack")
job_queue_resource["PhysicalResourceId"].should.contain("job-queue/")
2017-10-20 18:10:31 +00:00
@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 = {
2019-10-31 15:44:26 +00:00
"Resources": {
2017-10-20 18:10:31 +00:00
"ComputeEnvironment": {
"Type": "AWS::Batch::ComputeEnvironment",
"Properties": {
"Type": "MANAGED",
"ComputeResources": {
"Type": "EC2",
"MinvCpus": 0,
"DesiredvCpus": 0,
"MaxvCpus": 64,
2019-10-31 15:44:26 +00:00
"InstanceTypes": ["optimal"],
2017-10-20 18:10:31 +00:00
"Subnets": [subnet_id],
"SecurityGroupIds": [sg_id],
2019-12-13 17:52:37 +00:00
"InstanceRole": iam_arn.replace("role", "instance-profile"),
2017-10-20 18:10:31 +00:00
},
2019-10-31 15:44:26 +00:00
"ServiceRole": iam_arn,
},
2017-10-20 18:10:31 +00:00
},
"JobQueue": {
"Type": "AWS::Batch::JobQueue",
"Properties": {
"Priority": 1,
"ComputeEnvironmentOrder": [
{
"Order": 1,
2019-10-31 15:44:26 +00:00
"ComputeEnvironment": {"Ref": "ComputeEnvironment"},
2017-10-20 18:10:31 +00:00
}
2019-10-31 15:44:26 +00:00
],
},
2017-10-20 18:10:31 +00:00
},
"JobDefinition": {
"Type": "AWS::Batch::JobDefinition",
"Properties": {
"Type": "container",
"ContainerProperties": {
"Image": {
2019-10-31 15:44:26 +00:00
"Fn::Join": [
"",
[
"137112412989.dkr.ecr.",
{"Ref": "AWS::Region"},
".amazonaws.com/amazonlinux:latest",
],
]
2017-10-20 18:10:31 +00:00
},
"Vcpus": 2,
"Memory": 2000,
2019-10-31 15:44:26 +00:00
"Command": ["echo", "Hello world"],
2017-10-20 18:10:31 +00:00
},
2019-10-31 15:44:26 +00:00
"RetryStrategy": {"Attempts": 1},
},
2017-10-20 18:10:31 +00:00
},
}
}
cf_json = json.dumps(create_environment_template)
2019-10-31 15:44:26 +00:00
cf_conn = boto3.client("cloudformation", DEFAULT_REGION)
stack_id = cf_conn.create_stack(StackName="test_stack", TemplateBody=cf_json)[
"StackId"
]
2017-10-20 18:10:31 +00:00
stack_resources = cf_conn.list_stack_resources(StackName=stack_id)
2019-10-31 15:44:26 +00:00
len(stack_resources["StackResourceSummaries"]).should.equal(3)
2017-10-20 18:10:31 +00:00
2019-10-31 15:44:26 +00:00
job_def_resource = list(
filter(
lambda item: item["ResourceType"] == "AWS::Batch::JobDefinition",
stack_resources["StackResourceSummaries"],
)
)[0]
2017-10-20 18:10:31 +00:00
2019-10-31 15:44:26 +00:00
job_def_resource["ResourceStatus"].should.equal("CREATE_COMPLETE")
2017-10-20 18:10:31 +00:00
# Spot checks on the ARN
2019-10-31 15:44:26 +00:00
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/")