From 7a115001719805a2d26f364f720ad01e386216b0 Mon Sep 17 00:00:00 2001 From: Akira Chiku Date: Sun, 15 Nov 2015 17:24:36 +0900 Subject: [PATCH] Implement JSON responses for EMR (for Boto3) --- moto/emr/responses.py | 28 +++++++++++++++++++ tests/test_emr/test_emr_boto3.py | 46 ++++++++++++++++++++++++++++++++ 2 files changed, 74 insertions(+) create mode 100644 tests/test_emr/test_emr_boto3.py diff --git a/moto/emr/responses.py b/moto/emr/responses.py index f7b149345..9cc76a114 100644 --- a/moto/emr/responses.py +++ b/moto/emr/responses.py @@ -1,4 +1,5 @@ from __future__ import unicode_literals +import json from moto.core.responses import BaseResponse from .models import emr_backends @@ -11,6 +12,10 @@ class ElasticMapReduceResponse(BaseResponse): def backend(self): return emr_backends[self.region] + @property + def boto3_request(self): + return 'Boto3' in self.headers.get('User-Agent', []) + def add_job_flow_steps(self): job_flow_id = self._get_param('JobFlowId') steps = self._get_list_prefix('Steps.member') @@ -35,6 +40,11 @@ class ElasticMapReduceResponse(BaseResponse): if instance_groups: self.backend.add_instance_groups(job_flow.id, instance_groups) + if self.boto3_request: + return json.dumps({ + "JobFlowId": job_flow.id + }) + template = self.response_template(RUN_JOB_FLOW_TEMPLATE) return template.render(job_flow=job_flow) @@ -79,6 +89,24 @@ class ElasticMapReduceResponse(BaseResponse): def list_clusters(self): clusters = self.backend.list_clusters() + + if self.boto3_request: + return json.dumps({ + "Clusters": [ + { + "Id": cluster.id, + "Name": cluster.name, + "Status": { + "State": cluster.state, + "StatusChangeReason": {}, + "TimeLine": {}, + }, + "NormalizedInstanceHours": cluster.normalized_instance_hours, + } for cluster in clusters + ], + "Marker": "" + }) + template = self.response_template(LIST_CLUSTERS_TEMPLATE) return template.render(clusters=clusters) diff --git a/tests/test_emr/test_emr_boto3.py b/tests/test_emr/test_emr_boto3.py new file mode 100644 index 000000000..1a336a599 --- /dev/null +++ b/tests/test_emr/test_emr_boto3.py @@ -0,0 +1,46 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +import boto3 +import sure # noqa + +from moto import mock_emr + + +@mock_emr +def test_run_job_flow(): + client = boto3.client('emr', region_name='us-east-1') + cluster_id = client.run_job_flow( + Name='cluster', + Instances={ + 'MasterInstanceType': 'c3.xlarge', + 'SlaveInstanceType': 'c3.xlarge', + 'InstanceCount': 3, + 'Placement': {'AvailabilityZone': 'us-east-1a'}, + 'KeepJobFlowAliveWhenNoSteps': True, + }, + VisibleToAllUsers=True, + ) + cluster_id.should.have.key('JobFlowId') + + +@mock_emr +def test_list_clusters(): + client = boto3.client('emr', region_name='us-east-1') + client.run_job_flow( + Name='cluster', + Instances={ + 'MasterInstanceType': 'c3.xlarge', + 'SlaveInstanceType': 'c3.xlarge', + 'InstanceCount': 3, + 'Placement': {'AvailabilityZone': 'us-east-1a'}, + 'KeepJobFlowAliveWhenNoSteps': True, + }, + VisibleToAllUsers=True, + ) + summary = client.list_clusters() + clusters = summary['Clusters'] + clusters.should.have.length_of(1) + cluster = clusters[0] + cluster['NormalizedInstanceHours'].should.equal(0) + cluster['Status']['State'].should.equal("RUNNING")