Add EMR clusters and tagging.

This commit is contained in:
Steve Pulec 2015-02-14 12:00:14 -05:00
commit 95b1fa42b2
4 changed files with 288 additions and 3 deletions

View file

@ -2,6 +2,7 @@ from __future__ import unicode_literals
from moto.core.responses import BaseResponse
from .models import emr_backend
from .utils import tags_from_query_string
class ElasticMapReduceResponse(BaseResponse):
@ -30,7 +31,8 @@ class ElasticMapReduceResponse(BaseResponse):
return template.render(job_flow=job_flow)
def describe_job_flows(self):
job_flows = emr_backend.describe_job_flows()
job_flow_ids = self._get_multi_param("JobFlowIds.member")
job_flows = emr_backend.describe_job_flows(job_flow_ids)
template = self.response_template(DESCRIBE_JOB_FLOWS_TEMPLATE)
return template.render(job_flows=job_flows)
@ -60,6 +62,31 @@ class ElasticMapReduceResponse(BaseResponse):
template = self.response_template(SET_VISIBLE_TO_ALL_USERS_TEMPLATE)
return template.render()
def list_clusters(self):
clusters = emr_backend.list_clusters()
template = self.response_template(LIST_CLUSTERS_TEMPLATE)
return template.render(clusters=clusters)
def describe_cluster(self):
cluster_id = self._get_param('ClusterId')
cluster = emr_backend.get_cluster(cluster_id)
template = self.response_template(DESCRIBE_CLUSTER_TEMPLATE)
return template.render(cluster=cluster)
def add_tags(self):
cluster_id = self._get_param('ResourceId')
tags = tags_from_query_string(self.querystring)
emr_backend.add_tags(cluster_id, tags)
template = self.response_template(ADD_TAGS_TEMPLATE)
return template.render()
def remove_tags(self):
cluster_id = self._get_param('ResourceId')
tag_keys = self._get_multi_param('TagKeys.member')
emr_backend.remove_tags(cluster_id, tag_keys)
template = self.response_template(REMOVE_TAGS_TEMPLATE)
return template.render()
RUN_JOB_FLOW_TEMPLATE = """<RunJobFlowResponse xmlns="http://elasticmapreduce.amazonaws.com/doc/2009-03-31">
<RunJobFlowResult>
@ -163,6 +190,85 @@ ADD_JOB_FLOW_STEPS_TEMPLATE = """<AddJobFlowStepsResponse xmlns="http://elasticm
</ResponseMetadata>
</AddJobFlowStepsResponse>"""
LIST_CLUSTERS_TEMPLATE = """<ListClustersResponse xmlns="http://elasticmapreduce.amazonaws.com/doc/2009-03-31">
<Clusters>
{% for cluster in clusters %}
<member>
<Id>{{ cluster.id }}</Id>
<Name>{{ cluster.name }}</Name>
<NormalizedInstanceHours>{{ cluster.normalized_instance_hours }}</NormalizedInstanceHours>
<Status>
<State>{{ cluster.state }}</State>
<StateChangeReason>
<Code></Code>
<Message></Message>
</StateChangeReason>
<Timeline></Timeline>
</Status>
</member>
{% endfor %}
</Clusters>
<Marker></Marker>
<ResponseMetadata>
<RequestId>
2690d7eb-ed86-11dd-9877-6fad448a8418
</RequestId>
</ResponseMetadata>
</ListClustersResponse>"""
DESCRIBE_CLUSTER_TEMPLATE = """<DescribeClusterResponse xmlns="http://elasticmapreduce.amazonaws.com/doc/2009-03-31">
<DescribeClusterResult>
<Cluster>
<Id>{{ cluster.id }}</Id>
<Tags>
{% for tag_key, tag_value in cluster.tags.items() %}
<member>
<Key>{{ tag_key }}</Key>
<Value>{{ tag_value }}</Value>
</member>
{% endfor %}
</Tags>
<Ec2InstanceAttributes>
<Ec2AvailabilityZone>{{ cluster.availability_zone }}</Ec2AvailabilityZone>
<Ec2SubnetId>{{ cluster.subnet_id }}</Ec2SubnetId>
<Ec2KeyName>{{ cluster.ec2_key_name }}</Ec2KeyName>
</Ec2InstanceAttributes>
<RunningAmiVersion>{{ cluster.running_ami_version }}</RunningAmiVersion>
<VisibleToAllUsers>{{ cluster.visible_to_all_users }}</VisibleToAllUsers>
<Status>
<StateChangeReason>
<Message>Terminated by user request</Message>
<Code>USER_REQUEST</Code>
</StateChangeReason>
<State>{{ cluster.state }}</State>
<Timeline>
<CreationDateTime>2014-01-24T01:21:21Z</CreationDateTime>
<ReadyDateTime>2014-01-24T01:25:26Z</ReadyDateTime>
<EndDateTime>2014-01-24T02:19:46Z</EndDateTime>
</Timeline>
</Status>
<AutoTerminate>{{ cluster.auto_terminate }}</AutoTerminate>
<Name>{{ cluster.name }}</Name>
<RequestedAmiVersion>{{ cluster.requested_ami_version }}</RequestedAmiVersion>
<Applications>
{% for application in cluster.applications %}
<member>
<Name>{{ application.name }}</Name>
<Version>{{ application.version }}</Version>
</member>
{% endfor %}
</Applications>
<TerminationProtected>{{ cluster.termination_protection }}</TerminationProtected>
<MasterPublicDnsName>ec2-184-0-0-1.us-west-1.compute.amazonaws.com</MasterPublicDnsName>
<NormalizedInstanceHours>{{ cluster.normalized_instance_hours }}</NormalizedInstanceHours>
<ServiceRole>{{ cluster.service_role }}</ServiceRole>
</Cluster>
</DescribeClusterResult>
<ResponseMetadata>
<RequestId>aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee</RequestId>
</ResponseMetadata>
</DescribeClusterResponse>"""
ADD_INSTANCE_GROUPS_TEMPLATE = """<AddInstanceGroupsResponse xmlns="http://elasticmapreduce.amazonaws.com/doc/2009-03-31">
<InstanceGroupIds>{% for instance_group in instance_groups %}{{ instance_group.id }}{% if loop.index != loop.length %},{% endif %}{% endfor %}</InstanceGroupIds>
</AddInstanceGroupsResponse>"""
@ -182,3 +288,20 @@ SET_VISIBLE_TO_ALL_USERS_TEMPLATE = """<SetVisibleToAllUsersResponse xmlns="http
</RequestId>
</ResponseMetadata>
</SetVisibleToAllUsersResponse>"""
ADD_TAGS_TEMPLATE = """<AddTagsResponse xmlns="http://elasticmapreduce.amazonaws.com/doc/2009-03-31">
<ResponseMetadata>
<RequestId>
2690d7eb-ed86-11dd-9877-6fad448a8419
</RequestId>
</ResponseMetadata>
</AddTagsResponse>"""
REMOVE_TAGS_TEMPLATE = """<RemoveTagsResponse xmlns="http://elasticmapreduce.amazonaws.com/doc/2009-03-31">
<ResponseMetadata>
<RequestId>
2690d7eb-ed86-11dd-9877-6fad448a8419
</RequestId>
</ResponseMetadata>
</RemoveTagsResponse>"""