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
@@ -1,23 +1,20 @@
|
|
1
1
|
describe Elasticity::EMR do
|
2
2
|
|
3
3
|
subject do
|
4
|
-
Elasticity::EMR.new(
|
4
|
+
Elasticity::EMR.new(:region => 'TEST_REGION')
|
5
5
|
end
|
6
6
|
|
7
|
-
describe '.
|
7
|
+
describe '.initialize' do
|
8
8
|
|
9
9
|
context 'when arguments are provided' do
|
10
|
-
|
10
|
+
it 'should use the provided arguments' do
|
11
|
+
expect(subject.aws_request).to eq(Elasticity::AwsSession.new(:region => 'TEST_REGION'))
|
12
|
+
end
|
11
13
|
end
|
12
|
-
|
13
14
|
context 'when arguments are not provided' do
|
14
|
-
before do
|
15
|
-
ENV.stub(:[]).with('AWS_ACCESS_KEY_ID').and_return('ENV_ACCESS')
|
16
|
-
ENV.stub(:[]).with('AWS_SECRET_ACCESS_KEY').and_return('ENV_SECRET')
|
17
|
-
end
|
18
15
|
it 'should use environment variables' do
|
19
16
|
emr = Elasticity::EMR.new
|
20
|
-
emr.aws_request.should == Elasticity::AwsSession.new(
|
17
|
+
emr.aws_request.should == Elasticity::AwsSession.new({})
|
21
18
|
end
|
22
19
|
end
|
23
20
|
|
@@ -25,31 +22,25 @@ describe Elasticity::EMR do
|
|
25
22
|
|
26
23
|
describe '#add_instance_groups' do
|
27
24
|
|
25
|
+
let(:aws_response) do
|
26
|
+
<<-JSON
|
27
|
+
{
|
28
|
+
"InstanceGroupIds": ["ig-1", "ig-2", "ig-3"],
|
29
|
+
"JobFlowId": "j-3U7TSX5GZFD8Y"
|
30
|
+
}
|
31
|
+
JSON
|
32
|
+
end
|
33
|
+
|
28
34
|
it 'should send the correct params to AWS' do
|
29
35
|
Elasticity::AwsSession.any_instance.should_receive(:submit).with({
|
30
36
|
:operation => 'AddInstanceGroups',
|
31
37
|
:job_flow_id => 'JOBFLOW_ID',
|
32
38
|
:instance_groups => ['INSTANCE_GROUP_CONFIGS']
|
33
|
-
})
|
39
|
+
}).and_return(aws_response)
|
34
40
|
subject.add_instance_groups('JOBFLOW_ID', ['INSTANCE_GROUP_CONFIGS'])
|
35
41
|
end
|
36
42
|
|
37
43
|
describe 'return values' do
|
38
|
-
let(:aws_response) do
|
39
|
-
<<-XML
|
40
|
-
<AddInstanceGroupsResponse xmlns="http://elasticmapreduce.amazonaws.com/doc/2009-03-31">
|
41
|
-
<AddInstanceGroupsResult>
|
42
|
-
<JobFlowId>j-OALI7TZTQMHX</JobFlowId>
|
43
|
-
<InstanceGroupIds>
|
44
|
-
<member>ig-1</member>
|
45
|
-
<member>ig-2</member>
|
46
|
-
<member>ig-3</member>
|
47
|
-
</InstanceGroupIds>
|
48
|
-
</AddInstanceGroupsResult>
|
49
|
-
</AddInstanceGroupsResponse>
|
50
|
-
XML
|
51
|
-
end
|
52
|
-
|
53
44
|
it 'should return an array of the new instance groups IDs' do
|
54
45
|
Elasticity::AwsSession.any_instance.should_receive(:submit).and_return(aws_response)
|
55
46
|
subject.add_instance_groups('', []).should == ['ig-1', 'ig-2', 'ig-3']
|
@@ -57,11 +48,10 @@ describe Elasticity::EMR do
|
|
57
48
|
end
|
58
49
|
|
59
50
|
context 'when a block is given' do
|
60
|
-
let(:result) { 'RESULT' }
|
61
51
|
it 'should yield the submission results' do
|
62
|
-
Elasticity::AwsSession.any_instance.should_receive(:submit).and_return(
|
63
|
-
subject.add_instance_groups('', []) do |
|
64
|
-
|
52
|
+
Elasticity::AwsSession.any_instance.should_receive(:submit).and_return(aws_response)
|
53
|
+
subject.add_instance_groups('', []) do |result|
|
54
|
+
result.should == aws_response
|
65
55
|
end
|
66
56
|
end
|
67
57
|
end
|
@@ -70,147 +60,367 @@ describe Elasticity::EMR do
|
|
70
60
|
|
71
61
|
describe '#add_jobflow_steps' do
|
72
62
|
|
63
|
+
let(:aws_result) {
|
64
|
+
<<-JSON
|
65
|
+
{"Key" : "Value"}
|
66
|
+
JSON
|
67
|
+
}
|
68
|
+
|
73
69
|
it 'should add the specified steps to the job flow' do
|
74
70
|
Elasticity::AwsSession.any_instance.should_receive(:submit).with({
|
75
71
|
:operation => 'AddJobFlowSteps',
|
76
72
|
:job_flow_id => 'JOBFLOW_ID',
|
77
73
|
:steps => ['_']
|
78
|
-
})
|
79
|
-
subject.add_jobflow_steps('JOBFLOW_ID',
|
74
|
+
}).and_return(aws_result)
|
75
|
+
expect(subject.add_jobflow_steps('JOBFLOW_ID', ['_'])).to eql(JSON.parse(aws_result))
|
80
76
|
end
|
81
77
|
|
82
78
|
context 'when a block is given' do
|
83
|
-
let(:result) { 'RESULT' }
|
84
79
|
it 'should yield the submission results' do
|
85
|
-
Elasticity::AwsSession.any_instance.should_receive(:submit).and_return(
|
86
|
-
subject.add_jobflow_steps('',
|
87
|
-
|
80
|
+
Elasticity::AwsSession.any_instance.should_receive(:submit).and_return(aws_result)
|
81
|
+
subject.add_jobflow_steps('', []) do |result|
|
82
|
+
result.should == aws_result
|
88
83
|
end
|
89
84
|
end
|
90
85
|
end
|
91
86
|
|
92
87
|
end
|
93
88
|
|
94
|
-
describe '#
|
95
|
-
|
96
|
-
|
97
|
-
<<-XML
|
98
|
-
<DescribeJobFlowsResponse xmlns="http://elasticmapreduce.amazonaws.com/doc/2009-03-31">
|
99
|
-
<DescribeJobFlowsResult>
|
100
|
-
<JobFlows>
|
101
|
-
<member>
|
102
|
-
<ExecutionStatusDetail>
|
103
|
-
<CreationDateTime>2011-04-04T17:41:51Z</CreationDateTime>
|
104
|
-
<State>TERMINATED</State>
|
105
|
-
</ExecutionStatusDetail>
|
106
|
-
<JobFlowId>j-p</JobFlowId>
|
107
|
-
<Name>Pig Job</Name>
|
108
|
-
</member>
|
109
|
-
<member>
|
110
|
-
<ExecutionStatusDetail>
|
111
|
-
<State>TERMINATED</State>
|
112
|
-
<CreationDateTime>2011-04-04T17:41:51Z</CreationDateTime>
|
113
|
-
</ExecutionStatusDetail>
|
114
|
-
<JobFlowId>j-h</JobFlowId>
|
115
|
-
<Name>Hive Job</Name>
|
116
|
-
</member>
|
117
|
-
</JobFlows>
|
118
|
-
</DescribeJobFlowsResult>
|
119
|
-
</DescribeJobFlowsResponse>
|
120
|
-
XML
|
121
|
-
end
|
122
|
-
|
123
|
-
it 'should return an array of properly populated JobFlowStatusES' do
|
124
|
-
Elasticity::AwsSession.any_instance.should_receive(:submit).and_return(describe_jobflows_xml)
|
125
|
-
jobflow_statuses = subject.describe_jobflows
|
126
|
-
jobflow_statuses.map(&:name).should == ['Pig Job', 'Hive Job']
|
127
|
-
jobflow_statuses.map(&:class).should == [Elasticity::JobFlowStatus, Elasticity::JobFlowStatus]
|
128
|
-
end
|
129
|
-
|
130
|
-
it 'should describe all jobflows' do
|
89
|
+
describe '#add_tags' do
|
90
|
+
|
91
|
+
it 'should modify the jobflow tags' do
|
131
92
|
Elasticity::AwsSession.any_instance.should_receive(:submit).with({
|
132
|
-
|
133
|
-
|
134
|
-
|
93
|
+
:operation => 'AddTags',
|
94
|
+
:resource_id => 'JOBFLOW_ID',
|
95
|
+
:tags => [
|
96
|
+
{
|
97
|
+
:key => 'TEST_KEY',
|
98
|
+
:value => 'TEST_VALUE'
|
99
|
+
},
|
100
|
+
{
|
101
|
+
:key => 'TEST_KEY_ONLY'
|
102
|
+
}
|
103
|
+
]
|
104
|
+
})
|
105
|
+
subject.add_tags('JOBFLOW_ID', [{:key => 'TEST_KEY', :value => 'TEST_VALUE'}, {:key => 'TEST_KEY_ONLY'}])
|
135
106
|
end
|
136
107
|
|
137
|
-
context 'when
|
138
|
-
it 'should
|
139
|
-
Elasticity::AwsSession.any_instance.should_receive(:submit).
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
subject.describe_jobflows(:CreatedBefore => '2011-10-04')
|
108
|
+
context 'when a block is given' do
|
109
|
+
it 'should yield the submission results' do
|
110
|
+
Elasticity::AwsSession.any_instance.should_receive(:submit).and_return('RESULT')
|
111
|
+
subject.add_tags('', {}) do |result|
|
112
|
+
result.should == 'RESULT'
|
113
|
+
end
|
144
114
|
end
|
145
115
|
end
|
146
116
|
|
117
|
+
end
|
118
|
+
|
119
|
+
describe '#describe_cluster' do
|
120
|
+
|
121
|
+
let(:aws_result) {
|
122
|
+
<<-JSON
|
123
|
+
{"Key" : "Value"}
|
124
|
+
JSON
|
125
|
+
}
|
126
|
+
|
127
|
+
it 'should describe the specified jobflow' do
|
128
|
+
Elasticity::AwsSession.any_instance.should_receive(:submit).with({
|
129
|
+
:operation => 'DescribeCluster',
|
130
|
+
:cluster_id => 'CLUSTER_ID'
|
131
|
+
}).and_return(aws_result)
|
132
|
+
expect(subject.describe_cluster('CLUSTER_ID')).to eql(JSON.parse(aws_result))
|
133
|
+
end
|
134
|
+
|
147
135
|
context 'when a block is given' do
|
148
|
-
let(:result) { 'RESULT' }
|
149
136
|
it 'should yield the submission results' do
|
150
|
-
Elasticity::AwsSession.any_instance.should_receive(:submit).and_return(
|
151
|
-
subject.
|
152
|
-
|
137
|
+
Elasticity::AwsSession.any_instance.should_receive(:submit).and_return(aws_result)
|
138
|
+
subject.describe_cluster({}) do |result|
|
139
|
+
result.should == aws_result
|
153
140
|
end
|
154
141
|
end
|
155
142
|
end
|
156
143
|
|
157
144
|
end
|
158
145
|
|
159
|
-
describe '#
|
160
|
-
|
161
|
-
let(:
|
162
|
-
<<-
|
163
|
-
|
164
|
-
|
165
|
-
<JobFlows>
|
166
|
-
<member>
|
167
|
-
<JobFlowId>j-3UN6WX5RRO2AG</JobFlowId>
|
168
|
-
<Name>The One Job Flow</Name>
|
169
|
-
<ExecutionStatusDetail>
|
170
|
-
<State>TERMINATED</State>
|
171
|
-
<CreationDateTime>2011-04-04T17:41:51Z</CreationDateTime>
|
172
|
-
</ExecutionStatusDetail>
|
173
|
-
</member>
|
174
|
-
</JobFlows>
|
175
|
-
</DescribeJobFlowsResult>
|
176
|
-
</DescribeJobFlowsResponse>
|
177
|
-
XML
|
146
|
+
describe '#describe_step' do
|
147
|
+
|
148
|
+
let(:aws_result) {
|
149
|
+
<<-JSON
|
150
|
+
{"Key" : "Value"}
|
151
|
+
JSON
|
178
152
|
}
|
179
153
|
|
180
|
-
it 'should describe the specified jobflow' do
|
154
|
+
it 'should describe the specified step within the specified jobflow' do
|
181
155
|
Elasticity::AwsSession.any_instance.should_receive(:submit).with({
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
156
|
+
:operation => 'DescribeStep',
|
157
|
+
:cluster_id => 'CLUSTER_ID',
|
158
|
+
:step_id => 'STEP_ID'
|
159
|
+
}).and_return(aws_result)
|
160
|
+
expect(subject.describe_step('CLUSTER_ID', 'STEP_ID')).to eql(JSON.parse(aws_result))
|
161
|
+
end
|
162
|
+
|
163
|
+
context 'when a block is given' do
|
164
|
+
it 'should yield the submission results' do
|
165
|
+
Elasticity::AwsSession.any_instance.should_receive(:submit).and_return(aws_result)
|
166
|
+
subject.describe_step('', '') do |result|
|
167
|
+
result.should == aws_result
|
168
|
+
end
|
169
|
+
end
|
170
|
+
end
|
171
|
+
|
172
|
+
end
|
173
|
+
|
174
|
+
describe '#list_instance_groups' do
|
175
|
+
|
176
|
+
let(:aws_result) {
|
177
|
+
<<-JSON
|
178
|
+
{"Key" : "Value"}
|
179
|
+
JSON
|
180
|
+
}
|
181
|
+
|
182
|
+
it 'should list the instance groups in the specified jobflow' do
|
183
|
+
Elasticity::AwsSession.any_instance.should_receive(:submit).with({
|
184
|
+
:operation => 'ListInstanceGroups',
|
185
|
+
:cluster_id => 'CLUSTER_ID'
|
186
|
+
}).and_return(aws_result)
|
187
|
+
expect(subject.list_instance_groups('CLUSTER_ID')).to eql(JSON.parse(aws_result))
|
188
|
+
end
|
189
|
+
|
190
|
+
context 'when a block is given' do
|
191
|
+
it 'should yield the submission results' do
|
192
|
+
Elasticity::AwsSession.any_instance.should_receive(:submit).and_return(aws_result)
|
193
|
+
subject.list_instance_groups({}) do |result|
|
194
|
+
result.should == aws_result
|
195
|
+
end
|
196
|
+
end
|
186
197
|
end
|
187
198
|
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
199
|
+
end
|
200
|
+
|
201
|
+
describe '#list_bootstrap_actions' do
|
202
|
+
|
203
|
+
let(:aws_result) {
|
204
|
+
<<-JSON
|
205
|
+
{"Key" : "Value"}
|
206
|
+
JSON
|
207
|
+
}
|
208
|
+
|
209
|
+
it 'should list the bootstrap actions in the specified jobflow' do
|
210
|
+
Elasticity::AwsSession.any_instance.should_receive(:submit).with({
|
211
|
+
:operation => 'ListBootstrapActions',
|
212
|
+
:cluster_id => 'CLUSTER_ID'
|
213
|
+
}).and_return(aws_result)
|
214
|
+
expect(subject.list_bootstrap_actions('CLUSTER_ID')).to eql(JSON.parse(aws_result))
|
193
215
|
end
|
194
216
|
|
195
217
|
context 'when a block is given' do
|
196
|
-
let(:result) { 'RESULT' }
|
197
218
|
it 'should yield the submission results' do
|
198
|
-
Elasticity::AwsSession.any_instance.should_receive(:submit).and_return(
|
199
|
-
subject.
|
200
|
-
|
219
|
+
Elasticity::AwsSession.any_instance.should_receive(:submit).and_return(aws_result)
|
220
|
+
subject.list_bootstrap_actions({}) do |result|
|
221
|
+
result.should == aws_result
|
201
222
|
end
|
202
223
|
end
|
203
224
|
end
|
225
|
+
|
204
226
|
end
|
205
227
|
|
206
|
-
describe '#
|
228
|
+
describe '#list_clusters' do
|
207
229
|
|
208
230
|
before do
|
209
|
-
|
231
|
+
Timecop.freeze(Time.at(1302461096))
|
232
|
+
end
|
233
|
+
|
234
|
+
after do
|
235
|
+
Timecop.return
|
236
|
+
end
|
237
|
+
|
238
|
+
let(:aws_result) {
|
239
|
+
<<-JSON
|
240
|
+
{"Key" : "Value"}
|
241
|
+
JSON
|
242
|
+
}
|
243
|
+
|
244
|
+
context 'when no arguments are supplied' do
|
245
|
+
it 'should list all clusters' do
|
246
|
+
Elasticity::AwsSession.any_instance.should_receive(:submit).with({
|
247
|
+
:operation => 'ListClusters'
|
248
|
+
}).and_return(aws_result)
|
249
|
+
expect(subject.list_clusters).to eql(JSON.parse(aws_result))
|
250
|
+
end
|
251
|
+
end
|
252
|
+
|
253
|
+
context 'when statuses are given' do
|
254
|
+
it 'should list clusters with the specified status' do
|
255
|
+
Elasticity::AwsSession.any_instance.should_receive(:submit).with({
|
256
|
+
:operation => 'ListClusters',
|
257
|
+
:cluster_states => ['STATE1', 'STATE2']
|
258
|
+
}).and_return(aws_result)
|
259
|
+
expect(subject.list_clusters({:states => ['STATE1', 'STATE2']})).to eql(JSON.parse(aws_result))
|
260
|
+
end
|
261
|
+
end
|
262
|
+
|
263
|
+
context 'when a before date is given' do
|
264
|
+
it 'should list clusters created before that date' do
|
265
|
+
Elasticity::AwsSession.any_instance.should_receive(:submit).with({
|
266
|
+
:operation => 'ListClusters',
|
267
|
+
:created_before => 1302461096
|
268
|
+
}).and_return(aws_result)
|
269
|
+
expect(subject.list_clusters({:created_before => Time.now})).to eql(JSON.parse(aws_result))
|
270
|
+
end
|
271
|
+
end
|
272
|
+
|
273
|
+
context 'when an after date is given' do
|
274
|
+
it 'should list clusters created after that date' do
|
275
|
+
Elasticity::AwsSession.any_instance.should_receive(:submit).with({
|
276
|
+
:operation => 'ListClusters',
|
277
|
+
:created_after => 1302461096
|
278
|
+
}).and_return(aws_result)
|
279
|
+
expect(subject.list_clusters({:created_after => Time.now})).to eql(JSON.parse(aws_result))
|
280
|
+
end
|
281
|
+
end
|
282
|
+
|
283
|
+
context 'when a pagination token is specified' do
|
284
|
+
it 'should supply the appropriate page' do
|
285
|
+
Elasticity::AwsSession.any_instance.should_receive(:submit).with({
|
286
|
+
:operation => 'ListClusters',
|
287
|
+
:marker => 'MARKER'
|
288
|
+
}).and_return(aws_result)
|
289
|
+
expect(subject.list_clusters({:marker => 'MARKER'})).to eql(JSON.parse(aws_result))
|
290
|
+
end
|
291
|
+
end
|
292
|
+
|
293
|
+
context 'when a block is given' do
|
294
|
+
it 'should yield the submission results' do
|
295
|
+
Elasticity::AwsSession.any_instance.should_receive(:submit).and_return(aws_result)
|
296
|
+
subject.list_bootstrap_actions({}) do |result|
|
297
|
+
result.should == aws_result
|
298
|
+
end
|
299
|
+
end
|
300
|
+
end
|
301
|
+
|
302
|
+
end
|
303
|
+
|
304
|
+
describe '#list_instances' do
|
305
|
+
|
306
|
+
let(:aws_result) {
|
307
|
+
<<-JSON
|
308
|
+
{"Key" : "Value"}
|
309
|
+
JSON
|
310
|
+
}
|
311
|
+
|
312
|
+
context 'when no arguments are supplied' do
|
313
|
+
it 'should list all instances in the cluster' do
|
314
|
+
Elasticity::AwsSession.any_instance.should_receive(:submit).with({
|
315
|
+
:operation => 'ListInstances',
|
316
|
+
:cluster_id => 'CLUSTER_ID'
|
317
|
+
}).and_return(aws_result)
|
318
|
+
expect(subject.list_instances('CLUSTER_ID')).to eql(JSON.parse(aws_result))
|
319
|
+
end
|
320
|
+
end
|
321
|
+
|
322
|
+
context 'when an instance group is specified' do
|
323
|
+
it 'should list the instances in that group' do
|
324
|
+
Elasticity::AwsSession.any_instance.should_receive(:submit).with({
|
325
|
+
:operation => 'ListInstances',
|
326
|
+
:cluster_id => 'CLUSTER_ID',
|
327
|
+
:instance_group_id => 'INSTANCE_GROUP_ID'
|
328
|
+
}).and_return(aws_result)
|
329
|
+
expect(subject.list_instances('CLUSTER_ID', {:instance_group_id => 'INSTANCE_GROUP_ID'})).to eql(JSON.parse(aws_result))
|
330
|
+
end
|
331
|
+
end
|
332
|
+
|
333
|
+
context 'when instance types are specified' do
|
334
|
+
it 'should list the instances of that type' do
|
335
|
+
Elasticity::AwsSession.any_instance.should_receive(:submit).with({
|
336
|
+
:operation => 'ListInstances',
|
337
|
+
:cluster_id => 'CLUSTER_ID',
|
338
|
+
:instance_group_types => ['TYPE1', 'TYPE2']
|
339
|
+
}).and_return(aws_result)
|
340
|
+
expect(subject.list_instances('CLUSTER_ID', {:instance_group_types => ['TYPE1', 'TYPE2']})).to eql(JSON.parse(aws_result))
|
341
|
+
end
|
342
|
+
end
|
343
|
+
|
344
|
+
context 'when a pagination token is specified' do
|
345
|
+
it 'should supply the appropriate page' do
|
346
|
+
Elasticity::AwsSession.any_instance.should_receive(:submit).with({
|
347
|
+
:operation => 'ListInstances',
|
348
|
+
:cluster_id => 'CLUSTER_ID',
|
349
|
+
:marker => 'MARKER'
|
350
|
+
}).and_return(aws_result)
|
351
|
+
expect(subject.list_instances('CLUSTER_ID', {:marker => 'MARKER'})).to eql(JSON.parse(aws_result))
|
352
|
+
end
|
353
|
+
end
|
354
|
+
|
355
|
+
context 'when a block is given' do
|
356
|
+
it 'should yield the submission results' do
|
357
|
+
Elasticity::AwsSession.any_instance.should_receive(:submit).and_return(aws_result)
|
358
|
+
subject.list_instances({}) do |result|
|
359
|
+
result.should == aws_result
|
360
|
+
end
|
361
|
+
end
|
362
|
+
end
|
363
|
+
|
364
|
+
end
|
365
|
+
|
366
|
+
describe '#list_steps' do
|
367
|
+
|
368
|
+
let(:aws_result) {
|
369
|
+
<<-JSON
|
370
|
+
{"Key" : "Value"}
|
371
|
+
JSON
|
372
|
+
}
|
373
|
+
|
374
|
+
context 'when no arguments are supplied' do
|
375
|
+
it 'should list all steps in the cluster' do
|
376
|
+
Elasticity::AwsSession.any_instance.should_receive(:submit).with({
|
377
|
+
:operation => 'ListSteps',
|
378
|
+
:cluster_id => 'CLUSTER_ID'
|
379
|
+
}).and_return(aws_result)
|
380
|
+
expect(subject.list_steps('CLUSTER_ID')).to eql(JSON.parse(aws_result))
|
381
|
+
end
|
382
|
+
end
|
383
|
+
|
384
|
+
context 'when step IDs are specified' do
|
385
|
+
it 'should list the instances in that group' do
|
386
|
+
Elasticity::AwsSession.any_instance.should_receive(:submit).with({
|
387
|
+
:operation => 'ListSteps',
|
388
|
+
:cluster_id => 'CLUSTER_ID',
|
389
|
+
:step_ids => ['S-1', 'S-2']
|
390
|
+
}).and_return(aws_result)
|
391
|
+
expect(subject.list_steps('CLUSTER_ID', {:step_ids => ['S-1', 'S-2']})).to eql(JSON.parse(aws_result))
|
392
|
+
end
|
393
|
+
end
|
394
|
+
|
395
|
+
context 'when step states are specified' do
|
396
|
+
it 'should list the steps in that state' do
|
397
|
+
Elasticity::AwsSession.any_instance.should_receive(:submit).with({
|
398
|
+
:operation => 'ListSteps',
|
399
|
+
:cluster_id => 'CLUSTER_ID',
|
400
|
+
:step_states => ['STATE1', 'STATE2']
|
401
|
+
}).and_return(aws_result)
|
402
|
+
expect(subject.list_steps('CLUSTER_ID', {:step_states => ['STATE1', 'STATE2']})).to eql(JSON.parse(aws_result))
|
403
|
+
end
|
404
|
+
end
|
405
|
+
|
406
|
+
context 'when a pagination token is specified' do
|
407
|
+
it 'should supply the appropriate page' do
|
408
|
+
Elasticity::AwsSession.any_instance.should_receive(:submit).with({
|
409
|
+
:operation => 'ListSteps',
|
410
|
+
:cluster_id => 'CLUSTER_ID',
|
411
|
+
:marker => 'MARKER'
|
412
|
+
}).and_return(aws_result)
|
413
|
+
expect(subject.list_steps('CLUSTER_ID', {:marker => 'MARKER'})).to eql(JSON.parse(aws_result))
|
414
|
+
end
|
210
415
|
end
|
211
416
|
|
212
|
-
|
213
|
-
|
417
|
+
context 'when a block is given' do
|
418
|
+
it 'should yield the submission results' do
|
419
|
+
Elasticity::AwsSession.any_instance.should_receive(:submit).and_return(aws_result)
|
420
|
+
subject.list_steps({}) do |result|
|
421
|
+
result.should == aws_result
|
422
|
+
end
|
423
|
+
end
|
214
424
|
end
|
215
425
|
|
216
426
|
end
|
@@ -276,12 +486,24 @@ describe Elasticity::EMR do
|
|
276
486
|
|
277
487
|
describe '#terminate_jobflows' do
|
278
488
|
|
279
|
-
|
280
|
-
|
281
|
-
:
|
282
|
-
|
283
|
-
|
284
|
-
|
489
|
+
context 'when one jobflow is specified' do
|
490
|
+
it 'should terminate the jobflow' do
|
491
|
+
Elasticity::AwsSession.any_instance.should_receive(:submit).with({
|
492
|
+
:operation => 'TerminateJobFlows',
|
493
|
+
:job_flow_ids => ['j-1']
|
494
|
+
})
|
495
|
+
subject.terminate_jobflows(['j-1'])
|
496
|
+
end
|
497
|
+
end
|
498
|
+
|
499
|
+
context 'when more then one jobflow is specified' do
|
500
|
+
it 'should terminate all of the jobflows' do
|
501
|
+
Elasticity::AwsSession.any_instance.should_receive(:submit).with({
|
502
|
+
:operation => 'TerminateJobFlows',
|
503
|
+
:job_flow_ids => ['j-1', 'j-2']
|
504
|
+
})
|
505
|
+
subject.terminate_jobflows(['j-1', 'j-2'])
|
506
|
+
end
|
285
507
|
end
|
286
508
|
|
287
509
|
context 'when a block is given' do
|
@@ -296,6 +518,28 @@ describe Elasticity::EMR do
|
|
296
518
|
|
297
519
|
end
|
298
520
|
|
521
|
+
describe '#remove_tags' do
|
522
|
+
|
523
|
+
it 'should remove the jobflow tags' do
|
524
|
+
Elasticity::AwsSession.any_instance.should_receive(:submit).with({
|
525
|
+
:operation => 'RemoveTags',
|
526
|
+
:resource_id => 'JOBFLOW_ID',
|
527
|
+
:tag_keys => ['TEST_KEY', 'TEST_KEY_ONLY']
|
528
|
+
})
|
529
|
+
subject.remove_tags('JOBFLOW_ID', ['TEST_KEY', 'TEST_KEY_ONLY'])
|
530
|
+
end
|
531
|
+
|
532
|
+
context 'when a block is given' do
|
533
|
+
it 'should yield the submission results' do
|
534
|
+
Elasticity::AwsSession.any_instance.should_receive(:submit).and_return('RESULT')
|
535
|
+
subject.remove_tags('', {}) do |result|
|
536
|
+
result.should == 'RESULT'
|
537
|
+
end
|
538
|
+
end
|
539
|
+
end
|
540
|
+
|
541
|
+
end
|
542
|
+
|
299
543
|
describe '#set_termination_protection' do
|
300
544
|
|
301
545
|
context 'when protection is enabled' do
|
@@ -343,6 +587,53 @@ describe Elasticity::EMR do
|
|
343
587
|
|
344
588
|
end
|
345
589
|
|
590
|
+
describe '#set_visible_to_all_users' do
|
591
|
+
|
592
|
+
context 'when visibility is enabled' do
|
593
|
+
it 'should enable visibility on the specified jobflows' do
|
594
|
+
Elasticity::AwsSession.any_instance.should_receive(:submit).with({
|
595
|
+
:operation => 'SetVisibleToAllUsers',
|
596
|
+
:visible_to_all_users => true,
|
597
|
+
:job_flow_ids => ['jobflow1', 'jobflow2']
|
598
|
+
})
|
599
|
+
subject.set_visible_to_all_users(['jobflow1', 'jobflow2'], true)
|
600
|
+
end
|
601
|
+
end
|
602
|
+
|
603
|
+
context 'when visibility is disabled' do
|
604
|
+
it 'should disable protection on the specified jobflows' do
|
605
|
+
Elasticity::AwsSession.any_instance.should_receive(:submit).with({
|
606
|
+
:operation => 'SetVisibleToAllUsers',
|
607
|
+
:visible_to_all_users => false,
|
608
|
+
:job_flow_ids => ['jobflow1', 'jobflow2']
|
609
|
+
})
|
610
|
+
subject.set_visible_to_all_users(['jobflow1', 'jobflow2'], false)
|
611
|
+
end
|
612
|
+
end
|
613
|
+
|
614
|
+
context 'when visibility is not specified' do
|
615
|
+
it 'should enable protection on the specified jobflows' do
|
616
|
+
Elasticity::AwsSession.any_instance.should_receive(:submit).with({
|
617
|
+
:operation => 'SetVisibleToAllUsers',
|
618
|
+
:visible_to_all_users => true,
|
619
|
+
:job_flow_ids => ['jobflow1', 'jobflow2']
|
620
|
+
})
|
621
|
+
subject.set_visible_to_all_users(['jobflow1', 'jobflow2'])
|
622
|
+
end
|
623
|
+
end
|
624
|
+
|
625
|
+
context 'when a block is given' do
|
626
|
+
let(:aws_response) { '_' }
|
627
|
+
it 'should yield the termination results' do
|
628
|
+
Elasticity::AwsSession.any_instance.should_receive(:submit).and_return(aws_response)
|
629
|
+
subject.set_visible_to_all_users([]) do |result|
|
630
|
+
result.should == '_'
|
631
|
+
end
|
632
|
+
end
|
633
|
+
end
|
634
|
+
|
635
|
+
end
|
636
|
+
|
346
637
|
describe '#direct' do
|
347
638
|
let(:params) { {:foo => 'bar'} }
|
348
639
|
|
@@ -353,11 +644,10 @@ describe Elasticity::EMR do
|
|
353
644
|
end
|
354
645
|
|
355
646
|
describe '#==' do
|
356
|
-
let(:emr1) { Elasticity::EMR.new(
|
357
|
-
let(:emr2) { Elasticity::EMR.new('ACCESS2', 'SECRET2') }
|
647
|
+
let(:emr1) { Elasticity::EMR.new(:region => 'TEST_REGION1') }
|
358
648
|
|
359
649
|
let(:same_object) { emr1 }
|
360
|
-
let(:same_values) { Elasticity::EMR.new(
|
650
|
+
let(:same_values) { Elasticity::EMR.new(:region => 'TEST_REGION1') }
|
361
651
|
let(:diff_type) { Object.new }
|
362
652
|
|
363
653
|
it 'should pass comparison checks' do
|