elasticity 1.4 → 1.4.1
Sign up to get free protection for your applications and to get access to all the features.
- data/HISTORY.md +9 -1
- data/README.md +16 -3
- data/lib/elasticity/emr.rb +20 -0
- data/lib/elasticity/version.rb +1 -1
- data/spec/lib/elasticity/emr_spec.rb +83 -0
- metadata +7 -4
data/HISTORY.md
CHANGED
@@ -1,6 +1,14 @@
|
|
1
|
+
### 1.4.1
|
2
|
+
|
3
|
+
+ Added Elasticity::EMR#describe_jobflow("jobflow_id") for describing a specific job. If you happen to run hundreds of EMR jobs, this makes retrieving jobflow status much faster than using Elasticity::EMR#describe_jobflowS which pulls down and parses XML status for hundreds of jobs.
|
4
|
+
|
5
|
+
### 1.4
|
6
|
+
|
7
|
+
+ Added Elasticity::CustomJarJob for launching "Custom Jar" jobs.
|
8
|
+
|
1
9
|
### 1.3.1
|
2
10
|
|
3
|
-
+ Explicitly requiring 'time'.
|
11
|
+
+ Explicitly requiring 'time' (only a problem if you aren't running from within a Rails environment).
|
4
12
|
+ Elasticity::JobFlow now exposes last_state_change_reason.
|
5
13
|
|
6
14
|
### 1.3 (Contributions from Wouter Broekhof)
|
data/README.md
CHANGED
@@ -177,15 +177,28 @@ AddJobFlowSteps adds the specified steps to the specified job flow.
|
|
177
177
|
})
|
178
178
|
</pre>
|
179
179
|
|
180
|
+
## describe_jobflow (Elasticity Convenience Method)
|
181
|
+
|
182
|
+
This is a convenience methods that wraps DescribeJobFlow to return the status of a single job.
|
183
|
+
|
184
|
+
<pre>
|
185
|
+
emr = Elasticity::EMR.new(ENV["AWS_ACCESS_KEY_ID"], ENV["AWS_SECRET_KEY"])
|
186
|
+
jobflow = emr.describe_jobflow("j-129V5AQFMKO1C")
|
187
|
+
p jobflow.jobflow_id
|
188
|
+
> "j-129V5AQFMKO1C"
|
189
|
+
p jobflow.name
|
190
|
+
> "Elasticity Test Job"
|
191
|
+
</pre>
|
192
|
+
|
180
193
|
## DescribeJobFlows
|
181
194
|
|
182
|
-
DescribeJobFlows returns detailed information as to the state of all jobs. Currently this is wrapped in an <code>Elasticity::JobFlow</code> that contains the <code>name</code>, <code>jobflow_id</code> and <code>state</code>.
|
195
|
+
DescribeJobFlows returns detailed information as to the state of all jobs. Currently this is wrapped in an <code>Elasticity::JobFlow</code> that contains the <code>name</code>, <code>jobflow_id</code> and <code>state</code>.
|
183
196
|
|
184
197
|
<pre>
|
185
198
|
emr = Elasticity::EMR.new(ENV["AWS_ACCESS_KEY_ID"], ENV["AWS_SECRET_KEY"])
|
186
199
|
jobflows = emr.describe_jobflows
|
187
200
|
p jobflows.map(&:name)
|
188
|
-
|
201
|
+
|
189
202
|
> ["Hive Test", "Pig Test", "Interactive Hadoop", "Interactive Hive"]
|
190
203
|
</pre>
|
191
204
|
|
@@ -333,7 +346,7 @@ If you're chomping at the bit to initiate some EMR functionality that isn't wrap
|
|
333
346
|
# License
|
334
347
|
|
335
348
|
<pre>
|
336
|
-
Copyright 2011 Robert Slifka
|
349
|
+
Copyright 2011-2012 Robert Slifka
|
337
350
|
|
338
351
|
Licensed under the Apache License, Version 2.0 (the "License");
|
339
352
|
you may not use this file except in compliance with the License.
|
data/lib/elasticity/emr.rb
CHANGED
@@ -6,6 +6,26 @@ module Elasticity
|
|
6
6
|
@aws_request = Elasticity::AwsRequest.new(aws_access_key_id, aws_secret_access_key, options)
|
7
7
|
end
|
8
8
|
|
9
|
+
# Describe a specific jobflow.
|
10
|
+
#
|
11
|
+
# describe_jobflow("j-3UN6WX5RRO2AG")
|
12
|
+
#
|
13
|
+
# Raises ArgumentError if the specified jobflow does not exist.
|
14
|
+
def describe_jobflow(jobflow_id)
|
15
|
+
begin
|
16
|
+
aws_result = @aws_request.aws_emr_request(EMR.convert_ruby_to_aws({
|
17
|
+
:operation => "DescribeJobFlows",
|
18
|
+
:job_flow_ids => [jobflow_id]
|
19
|
+
}))
|
20
|
+
xml_doc = Nokogiri::XML(aws_result)
|
21
|
+
xml_doc.remove_namespaces!
|
22
|
+
yield aws_result if block_given?
|
23
|
+
JobFlow.from_members_nodeset(xml_doc.xpath("/DescribeJobFlowsResponse/DescribeJobFlowsResult/JobFlows/member")).first
|
24
|
+
rescue RestClient::BadRequest => e
|
25
|
+
raise ArgumentError, EMR.parse_error_response(e.http_body)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
9
29
|
# Lists all jobflows in all states.
|
10
30
|
#
|
11
31
|
# To override this behaviour, pass additional filters as specified in the AWS
|
data/lib/elasticity/version.rb
CHANGED
@@ -318,6 +318,89 @@ describe Elasticity::EMR do
|
|
318
318
|
|
319
319
|
end
|
320
320
|
|
321
|
+
describe "#describe_jobflow" do
|
322
|
+
before do
|
323
|
+
@describe_jobflows_xml = <<-JOBFLOWS
|
324
|
+
<DescribeJobFlowsResponse xmlns="http://elasticmapreduce.amazonaws.com/doc/2009-03-31">
|
325
|
+
<DescribeJobFlowsResult>
|
326
|
+
<JobFlows>
|
327
|
+
<member>
|
328
|
+
<ExecutionStatusDetail>
|
329
|
+
<State>TERMINATED</State>
|
330
|
+
</ExecutionStatusDetail>
|
331
|
+
<JobFlowId>j-3UN6WX5RRO2AG</JobFlowId>
|
332
|
+
<Name>The One Job Flow</Name>
|
333
|
+
</member>
|
334
|
+
</JobFlows>
|
335
|
+
</DescribeJobFlowsResult>
|
336
|
+
</DescribeJobFlowsResponse>
|
337
|
+
JOBFLOWS
|
338
|
+
end
|
339
|
+
|
340
|
+
it "should ask AWS about the specified job flow" do
|
341
|
+
aws_request = Elasticity::AwsRequest.new("","")
|
342
|
+
aws_request.should_receive(:aws_emr_request).with({
|
343
|
+
"Operation" => "DescribeJobFlows",
|
344
|
+
"JobFlowIds.member.1" => "j-3UN6WX5RRO2AG"
|
345
|
+
})
|
346
|
+
Elasticity::AwsRequest.stub(:new).and_return(aws_request)
|
347
|
+
emr = Elasticity::EMR.new("", "")
|
348
|
+
emr.describe_jobflow("j-3UN6WX5RRO2AG")
|
349
|
+
end
|
350
|
+
|
351
|
+
context "when the job flow ID exists" do
|
352
|
+
it "should return a JobFlow" do
|
353
|
+
aws_request = Elasticity::AwsRequest.new("","")
|
354
|
+
aws_request.stub(:aws_emr_request).with({
|
355
|
+
"Operation" => "DescribeJobFlows",
|
356
|
+
"JobFlowIds.member.1" => "j-3UN6WX5RRO2AG"
|
357
|
+
}).and_return(@describe_jobflows_xml)
|
358
|
+
Elasticity::AwsRequest.stub(:new).and_return(aws_request)
|
359
|
+
emr = Elasticity::EMR.new("", "")
|
360
|
+
jobflow = emr.describe_jobflow("j-3UN6WX5RRO2AG")
|
361
|
+
jobflow.jobflow_id.should == "j-3UN6WX5RRO2AG"
|
362
|
+
end
|
363
|
+
end
|
364
|
+
|
365
|
+
context "when there is an error" do
|
366
|
+
before do
|
367
|
+
@error_xml = <<-ERROR
|
368
|
+
<ErrorResponse xmlns="http://elasticmapreduce.amazonaws.com/doc/2009-03-31">
|
369
|
+
<Error>
|
370
|
+
<Message>Specified job flow ID not valid</Message>
|
371
|
+
</Error>
|
372
|
+
</ErrorResponse>
|
373
|
+
ERROR
|
374
|
+
end
|
375
|
+
|
376
|
+
it "should raise an ArgumentError with the error message" do
|
377
|
+
aws_request = Elasticity::AwsRequest.new("aws_access_key_id", "aws_secret_key")
|
378
|
+
@exception = RestClient::BadRequest.new
|
379
|
+
@exception.should_receive(:http_body).and_return(@error_xml)
|
380
|
+
aws_request.should_receive(:aws_emr_request).and_raise(@exception)
|
381
|
+
Elasticity::AwsRequest.should_receive(:new).and_return(aws_request)
|
382
|
+
emr = Elasticity::EMR.new("aws_access_key_id", "aws_secret_key")
|
383
|
+
lambda {
|
384
|
+
emr.describe_jobflow("bad_jobflow_id")
|
385
|
+
}.should raise_error(ArgumentError, "Specified job flow ID not valid")
|
386
|
+
end
|
387
|
+
end
|
388
|
+
|
389
|
+
context "when a block is provided" do
|
390
|
+
it "should yield to the block" do
|
391
|
+
aws_request = Elasticity::AwsRequest.new("aws_access_key_id", "aws_secret_key")
|
392
|
+
aws_request.should_receive(:aws_emr_request).and_return("describe!")
|
393
|
+
Elasticity::AwsRequest.should_receive(:new).and_return(aws_request)
|
394
|
+
emr = Elasticity::EMR.new("aws_access_key_id", "aws_secret_key")
|
395
|
+
xml_result = nil
|
396
|
+
emr.describe_jobflow("_") do |xml|
|
397
|
+
xml_result = xml
|
398
|
+
end
|
399
|
+
xml_result.should == "describe!"
|
400
|
+
end
|
401
|
+
end
|
402
|
+
end
|
403
|
+
|
321
404
|
describe "#modify_instance_groups" do
|
322
405
|
|
323
406
|
describe "integration happy path" do
|
metadata
CHANGED
@@ -1,12 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: elasticity
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 5
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 1
|
8
8
|
- 4
|
9
|
-
|
9
|
+
- 1
|
10
|
+
version: 1.4.1
|
10
11
|
platform: ruby
|
11
12
|
authors:
|
12
13
|
- Robert Slifka
|
@@ -14,7 +15,8 @@ autorequire:
|
|
14
15
|
bindir: bin
|
15
16
|
cert_chain: []
|
16
17
|
|
17
|
-
date: 2011-12-
|
18
|
+
date: 2011-12-17 00:00:00 -08:00
|
19
|
+
default_executable:
|
18
20
|
dependencies:
|
19
21
|
- !ruby/object:Gem::Dependency
|
20
22
|
name: rest-client
|
@@ -199,6 +201,7 @@ files:
|
|
199
201
|
- spec/lib/elasticity/job_flow_step_spec.rb
|
200
202
|
- spec/lib/elasticity/pig_job_spec.rb
|
201
203
|
- spec/spec_helper.rb
|
204
|
+
has_rdoc: true
|
202
205
|
homepage: http://www.github.com/rslifka/elasticity
|
203
206
|
licenses: []
|
204
207
|
|
@@ -228,7 +231,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
228
231
|
requirements: []
|
229
232
|
|
230
233
|
rubyforge_project:
|
231
|
-
rubygems_version: 1.
|
234
|
+
rubygems_version: 1.4.1
|
232
235
|
signing_key:
|
233
236
|
specification_version: 3
|
234
237
|
summary: Programmatic access to Amazon's Elastic Map Reduce service.
|