diff options
author | Daniel G. Taylor <dan@programmer-art.org> | 2014-08-04 13:55:29 -0700 |
---|---|---|
committer | Daniel G. Taylor <dan@programmer-art.org> | 2014-08-04 13:55:29 -0700 |
commit | 2ffb00a6692f61fda1fe6f67b2253e2e1228eca5 (patch) | |
tree | b3a2c9587b4620134bc6441ae5dab01f02196d8f | |
parent | e872d9475ab5535f8b3391ffbeda5a698d473658 (diff) | |
parent | e2a20c6743f020e5ce5c7fffc3c67915c621fd3b (diff) | |
download | boto-2ffb00a6692f61fda1fe6f67b2253e2e1228eca5.tar.gz |
Merge pull request #2456 from danielgtaylor/emr-fix
Fix parsing of EMR step summary response. Fixes #2456.
-rw-r--r-- | boto/emr/emrobject.py | 6 | ||||
-rw-r--r-- | tests/unit/emr/test_connection.py | 93 |
2 files changed, 97 insertions, 2 deletions
diff --git a/boto/emr/emrobject.py b/boto/emr/emrobject.py index 0906bfab..f605834c 100644 --- a/boto/emr/emrobject.py +++ b/boto/emr/emrobject.py @@ -301,7 +301,7 @@ class ClusterSummaryList(EmrObject): class StepConfig(EmrObject): Fields = set([ - 'Jar' + 'Jar', 'MainClass' ]) @@ -434,11 +434,15 @@ class StepSummary(EmrObject): def __init__(self, connection=None): self.connection = connection self.status = None + self.config = None def startElement(self, name, attrs, connection): if name == 'Status': self.status = ClusterStatus() return self.status + elif name == 'Config': + self.config = StepConfig() + return self.config else: return None diff --git a/tests/unit/emr/test_connection.py b/tests/unit/emr/test_connection.py index 5badd6ad..c60f04a4 100644 --- a/tests/unit/emr/test_connection.py +++ b/tests/unit/emr/test_connection.py @@ -372,7 +372,74 @@ class TestListSteps(AWSMockServiceTestCase): connection_class = EmrConnection def default_body(self): - return b"""<ListStepsOutput><Steps><member><Name>Step 1</Name></member></Steps></ListStepsOutput>""" + return b"""<ListStepsResponse xmlns="http://elasticmapreduce.amazonaws.com/doc/2009-03-31"> + <ListStepsResult> + <Steps> + <member> + <Id>abc123</Id> + <Status> + <StateChangeReason/> + <Timeline> + <CreationDateTime>2014-07-01T00:00:00.000Z</CreationDateTime> + </Timeline> + <State>PENDING</State> + </Status> + <Name>Step 1</Name> + <Config> + <Jar>/home/hadoop/lib/emr-s3distcp-1.0.jar</Jar> + <Args> + <member>--src</member> + <member>hdfs:///data/test/</member> + <member>--dest</member> + <member>s3n://test/data</member> + </Args> + <Properties/> + </Config> + <ActionOnFailure>CONTINUE</ActionOnFailure> + </member> + <member> + <Id>def456</Id> + <Status> + <StateChangeReason/> + <Timeline> + <CreationDateTime>2014-07-01T00:00:00.000Z</CreationDateTime> + </Timeline> + <State>COMPLETED</State> + </Status> + <Name>Step 2</Name> + <Config> + <MainClass>my.main.SomeClass</MainClass> + <Jar>s3n://test/jars/foo.jar</Jar> + </Config> + <ActionOnFailure>CONTINUE</ActionOnFailure> + </member> + <member> + <Id>ghi789</Id> + <Status> + <StateChangeReason/> + <Timeline> + <CreationDateTime>2014-07-01T00:00:00.000Z</CreationDateTime> + </Timeline> + <State>FAILED</State> + </Status> + <Name>Step 3</Name> + <Config> + <Jar>s3n://test/jars/bar.jar</Jar> + <Args> + <member>-arg</member> + <member>value</member> + </Args> + <Properties/> + </Config> + <ActionOnFailure>TERMINATE_CLUSTER</ActionOnFailure> + </member> + </Steps> + </ListStepsResult> + <ResponseMetadata> + <RequestId>eff31ee5-0342-11e4-b3c7-9de5a93f6fcb</RequestId> + </ResponseMetadata> +</ListStepsResponse> +""" def test_list_steps(self): self.set_http_response(200) @@ -390,6 +457,30 @@ class TestListSteps(AWSMockServiceTestCase): self.assertTrue(isinstance(response, StepSummaryList)) self.assertEqual(response.steps[0].name, 'Step 1') + valid_states = [ + 'PENDING', + 'RUNNING', + 'COMPLETED', + 'CANCELLED', + 'FAILED', + 'INTERRUPTED' + ] + + # Check for step states + for step in response.steps: + self.assertIn(step.status.state, valid_states) + + # Check for step config + step = response.steps[0] + self.assertEqual(step.config.jar, + '/home/hadoop/lib/emr-s3distcp-1.0.jar') + self.assertEqual(len(step.config.args), 4) + self.assertEqual(step.config.args[0].value, '--src') + self.assertEqual(step.config.args[1].value, 'hdfs:///data/test/') + + step = response.steps[1] + self.assertEqual(step.config.mainclass, 'my.main.SomeClass') + def test_list_steps_with_states(self): self.set_http_response(200) response = self.service_connection.list_steps( |