elasticity 5.0.3 → 6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/HISTORY.md +26 -0
- data/README.md +35 -28
- data/elasticity.gemspec +2 -2
- data/lib/elasticity.rb +5 -3
- data/lib/elasticity/aws_request_v4.rb +15 -3
- data/lib/elasticity/aws_session.rb +4 -23
- data/lib/elasticity/aws_utils.rb +0 -29
- data/lib/elasticity/cluster_status.rb +38 -0
- data/lib/elasticity/cluster_step_status.rb +51 -0
- data/lib/elasticity/emr.rb +208 -78
- data/lib/elasticity/job_flow.rb +16 -17
- data/lib/elasticity/version.rb +1 -1
- data/spec/factories/cluster_status_factory.rb +12 -0
- data/spec/factories/cluster_step_status_factory.rb +17 -0
- data/spec/lib/elasticity/aws_request_v4_spec.rb +54 -4
- data/spec/lib/elasticity/aws_session_spec.rb +22 -88
- data/spec/lib/elasticity/aws_utils_spec.rb +0 -46
- data/spec/lib/elasticity/bootstrap_action_spec.rb +7 -3
- data/spec/lib/elasticity/cluster_status_spec.rb +98 -0
- data/spec/lib/elasticity/cluster_step_status_spec.rb +80 -0
- data/spec/lib/elasticity/custom_jar_step_spec.rb +10 -7
- data/spec/lib/elasticity/emr_spec.rb +422 -132
- data/spec/lib/elasticity/ganglia_bootstrap_action_spec.rb +8 -3
- data/spec/lib/elasticity/hadoop_bootstrap_action_spec.rb +8 -3
- data/spec/lib/elasticity/hadoop_file_bootstrap_action_spec.rb +7 -3
- data/spec/lib/elasticity/hive_step_spec.rb +21 -17
- data/spec/lib/elasticity/instance_group_spec.rb +9 -5
- data/spec/lib/elasticity/job_flow_integration_spec.rb +4 -4
- data/spec/lib/elasticity/job_flow_spec.rb +102 -76
- data/spec/lib/elasticity/job_flow_step_spec.rb +1 -1
- data/spec/lib/elasticity/looper_spec.rb +1 -1
- data/spec/lib/elasticity/pig_step_spec.rb +13 -9
- data/spec/lib/elasticity/s3distcp_step_spec.rb +7 -5
- data/spec/lib/elasticity/script_step_spec.rb +11 -6
- data/spec/lib/elasticity/setup_hadoop_debugging_step_spec.rb +9 -5
- data/spec/lib/elasticity/streaming_step_spec.rb +13 -9
- data/spec/spec_helper.rb +8 -0
- data/spec/support/factory_girl.rb +8 -0
- metadata +24 -21
- data/lib/elasticity/aws_request_v2.rb +0 -42
- data/lib/elasticity/job_flow_status.rb +0 -91
- data/lib/elasticity/job_flow_status_step.rb +0 -38
- data/spec/lib/elasticity/aws_request_v2_spec.rb +0 -38
- data/spec/lib/elasticity/job_flow_status_spec.rb +0 -265
- data/spec/lib/elasticity/job_flow_status_step_spec.rb +0 -80
@@ -77,7 +77,7 @@ describe Elasticity::Looper do
|
|
77
77
|
|
78
78
|
it 'does not communicate that waiting is about to occur' do
|
79
79
|
client = double(:client, on_retry_check: false, on_wait: nil)
|
80
|
-
client.
|
80
|
+
client.should_not_receive(:on_wait)
|
81
81
|
l = Elasticity::Looper.new(client.method(:on_retry_check), client.method(:on_wait))
|
82
82
|
l.go
|
83
83
|
end
|
@@ -6,15 +6,19 @@ describe Elasticity::PigStep do
|
|
6
6
|
|
7
7
|
it { should be_a Elasticity::JobFlowStep }
|
8
8
|
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
9
|
+
describe '.initialize' do
|
10
|
+
it 'should set the fields appropriately' do
|
11
|
+
expect(subject.name).to eql('Elasticity Pig Step (script.pig)')
|
12
|
+
expect(subject.script).to eql('script.pig')
|
13
|
+
expect(subject.variables).to eql({})
|
14
|
+
expect(subject.action_on_failure).to eql('TERMINATE_JOB_FLOW')
|
15
|
+
end
|
16
|
+
end
|
13
17
|
|
14
18
|
describe '#to_aws_step' do
|
15
19
|
|
16
20
|
it 'should convert to aws step format' do
|
17
|
-
step = subject.to_aws_step(Elasticity::JobFlow.new
|
21
|
+
step = subject.to_aws_step(Elasticity::JobFlow.new)
|
18
22
|
step[:name].should == 'Elasticity Pig Step (script.pig)'
|
19
23
|
step[:action_on_failure].should == 'TERMINATE_JOB_FLOW'
|
20
24
|
step[:hadoop_jar_step][:jar].should == 's3://elasticmapreduce/libs/script-runner/script-runner.jar'
|
@@ -29,7 +33,7 @@ describe Elasticity::PigStep do
|
|
29
33
|
|
30
34
|
describe 'E_PARALLELS' do
|
31
35
|
it 'should include the correct value of E_PARALLELS' do
|
32
|
-
job_flow = Elasticity::JobFlow.new
|
36
|
+
job_flow = Elasticity::JobFlow.new
|
33
37
|
job_flow.instance_count = 8
|
34
38
|
{
|
35
39
|
'_' => 7,
|
@@ -49,7 +53,7 @@ describe Elasticity::PigStep do
|
|
49
53
|
let(:ps_with_no_variables) { Elasticity::PigStep.new('script.pig') }
|
50
54
|
|
51
55
|
it 'should convert to aws step format' do
|
52
|
-
step = ps_with_no_variables.to_aws_step(Elasticity::JobFlow.new
|
56
|
+
step = ps_with_no_variables.to_aws_step(Elasticity::JobFlow.new)
|
53
57
|
step[:hadoop_jar_step][:args][5].should == 'script.pig'
|
54
58
|
end
|
55
59
|
end
|
@@ -65,7 +69,7 @@ describe Elasticity::PigStep do
|
|
65
69
|
end
|
66
70
|
|
67
71
|
it 'should convert to aws step format' do
|
68
|
-
step = ps_with_variables.to_aws_step(Elasticity::JobFlow.new
|
72
|
+
step = ps_with_variables.to_aws_step(Elasticity::JobFlow.new)
|
69
73
|
step[:hadoop_jar_step][:args][3..9].should == [
|
70
74
|
'-p', 'VAR1=VALUE1',
|
71
75
|
'-p', 'VAR2=VALUE2',
|
@@ -79,7 +83,7 @@ describe Elasticity::PigStep do
|
|
79
83
|
|
80
84
|
describe '.requires_installation?' do
|
81
85
|
it 'should require installation' do
|
82
|
-
Elasticity::PigStep.requires_installation
|
86
|
+
expect(Elasticity::PigStep.requires_installation?).to be true
|
83
87
|
end
|
84
88
|
end
|
85
89
|
|
@@ -1,10 +1,12 @@
|
|
1
1
|
describe Elasticity::S3DistCpStep do
|
2
2
|
|
3
|
-
it
|
3
|
+
it 'should be a CustomJarStep' do
|
4
|
+
expect(subject).to be_a(Elasticity::CustomJarStep)
|
5
|
+
end
|
4
6
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
7
|
+
it 'should set the appropriate default fields' do
|
8
|
+
expect(subject.name).to eql('Elasticity S3DistCp Step')
|
9
|
+
expect(subject.jar).to eql('/home/hadoop/lib/emr-s3distcp-1.0.jar')
|
10
|
+
end
|
9
11
|
|
10
12
|
end
|
@@ -1,12 +1,17 @@
|
|
1
1
|
describe Elasticity::ScriptStep do
|
2
2
|
|
3
|
-
|
3
|
+
subject do
|
4
|
+
Elasticity::ScriptStep.new('script_location', 'arg1', 'arg2')
|
5
|
+
end
|
4
6
|
|
5
|
-
|
7
|
+
it { should be_a Elasticity::CustomJarStep }
|
6
8
|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
9
|
+
describe '.initialize' do
|
10
|
+
it 'should set the fields appropriately' do
|
11
|
+
expect(subject.name).to eql('Elasticity Script Step')
|
12
|
+
expect(subject.jar).to eql('s3://elasticmapreduce/libs/script-runner/script-runner.jar')
|
13
|
+
expect(subject.arguments).to eql(%w(script_location arg1 arg2))
|
14
|
+
end
|
15
|
+
end
|
11
16
|
|
12
17
|
end
|
@@ -1,10 +1,14 @@
|
|
1
1
|
describe Elasticity::SetupHadoopDebuggingStep do
|
2
2
|
|
3
|
-
it
|
3
|
+
it 'should be a CustomJarStep' do
|
4
|
+
expect(subject).to be_a(Elasticity::CustomJarStep)
|
5
|
+
end
|
4
6
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
7
|
+
it 'should set the appropriate fields' do
|
8
|
+
expect(subject.name).to eql('Elasticity Setup Hadoop Debugging')
|
9
|
+
expect(subject.jar).to eql('s3://elasticmapreduce/libs/script-runner/script-runner.jar')
|
10
|
+
expect(subject.arguments).to eql(['s3://elasticmapreduce/libs/state-pusher/0.1/fetch'])
|
11
|
+
expect(subject.action_on_failure).to eql('TERMINATE_JOB_FLOW')
|
12
|
+
end
|
9
13
|
|
10
14
|
end
|
@@ -6,18 +6,22 @@ describe Elasticity::StreamingStep do
|
|
6
6
|
|
7
7
|
it { should be_a Elasticity::JobFlowStep }
|
8
8
|
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
9
|
+
describe '.initialize' do
|
10
|
+
it 'should set the fields appropriately' do
|
11
|
+
expect(subject.name).to eql('Elasticity Streaming Step')
|
12
|
+
expect(subject.action_on_failure).to eql('TERMINATE_JOB_FLOW')
|
13
|
+
expect(subject.input_bucket).to eql('INPUT_BUCKET')
|
14
|
+
expect(subject.output_bucket).to eql('OUTPUT_BUCKET')
|
15
|
+
expect(subject.mapper).to eql('MAPPER')
|
16
|
+
expect(subject.reducer).to eql('REDUCER')
|
17
|
+
expect(subject.arguments).to eql(%w(-ARG1 VALUE1))
|
18
|
+
end
|
19
|
+
end
|
16
20
|
|
17
21
|
describe '#to_aws_step' do
|
18
22
|
|
19
23
|
it 'should convert to aws step format' do
|
20
|
-
subject.to_aws_step(Elasticity::JobFlow.new
|
24
|
+
subject.to_aws_step(Elasticity::JobFlow.new).should == {
|
21
25
|
:name => 'Elasticity Streaming Step',
|
22
26
|
:action_on_failure => 'TERMINATE_JOB_FLOW',
|
23
27
|
:hadoop_jar_step => {
|
@@ -31,7 +35,7 @@ describe Elasticity::StreamingStep do
|
|
31
35
|
|
32
36
|
describe '.requires_installation?' do
|
33
37
|
it 'should not require installation' do
|
34
|
-
Elasticity::StreamingStep.requires_installation
|
38
|
+
expect(Elasticity::StreamingStep.requires_installation?).to be false
|
35
39
|
end
|
36
40
|
end
|
37
41
|
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: elasticity
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: '6.0'
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Robert Slifka
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-07-
|
11
|
+
date: 2015-07-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rest-client
|
@@ -25,7 +25,7 @@ dependencies:
|
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '1.0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
|
-
name:
|
28
|
+
name: fog
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - ~>
|
@@ -39,33 +39,33 @@ dependencies:
|
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '1.0'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
|
-
name:
|
42
|
+
name: unf
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
45
|
- - ~>
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: '1
|
47
|
+
version: '0.1'
|
48
48
|
type: :runtime
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
52
|
- - ~>
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: '1
|
54
|
+
version: '0.1'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
|
-
name:
|
56
|
+
name: factory_girl
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
59
|
- - ~>
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version: '0
|
62
|
-
type: :
|
61
|
+
version: '4.0'
|
62
|
+
type: :development
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
66
|
- - ~>
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version: '0
|
68
|
+
version: '4.0'
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: fakefs
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -100,14 +100,14 @@ dependencies:
|
|
100
100
|
requirements:
|
101
101
|
- - ~>
|
102
102
|
- !ruby/object:Gem::Version
|
103
|
-
version:
|
103
|
+
version: '3.0'
|
104
104
|
type: :development
|
105
105
|
prerelease: false
|
106
106
|
version_requirements: !ruby/object:Gem::Requirement
|
107
107
|
requirements:
|
108
108
|
- - ~>
|
109
109
|
- !ruby/object:Gem::Version
|
110
|
-
version:
|
110
|
+
version: '3.0'
|
111
111
|
- !ruby/object:Gem::Dependency
|
112
112
|
name: timecop
|
113
113
|
requirement: !ruby/object:Gem::Requirement
|
@@ -142,11 +142,12 @@ files:
|
|
142
142
|
- Rakefile
|
143
143
|
- elasticity.gemspec
|
144
144
|
- lib/elasticity.rb
|
145
|
-
- lib/elasticity/aws_request_v2.rb
|
146
145
|
- lib/elasticity/aws_request_v4.rb
|
147
146
|
- lib/elasticity/aws_session.rb
|
148
147
|
- lib/elasticity/aws_utils.rb
|
149
148
|
- lib/elasticity/bootstrap_action.rb
|
149
|
+
- lib/elasticity/cluster_status.rb
|
150
|
+
- lib/elasticity/cluster_step_status.rb
|
150
151
|
- lib/elasticity/custom_jar_step.rb
|
151
152
|
- lib/elasticity/emr.rb
|
152
153
|
- lib/elasticity/ganglia_bootstrap_action.rb
|
@@ -155,8 +156,6 @@ files:
|
|
155
156
|
- lib/elasticity/hive_step.rb
|
156
157
|
- lib/elasticity/instance_group.rb
|
157
158
|
- lib/elasticity/job_flow.rb
|
158
|
-
- lib/elasticity/job_flow_status.rb
|
159
|
-
- lib/elasticity/job_flow_status_step.rb
|
160
159
|
- lib/elasticity/job_flow_step.rb
|
161
160
|
- lib/elasticity/looper.rb
|
162
161
|
- lib/elasticity/pig_step.rb
|
@@ -166,11 +165,14 @@ files:
|
|
166
165
|
- lib/elasticity/streaming_step.rb
|
167
166
|
- lib/elasticity/sync_to_s3.rb
|
168
167
|
- lib/elasticity/version.rb
|
169
|
-
- spec/
|
168
|
+
- spec/factories/cluster_status_factory.rb
|
169
|
+
- spec/factories/cluster_step_status_factory.rb
|
170
170
|
- spec/lib/elasticity/aws_request_v4_spec.rb
|
171
171
|
- spec/lib/elasticity/aws_session_spec.rb
|
172
172
|
- spec/lib/elasticity/aws_utils_spec.rb
|
173
173
|
- spec/lib/elasticity/bootstrap_action_spec.rb
|
174
|
+
- spec/lib/elasticity/cluster_status_spec.rb
|
175
|
+
- spec/lib/elasticity/cluster_step_status_spec.rb
|
174
176
|
- spec/lib/elasticity/custom_jar_step_spec.rb
|
175
177
|
- spec/lib/elasticity/emr_spec.rb
|
176
178
|
- spec/lib/elasticity/ganglia_bootstrap_action_spec.rb
|
@@ -180,8 +182,6 @@ files:
|
|
180
182
|
- spec/lib/elasticity/instance_group_spec.rb
|
181
183
|
- spec/lib/elasticity/job_flow_integration_spec.rb
|
182
184
|
- spec/lib/elasticity/job_flow_spec.rb
|
183
|
-
- spec/lib/elasticity/job_flow_status_spec.rb
|
184
|
-
- spec/lib/elasticity/job_flow_status_step_spec.rb
|
185
185
|
- spec/lib/elasticity/job_flow_step_spec.rb
|
186
186
|
- spec/lib/elasticity/looper_spec.rb
|
187
187
|
- spec/lib/elasticity/pig_step_spec.rb
|
@@ -192,6 +192,7 @@ files:
|
|
192
192
|
- spec/lib/elasticity/sync_to_s3_spec.rb
|
193
193
|
- spec/spec_helper.rb
|
194
194
|
- spec/support/be_a_hash_including_matcher.rb
|
195
|
+
- spec/support/factory_girl.rb
|
195
196
|
homepage: http://www.github.com/rslifka/elasticity
|
196
197
|
licenses: []
|
197
198
|
metadata: {}
|
@@ -216,11 +217,14 @@ signing_key:
|
|
216
217
|
specification_version: 4
|
217
218
|
summary: Streamlined, programmatic access to Amazon's Elastic Map Reduce service.
|
218
219
|
test_files:
|
219
|
-
- spec/
|
220
|
+
- spec/factories/cluster_status_factory.rb
|
221
|
+
- spec/factories/cluster_step_status_factory.rb
|
220
222
|
- spec/lib/elasticity/aws_request_v4_spec.rb
|
221
223
|
- spec/lib/elasticity/aws_session_spec.rb
|
222
224
|
- spec/lib/elasticity/aws_utils_spec.rb
|
223
225
|
- spec/lib/elasticity/bootstrap_action_spec.rb
|
226
|
+
- spec/lib/elasticity/cluster_status_spec.rb
|
227
|
+
- spec/lib/elasticity/cluster_step_status_spec.rb
|
224
228
|
- spec/lib/elasticity/custom_jar_step_spec.rb
|
225
229
|
- spec/lib/elasticity/emr_spec.rb
|
226
230
|
- spec/lib/elasticity/ganglia_bootstrap_action_spec.rb
|
@@ -230,8 +234,6 @@ test_files:
|
|
230
234
|
- spec/lib/elasticity/instance_group_spec.rb
|
231
235
|
- spec/lib/elasticity/job_flow_integration_spec.rb
|
232
236
|
- spec/lib/elasticity/job_flow_spec.rb
|
233
|
-
- spec/lib/elasticity/job_flow_status_spec.rb
|
234
|
-
- spec/lib/elasticity/job_flow_status_step_spec.rb
|
235
237
|
- spec/lib/elasticity/job_flow_step_spec.rb
|
236
238
|
- spec/lib/elasticity/looper_spec.rb
|
237
239
|
- spec/lib/elasticity/pig_step_spec.rb
|
@@ -242,3 +244,4 @@ test_files:
|
|
242
244
|
- spec/lib/elasticity/sync_to_s3_spec.rb
|
243
245
|
- spec/spec_helper.rb
|
244
246
|
- spec/support/be_a_hash_including_matcher.rb
|
247
|
+
- spec/support/factory_girl.rb
|
@@ -1,42 +0,0 @@
|
|
1
|
-
module Elasticity
|
2
|
-
|
3
|
-
class AwsRequestV2
|
4
|
-
|
5
|
-
def initialize(aws_session, ruby_service_hash)
|
6
|
-
@aws_session = aws_session
|
7
|
-
@ruby_service_hash = ruby_service_hash
|
8
|
-
end
|
9
|
-
|
10
|
-
def url
|
11
|
-
"https://elasticmapreduce.#{@aws_session.region}.amazonaws.com"
|
12
|
-
end
|
13
|
-
|
14
|
-
def headers
|
15
|
-
{
|
16
|
-
:content_type => 'application/x-www-form-urlencoded; charset=utf-8'
|
17
|
-
}
|
18
|
-
end
|
19
|
-
|
20
|
-
# (Used from RightScale's right_aws gem.)
|
21
|
-
# EC2, SQS, SDB and EMR requests must be signed by this guy.
|
22
|
-
# See: http://docs.amazonwebservices.com/AmazonSimpleDB/2007-11-07/DeveloperGuide/index.html?REST_RESTAuth.html
|
23
|
-
# http://developer.amazonwebservices.com/connect/entry.jspa?externalID=1928
|
24
|
-
def payload
|
25
|
-
service_hash = AwsUtils.convert_ruby_to_aws(@ruby_service_hash)
|
26
|
-
service_hash.merge!({
|
27
|
-
'AWSAccessKeyId' => @aws_session.access_key,
|
28
|
-
'Timestamp' => Time.now.utc.strftime('%Y-%m-%dT%H:%M:%S.000Z'),
|
29
|
-
'SignatureVersion' => '2',
|
30
|
-
'SignatureMethod' => 'HmacSHA256'
|
31
|
-
})
|
32
|
-
canonical_string = service_hash.keys.sort.map do |key|
|
33
|
-
"#{AwsUtils.aws_escape(key)}=#{AwsUtils.aws_escape(service_hash[key])}"
|
34
|
-
end.join('&')
|
35
|
-
string_to_sign = "POST\n#{@aws_session.host.downcase}\n/\n#{canonical_string}"
|
36
|
-
signature = AwsUtils.aws_escape(Base64.encode64(OpenSSL::HMAC.digest('sha256', @aws_session.secret_key, string_to_sign)).strip)
|
37
|
-
"#{canonical_string}&Signature=#{signature}"
|
38
|
-
end
|
39
|
-
|
40
|
-
end
|
41
|
-
|
42
|
-
end
|
@@ -1,91 +0,0 @@
|
|
1
|
-
module Elasticity
|
2
|
-
|
3
|
-
class JobFlowStatus
|
4
|
-
|
5
|
-
attr_accessor :name
|
6
|
-
attr_accessor :jobflow_id
|
7
|
-
attr_accessor :state
|
8
|
-
attr_accessor :steps
|
9
|
-
attr_accessor :created_at
|
10
|
-
attr_accessor :started_at
|
11
|
-
attr_accessor :ready_at
|
12
|
-
attr_accessor :ended_at
|
13
|
-
attr_accessor :duration
|
14
|
-
attr_accessor :instance_count
|
15
|
-
attr_accessor :master_instance_type
|
16
|
-
attr_accessor :master_instance_id
|
17
|
-
attr_accessor :slave_instance_type
|
18
|
-
attr_accessor :last_state_change_reason
|
19
|
-
attr_accessor :installed_steps
|
20
|
-
attr_accessor :master_public_dns_name
|
21
|
-
attr_accessor :normalized_instance_hours
|
22
|
-
|
23
|
-
def initialize
|
24
|
-
@steps = []
|
25
|
-
@installed_steps = []
|
26
|
-
end
|
27
|
-
|
28
|
-
# http://docs.aws.amazon.com/ElasticMapReduce/latest/DeveloperGuide/ProcessingCycle.html
|
29
|
-
def active?
|
30
|
-
%w{RUNNING STARTING BOOTSTRAPPING WAITING SHUTTING_DOWN}.include? state
|
31
|
-
end
|
32
|
-
|
33
|
-
# Create a jobflow from an AWS <member> (Nokogiri::XML::Element):
|
34
|
-
# /DescribeJobFlowsResponse/DescribeJobFlowsResult/JobFlows/member
|
35
|
-
def self.from_member_element(xml_element)
|
36
|
-
jobflow_status = JobFlowStatus.new
|
37
|
-
|
38
|
-
jobflow_status.name = xml_element.xpath('./Name').text.strip
|
39
|
-
jobflow_status.jobflow_id = xml_element.xpath('./JobFlowId').text.strip
|
40
|
-
jobflow_status.state = xml_element.xpath('./ExecutionStatusDetail/State').text.strip
|
41
|
-
jobflow_status.last_state_change_reason = xml_element.xpath('./ExecutionStatusDetail/LastStateChangeReason').text.strip
|
42
|
-
|
43
|
-
jobflow_status.steps = JobFlowStatusStep.from_members_nodeset(xml_element.xpath('./Steps/member'))
|
44
|
-
|
45
|
-
step_names = jobflow_status.steps.map(&:name)
|
46
|
-
Elasticity::JobFlowStep.steps_requiring_installation.each do |step|
|
47
|
-
jobflow_status.installed_steps << step if step_names.include?(step.aws_installation_step_name)
|
48
|
-
end
|
49
|
-
|
50
|
-
jobflow_status.created_at = Time.parse(xml_element.xpath('./ExecutionStatusDetail/CreationDateTime').text.strip)
|
51
|
-
|
52
|
-
ready_at = xml_element.xpath('./ExecutionStatusDetail/ReadyDateTime').text.strip
|
53
|
-
jobflow_status.ready_at = (ready_at == '') ? (nil) : (Time.parse(ready_at))
|
54
|
-
|
55
|
-
started_at = xml_element.xpath('./ExecutionStatusDetail/StartDateTime').text.strip
|
56
|
-
jobflow_status.started_at = (started_at == '') ? (nil) : (Time.parse(started_at))
|
57
|
-
|
58
|
-
ended_at = xml_element.xpath('./ExecutionStatusDetail/EndDateTime').text.strip
|
59
|
-
jobflow_status.ended_at = (ended_at == '') ? (nil) : (Time.parse(ended_at))
|
60
|
-
|
61
|
-
if jobflow_status.ended_at && jobflow_status.started_at
|
62
|
-
jobflow_status.duration = ((jobflow_status.ended_at - jobflow_status.started_at) / 60).to_i
|
63
|
-
end
|
64
|
-
|
65
|
-
jobflow_status.instance_count = xml_element.xpath('./Instances/InstanceCount').text.strip
|
66
|
-
jobflow_status.master_instance_type = xml_element.xpath('./Instances/MasterInstanceType').text.strip
|
67
|
-
master_instance_id = xml_element.xpath('./Instances/MasterInstanceId').text.strip
|
68
|
-
jobflow_status.master_instance_id = (master_instance_id == '') ? (nil) : (master_instance_id)
|
69
|
-
jobflow_status.slave_instance_type = xml_element.xpath('./Instances/SlaveInstanceType').text.strip
|
70
|
-
|
71
|
-
master_public_dns_name = xml_element.xpath('./Instances/MasterPublicDnsName').text.strip
|
72
|
-
jobflow_status.master_public_dns_name = (master_public_dns_name == '') ? (nil) : (master_public_dns_name)
|
73
|
-
|
74
|
-
jobflow_status.normalized_instance_hours = xml_element.xpath('./Instances/NormalizedInstanceHours').text.strip
|
75
|
-
|
76
|
-
jobflow_status
|
77
|
-
end
|
78
|
-
|
79
|
-
# Create JobFlows from a collection of AWS <member> nodes (Nokogiri::XML::NodeSet):
|
80
|
-
# /DescribeJobFlowsResponse/DescribeJobFlowsResult/JobFlows
|
81
|
-
def self.from_members_nodeset(members_nodeset)
|
82
|
-
jobflow_statuses = []
|
83
|
-
members_nodeset.each do |member|
|
84
|
-
jobflow_statuses << from_member_element(member)
|
85
|
-
end
|
86
|
-
jobflow_statuses
|
87
|
-
end
|
88
|
-
|
89
|
-
end
|
90
|
-
|
91
|
-
end
|