Merge pull request #456 from achiku/master
Implement JSON responses for EMR (for Boto3)
This commit is contained in:
commit
4f172dcf41
@ -131,7 +131,7 @@ class BaseResponse(_TemplateEnvironmentMixin):
|
|||||||
else:
|
else:
|
||||||
self.region = self.default_region
|
self.region = self.default_region
|
||||||
|
|
||||||
self.headers = dict(request.headers)
|
self.headers = request.headers
|
||||||
self.response_headers = headers
|
self.response_headers = headers
|
||||||
return self.call_action()
|
return self.call_action()
|
||||||
|
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
|
import json
|
||||||
|
|
||||||
from moto.core.responses import BaseResponse
|
from moto.core.responses import BaseResponse
|
||||||
from .models import emr_backends
|
from .models import emr_backends
|
||||||
@ -11,6 +12,10 @@ class ElasticMapReduceResponse(BaseResponse):
|
|||||||
def backend(self):
|
def backend(self):
|
||||||
return emr_backends[self.region]
|
return emr_backends[self.region]
|
||||||
|
|
||||||
|
@property
|
||||||
|
def boto3_request(self):
|
||||||
|
return 'json' in self.headers.get('Content-Type', [])
|
||||||
|
|
||||||
def add_job_flow_steps(self):
|
def add_job_flow_steps(self):
|
||||||
job_flow_id = self._get_param('JobFlowId')
|
job_flow_id = self._get_param('JobFlowId')
|
||||||
steps = self._get_list_prefix('Steps.member')
|
steps = self._get_list_prefix('Steps.member')
|
||||||
@ -35,6 +40,11 @@ class ElasticMapReduceResponse(BaseResponse):
|
|||||||
if instance_groups:
|
if instance_groups:
|
||||||
self.backend.add_instance_groups(job_flow.id, 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)
|
template = self.response_template(RUN_JOB_FLOW_TEMPLATE)
|
||||||
return template.render(job_flow=job_flow)
|
return template.render(job_flow=job_flow)
|
||||||
|
|
||||||
@ -79,6 +89,24 @@ class ElasticMapReduceResponse(BaseResponse):
|
|||||||
|
|
||||||
def list_clusters(self):
|
def list_clusters(self):
|
||||||
clusters = self.backend.list_clusters()
|
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)
|
template = self.response_template(LIST_CLUSTERS_TEMPLATE)
|
||||||
return template.render(clusters=clusters)
|
return template.render(clusters=clusters)
|
||||||
|
|
||||||
|
@ -39,8 +39,9 @@ class KmsResponse(BaseResponse):
|
|||||||
try:
|
try:
|
||||||
key = self.kms_backend.describe_key(key_id)
|
key = self.kms_backend.describe_key(key_id)
|
||||||
except KeyError:
|
except KeyError:
|
||||||
self.headers['status'] = 404
|
headers = dict(self.headers)
|
||||||
return "{}", self.headers
|
headers['status'] = 404
|
||||||
|
return "{}", headers
|
||||||
return json.dumps(key.to_dict())
|
return json.dumps(key.to_dict())
|
||||||
|
|
||||||
def list_keys(self):
|
def list_keys(self):
|
||||||
|
46
tests/test_emr/test_emr_boto3.py
Normal file
46
tests/test_emr/test_emr_boto3.py
Normal file
@ -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")
|
Loading…
Reference in New Issue
Block a user