awsum 0.5 → 0.5.1
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile +1 -1
- data/Gemfile.lock +14 -20
- data/README.rdoc +1 -1
- data/Rakefile +3 -3
- data/functional/ec2/instances_spec.rb +46 -0
- data/functional/spec_helper.rb +71 -0
- data/lib/awsum.rb +2 -2
- data/lib/awsum/ec2.rb +85 -68
- data/lib/awsum/ec2/image.rb +1 -1
- data/lib/awsum/ec2/instance.rb +35 -6
- data/lib/awsum/ec2/parsers/image_parser.rb +3 -5
- data/lib/awsum/ec2/parsers/instance_parser.rb +24 -15
- data/lib/awsum/ec2/parsers/snapshot_parser.rb +3 -3
- data/lib/awsum/ec2/parsers/tag_parser.rb +56 -0
- data/lib/awsum/ec2/parsers/volume_parser.rb +3 -5
- data/lib/awsum/ec2/region.rb +8 -5
- data/lib/awsum/ec2/security_group.rb +12 -16
- data/lib/awsum/ec2/snapshot.rb +9 -0
- data/lib/awsum/ec2/state.rb +22 -0
- data/lib/awsum/ec2/tag.rb +17 -0
- data/lib/awsum/ec2/volume.rb +12 -2
- data/lib/awsum/requestable.rb +53 -3
- data/spec/fixtures/ec2/authorize_group_access.xml +12 -0
- data/spec/fixtures/ec2/create_security_group.xml +3 -3
- data/spec/fixtures/ec2/delete_security_group.xml +3 -3
- data/spec/fixtures/ec2/purchase_reserved_instances_offering2.xml +5 -0
- data/spec/fixtures/ec2/tags.xml +12 -0
- data/spec/lib/awsum/ec2/image_spec.rb +60 -0
- data/spec/lib/awsum/ec2/instance_spec.rb +39 -1
- data/spec/lib/awsum/ec2/parsers/instance_parser_spec.rb +4 -3
- data/spec/lib/awsum/ec2/parsers/tag_parser_spec.rb +29 -0
- data/spec/lib/awsum/ec2/region_spec.rb +31 -2
- data/spec/lib/awsum/ec2/reserved_instance_spec.rb +3 -19
- data/spec/lib/awsum/ec2/security_group_spec.rb +123 -51
- data/spec/lib/awsum/ec2/snapshots_spec.rb +27 -1
- data/spec/lib/awsum/ec2/state_spec.rb +11 -0
- data/spec/lib/awsum/ec2/tag_spec.rb +45 -0
- data/spec/lib/awsum/ec2/volume_spec.rb +47 -0
- data/spec/lib/awsum/requestable_spec.rb +1 -1
- data/tools/dump.rb +55 -0
- metadata +176 -32
- data/.gitignore +0 -5
- data/spec/fixtures/ec2/purchase_reserved_instances_offerings.xml +0 -6
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -2,30 +2,24 @@ GEM
|
|
2
2
|
remote: http://rubygems.org/
|
3
3
|
specs:
|
4
4
|
diff-lcs (1.1.2)
|
5
|
-
fakeweb (1.
|
6
|
-
gemcutter (0.6.1)
|
5
|
+
fakeweb (1.3.0)
|
7
6
|
git (1.2.5)
|
8
|
-
jeweler (1.
|
9
|
-
|
7
|
+
jeweler (1.5.2)
|
8
|
+
bundler (~> 1.0.0)
|
10
9
|
git (>= 1.2.5)
|
11
|
-
|
12
|
-
|
13
|
-
mocha (0.9.8)
|
10
|
+
rake
|
11
|
+
mocha (0.9.10)
|
14
12
|
rake
|
15
13
|
rake (0.8.7)
|
16
14
|
rcov (0.9.9)
|
17
|
-
rspec (2.
|
18
|
-
rspec-core (
|
19
|
-
rspec-expectations (
|
20
|
-
rspec-mocks (
|
21
|
-
rspec-core (2.
|
22
|
-
rspec-expectations (2.
|
23
|
-
diff-lcs (
|
24
|
-
rspec-mocks (2.
|
25
|
-
rspec-core (= 2.0.0.beta.22)
|
26
|
-
rspec-expectations (= 2.0.0.beta.22)
|
27
|
-
rubyforge (2.0.4)
|
28
|
-
json_pure (>= 1.1.7)
|
15
|
+
rspec (2.4.0)
|
16
|
+
rspec-core (~> 2.4.0)
|
17
|
+
rspec-expectations (~> 2.4.0)
|
18
|
+
rspec-mocks (~> 2.4.0)
|
19
|
+
rspec-core (2.4.0)
|
20
|
+
rspec-expectations (2.4.0)
|
21
|
+
diff-lcs (~> 1.1.2)
|
22
|
+
rspec-mocks (2.4.0)
|
29
23
|
shoulda (2.11.3)
|
30
24
|
timecop (0.3.5)
|
31
25
|
|
@@ -39,6 +33,6 @@ DEPENDENCIES
|
|
39
33
|
mocha
|
40
34
|
rake
|
41
35
|
rcov
|
42
|
-
rspec (>= 2.0.0
|
36
|
+
rspec (>= 2.0.0)
|
43
37
|
shoulda
|
44
38
|
timecop
|
data/README.rdoc
CHANGED
@@ -16,7 +16,7 @@ allowing you to work with objects in a very natural way.
|
|
16
16
|
|
17
17
|
==Working with different Regions
|
18
18
|
You can use blocks to wrap your calls for a specific Region
|
19
|
-
ec2.region('eu-west-1')
|
19
|
+
ec2.region('eu-west-1') do
|
20
20
|
#Run an instance in the eu-west-1 region
|
21
21
|
run_instance(...)
|
22
22
|
end
|
data/Rakefile
CHANGED
@@ -43,7 +43,7 @@ end
|
|
43
43
|
desc 'Start an IRB session with all necessary files required.'
|
44
44
|
task :shell do |t|
|
45
45
|
chdir File.dirname(__FILE__)
|
46
|
-
exec 'irb -I lib/ -
|
46
|
+
exec 'irb -I lib/ -r rubygems -r awsum/ec2 -r awsum/s3'
|
47
47
|
end
|
48
48
|
|
49
49
|
desc 'Generate documentation.'
|
@@ -64,12 +64,12 @@ end
|
|
64
64
|
|
65
65
|
require 'rspec/core/rake_task'
|
66
66
|
RSpec::Core::RakeTask.new do |t|
|
67
|
-
t.pattern = "./spec
|
67
|
+
t.pattern = "./spec/**/*_spec.rb"
|
68
68
|
end
|
69
69
|
|
70
70
|
namespace :spec do
|
71
71
|
desc "Run RSpec integration code examples (LIVE runs against Amazon AWS)"
|
72
72
|
RSpec::Core::RakeTask.new(:integration) do |t|
|
73
|
-
t.pattern = "./
|
73
|
+
t.pattern = "./functional/**/*_spec.rb"
|
74
74
|
end
|
75
75
|
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), '../spec_helper')
|
2
|
+
|
3
|
+
functional "Instances" do
|
4
|
+
let(:ec2) { Awsum::Ec2.new(access_key, secret_key) }
|
5
|
+
|
6
|
+
it "should succeed" do
|
7
|
+
image = run "retrieving an image" do
|
8
|
+
images = ec2.images(:filter => {:architecture => 'i386', :name => '*ubuntu*', 'image-type' => 'machine', :state => 'available'})
|
9
|
+
images[0]
|
10
|
+
end
|
11
|
+
|
12
|
+
instance = run "launching an instance of #{image.id}" do
|
13
|
+
instances = image.run :instance_type => 't1.micro', :tags => {'Name' => 'awsum.test'}
|
14
|
+
instances[0]
|
15
|
+
end
|
16
|
+
|
17
|
+
wait_for instance, 'running'
|
18
|
+
|
19
|
+
volume = run "attaching a volume to instance #{instance.id}" do
|
20
|
+
instance.create_volume(5, :device => '/dev/sdh', :tags => {'Name' => 'awsum.test'})
|
21
|
+
end
|
22
|
+
wait_for volume, 'in-use'
|
23
|
+
|
24
|
+
snapshot = run "taking a snapshot of volume #{volume.id}" do
|
25
|
+
volume.create_snapshot :tags => {'Name' => 'awsum.test'}
|
26
|
+
end
|
27
|
+
wait_for snapshot, 'completed'
|
28
|
+
|
29
|
+
run "deleting snapshot #{snapshot.id}" do
|
30
|
+
snapshot.delete
|
31
|
+
end
|
32
|
+
|
33
|
+
run "detaching volue #{volume.id}" do
|
34
|
+
volume.detach
|
35
|
+
end
|
36
|
+
wait_for volume, 'available'
|
37
|
+
|
38
|
+
run "deleting volue #{volume.id}" do
|
39
|
+
volume.delete
|
40
|
+
end
|
41
|
+
|
42
|
+
run "terminating instance #{instance.id}" do
|
43
|
+
instance.terminate
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
2
|
+
require 'awsum/ec2'
|
3
|
+
require 'awsum/s3'
|
4
|
+
|
5
|
+
def functional(description, &block)
|
6
|
+
describe "Functional: #{description}" do
|
7
|
+
let(:keys) do
|
8
|
+
rc_file = File.join(File.expand_path('~'), '.awsumrc')
|
9
|
+
unless File.exists?(rc_file)
|
10
|
+
raise 'Unable to run functional specs with out access and secret keys. Place them in ~/.awsumrc'
|
11
|
+
end
|
12
|
+
YAML.load(File.read(rc_file))
|
13
|
+
end
|
14
|
+
|
15
|
+
let(:access_key) { keys['access_key'] }
|
16
|
+
let(:secret_key) { keys['secret_key'] }
|
17
|
+
|
18
|
+
instance_eval(&block)
|
19
|
+
|
20
|
+
after(:all) do
|
21
|
+
ec2.instances(:filter => {'instance-state-name' => ['running', 'stopped']},
|
22
|
+
:tags => {'Name' => 'awsum.test'}).each do |instance|
|
23
|
+
begin
|
24
|
+
instance.terminate
|
25
|
+
wait_for instance, 'terminated'
|
26
|
+
rescue
|
27
|
+
puts "Could not terminate instance #{instance.id}"
|
28
|
+
puts $!.inspect
|
29
|
+
puts $!.backtrace
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
ec2.volumes(:filter => {'status' => ['available', 'in-use']},
|
34
|
+
:tags => {'Name' => 'awsum.test'}).each do |volume|
|
35
|
+
begin
|
36
|
+
volume.delete!
|
37
|
+
rescue
|
38
|
+
puts "Could not delete volume #{volume.id}"
|
39
|
+
puts $!.inspect
|
40
|
+
puts $!.backtrace
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
ec2.snapshots(:filter => {'status' => ['pending', 'completed']},
|
45
|
+
:tags => {'Name' => 'awsum.test'}).each do |snapshot|
|
46
|
+
begin
|
47
|
+
snapshot.delete
|
48
|
+
rescue
|
49
|
+
puts "Could not delete snapshot #{snapshot.id}"
|
50
|
+
puts $!.inspect
|
51
|
+
puts $!.backtrace
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
def run(description, &block)
|
59
|
+
puts description
|
60
|
+
yield
|
61
|
+
end
|
62
|
+
|
63
|
+
def wait_for(object, state = 'available')
|
64
|
+
print "waiting for #{state} on #{object.class}(#{object.id}) "
|
65
|
+
while (object.respond_to?(:state) ? object.state : object.status) != state
|
66
|
+
sleep 1
|
67
|
+
object.reload
|
68
|
+
print '.'
|
69
|
+
end
|
70
|
+
puts
|
71
|
+
end
|
data/lib/awsum.rb
CHANGED
data/lib/awsum/ec2.rb
CHANGED
@@ -9,6 +9,8 @@ require 'awsum/ec2/reserved_instance'
|
|
9
9
|
require 'awsum/ec2/reserved_instances_offering'
|
10
10
|
require 'awsum/ec2/security_group'
|
11
11
|
require 'awsum/ec2/snapshot'
|
12
|
+
require 'awsum/ec2/state'
|
13
|
+
require 'awsum/ec2/tag'
|
12
14
|
require 'awsum/ec2/volume'
|
13
15
|
|
14
16
|
module Awsum
|
@@ -68,6 +70,8 @@ module Awsum
|
|
68
70
|
# * <tt>:image_ids</tt> - array of Image id's, default: []
|
69
71
|
# * <tt>:owners</tt> - array of owner id's, default: []
|
70
72
|
# * <tt>:executable_by</tt> - array of user id's who have executable permission, default: []
|
73
|
+
# * <tt>:filter</tt> - hash of filters (e.g. :filter => {:architecture => 'i386'})
|
74
|
+
# * <tt>:tags</tt> - hash of tags (e.g. :tags => {:name => 'Test'})
|
71
75
|
def images(options = {})
|
72
76
|
options = {:image_ids => [], :owners => [], :executable_by => []}.merge(options)
|
73
77
|
action = 'DescribeImages'
|
@@ -78,6 +82,7 @@ module Awsum
|
|
78
82
|
params.merge!(array_to_params(options[:image_ids], "ImageId"))
|
79
83
|
params.merge!(array_to_params(options[:owners], "Owner"))
|
80
84
|
params.merge!(array_to_params(options[:executable_by], "ExecutableBy"))
|
85
|
+
params.merge!(parse_filters(options[:filter], options[:tags]))
|
81
86
|
|
82
87
|
response = send_query_request(params)
|
83
88
|
parser = Awsum::Ec2::ImageParser.new(self)
|
@@ -85,8 +90,8 @@ module Awsum
|
|
85
90
|
end
|
86
91
|
|
87
92
|
# Retrieve all Image(s) owned by you
|
88
|
-
def my_images
|
89
|
-
images :owners => 'self'
|
93
|
+
def my_images(options = {})
|
94
|
+
images options.merge(:owners => 'self')
|
90
95
|
end
|
91
96
|
|
92
97
|
# Retrieve a single Image
|
@@ -160,17 +165,27 @@ module Awsum
|
|
160
165
|
|
161
166
|
response = send_query_request(params)
|
162
167
|
parser = Awsum::Ec2::InstanceParser.new(self)
|
163
|
-
parser.parse(response.body)
|
168
|
+
instances = parser.parse(response.body)
|
169
|
+
if options[:tags] && options[:tags].size > 0
|
170
|
+
create_tags instances.map{|i| i.id}, options[:tags]
|
171
|
+
end
|
172
|
+
instances
|
164
173
|
end
|
165
174
|
alias_method :launch_instances, :run_instances
|
166
175
|
|
167
176
|
#Retrieve the information on a number of Instance(s)
|
177
|
+
#
|
178
|
+
# ===Options:
|
179
|
+
# * <tt>:filter</tt> - hash of filters (e.g. :filter => {:architecture => 'i386'})
|
180
|
+
# * <tt>:tags</tt> - hash of tags (e.g. :tags => {:name => 'Test'})
|
168
181
|
def instances(*instance_ids)
|
182
|
+
options = instance_ids[-1].respond_to?(:keys) ? instance_ids.pop : {}
|
169
183
|
action = 'DescribeInstances'
|
170
184
|
params = {
|
171
185
|
'Action' => action
|
172
186
|
}
|
173
187
|
params.merge!(array_to_params(instance_ids, 'InstanceId'))
|
188
|
+
params.merge!(parse_filters(options[:filter], options[:tags]))
|
174
189
|
|
175
190
|
response = send_query_request(params)
|
176
191
|
parser = Awsum::Ec2::InstanceParser.new(self)
|
@@ -219,13 +234,43 @@ module Awsum
|
|
219
234
|
response.is_a?(Net::HTTPSuccess)
|
220
235
|
end
|
221
236
|
|
237
|
+
def tags(filter = {})
|
238
|
+
action = 'DescribeTags'
|
239
|
+
params = {
|
240
|
+
'Action' => action
|
241
|
+
}
|
242
|
+
params.merge!(parse_filters(filter))
|
243
|
+
|
244
|
+
response = send_query_request(params)
|
245
|
+
parser = Awsum::Ec2::TagParser.new(self)
|
246
|
+
parser.parse(response.body)
|
247
|
+
end
|
248
|
+
|
249
|
+
def create_tags(resource_ids, tags)
|
250
|
+
action = 'CreateTags'
|
251
|
+
params = {
|
252
|
+
'Action' => action
|
253
|
+
}
|
254
|
+
params.merge!(array_to_params(resource_ids, 'ResourceId'))
|
255
|
+
params.merge!(parse_tag_keys(tags))
|
256
|
+
|
257
|
+
response = send_query_request(params)
|
258
|
+
response.is_a?(Net::HTTPSuccess)
|
259
|
+
end
|
260
|
+
|
222
261
|
#Retrieve the information on a number of Volume(s)
|
262
|
+
#
|
263
|
+
# ===Options:
|
264
|
+
# * <tt>:filter</tt> - hash of filters (e.g. :filter => {'attachment.status' => 'attached'})
|
265
|
+
# * <tt>:tags</tt> - hash of tags (e.g. :tags => {:name => 'Test'})
|
223
266
|
def volumes(*volume_ids)
|
267
|
+
options = volume_ids[-1].respond_to?(:keys) ? volume_ids.pop : {}
|
224
268
|
action = 'DescribeVolumes'
|
225
269
|
params = {
|
226
270
|
'Action' => action
|
227
271
|
}
|
228
272
|
params.merge!(array_to_params(volume_ids, 'VolumeId'))
|
273
|
+
params.merge!(parse_filters(options[:filter], options[:tags]))
|
229
274
|
|
230
275
|
response = send_query_request(params)
|
231
276
|
parser = Awsum::Ec2::VolumeParser.new(self)
|
@@ -256,7 +301,11 @@ module Awsum
|
|
256
301
|
|
257
302
|
response = send_query_request(params)
|
258
303
|
parser = Awsum::Ec2::VolumeParser.new(self)
|
259
|
-
parser.parse(response.body)[0]
|
304
|
+
volume = parser.parse(response.body)[0]
|
305
|
+
if options[:tags] && options[:tags].size > 0
|
306
|
+
create_tags volume.id, options[:tags]
|
307
|
+
end
|
308
|
+
volume
|
260
309
|
end
|
261
310
|
|
262
311
|
# Attach a volume to an instance
|
@@ -306,25 +355,36 @@ module Awsum
|
|
306
355
|
end
|
307
356
|
|
308
357
|
# Create a Snapshot of a Volume
|
309
|
-
|
358
|
+
#
|
359
|
+
# ===Options:
|
360
|
+
# :description => A description for the stapshot
|
361
|
+
# :tags => A hash of tags to be associated with the snapshot
|
362
|
+
def create_snapshot(volume_id, options = {})
|
310
363
|
action = 'CreateSnapshot'
|
311
364
|
params = {
|
312
365
|
'Action' => action,
|
313
366
|
'VolumeId' => volume_id
|
314
367
|
}
|
368
|
+
params['Description'] = options[:description] unless options[:description].blank?
|
315
369
|
|
316
370
|
response = send_query_request(params)
|
317
371
|
parser = Awsum::Ec2::SnapshotParser.new(self)
|
318
|
-
parser.parse(response.body)[0]
|
372
|
+
snapshot = parser.parse(response.body)[0]
|
373
|
+
if options[:tags] && options[:tags].size > 0
|
374
|
+
create_tags snapshot.id, options[:tags]
|
375
|
+
end
|
376
|
+
snapshot
|
319
377
|
end
|
320
378
|
|
321
379
|
# List Snapshot(s)
|
322
380
|
def snapshots(*snapshot_ids)
|
381
|
+
options = snapshot_ids[-1].respond_to?(:keys) ? snapshot_ids.pop : {}
|
323
382
|
action = 'DescribeSnapshots'
|
324
383
|
params = {
|
325
384
|
'Action' => action
|
326
385
|
}
|
327
386
|
params.merge!(array_to_params(snapshot_ids, 'SnapshotId'))
|
387
|
+
params.merge!(parse_filters(options[:filter], options[:tags]))
|
328
388
|
|
329
389
|
response = send_query_request(params)
|
330
390
|
parser = Awsum::Ec2::SnapshotParser.new(self)
|
@@ -574,39 +634,21 @@ module Awsum
|
|
574
634
|
|
575
635
|
# Authorize access on a specific security group
|
576
636
|
#
|
577
|
-
# ===
|
637
|
+
# ===Usage
|
578
638
|
# ====User/Group access
|
579
|
-
#
|
580
|
-
# * <tt>:source_security_group_owner_id</tt> - Owner of the security group to authorize access to when operating on a user/group pair
|
639
|
+
# ec2.authorize_security_group_ingress('security_group', {:ip_protocol => :tcp, :from_port => 80, :to_port => 80, :groups => [{:group_name => :authorized_group}]})
|
581
640
|
# ====CIDR IP access
|
582
|
-
#
|
583
|
-
|
584
|
-
|
585
|
-
|
586
|
-
def authorize_security_group_ingress(group_name, options = {})
|
587
|
-
got_at_least_one_user_group_option = !options[:source_security_group_name].nil? || !options[:source_security_group_owner_id].nil?
|
588
|
-
got_user_group_options = !options[:source_security_group_name].nil? && !options[:source_security_group_owner_id].nil?
|
589
|
-
got_at_least_one_cidr_option = !options[:ip_protocol].nil? || !options[:from_port].nil? || !options[:to_port].nil? || !options[:cidr_ip].nil?
|
590
|
-
#Add in defaults
|
591
|
-
options = {:cidr_ip => '0.0.0.0/0'}.merge(options) if got_at_least_one_cidr_option
|
592
|
-
options = {:ip_protocol => 'tcp'}.merge(options) if got_at_least_one_cidr_option
|
593
|
-
got_cidr_options = !options[:ip_protocol].nil? && !options[:from_port].nil? && !options[:to_port].nil? && !options[:cidr_ip].nil?
|
594
|
-
raise ArgumentError.new('Can only authorize user/group or CIDR IP, not both') if got_at_least_one_user_group_option && got_at_least_one_cidr_option
|
595
|
-
raise ArgumentError.new('Need all user/group options when authorizing user/group access') if got_at_least_one_user_group_option && !got_user_group_options
|
596
|
-
raise ArgumentError.new('Need all CIDR IP options when authorizing CIDR IP access') if got_at_least_one_cidr_option && !got_cidr_options
|
597
|
-
raise ArgumentError.new('ip_protocol can only be one of tcp, udp or icmp') if got_at_least_one_cidr_option && !%w(tcp udp icmp).detect{|p| p == options[:ip_protocol] }
|
641
|
+
# ec2.authorize_security_group_ingress('security_group', {:ip_protocol => :tcp, :from_port => 80, :to_port => 80, :ip_ranges => [{:cidr_ip => '0.0.0.0/0'}]})
|
642
|
+
def authorize_security_group_ingress(group_name, arguments)
|
643
|
+
raise ArgumentError.new('Can only authorize user/group or CIDR IP, not both') if [arguments].flatten.detect{|a| a.has_key?(:ip_ranges) && a.has_key?(:groups)}
|
644
|
+
raise ArgumentError.new('ip_protocol can only be one of tcp, udp or icmp') if [arguments].flatten.detect{|a| !%w(tcp udp icmp).detect{|p| p == a[:ip_protocol].to_s } }
|
598
645
|
|
599
646
|
action = 'AuthorizeSecurityGroupIngress'
|
600
647
|
params = {
|
601
648
|
'Action' => action,
|
602
649
|
'GroupName' => group_name
|
603
650
|
}
|
604
|
-
params
|
605
|
-
params['SourceSecurityGroupOwnerId'] = options[:source_security_group_owner_id] unless options[:source_security_group_owner_id].nil?
|
606
|
-
params['IpProtocol'] = options[:ip_protocol] unless options[:ip_protocol].nil?
|
607
|
-
params['FromPort'] = options[:from_port] unless options[:from_port].nil?
|
608
|
-
params['ToPort'] = options[:to_port] unless options[:to_port].nil?
|
609
|
-
params['CidrIp'] = options[:cidr_ip] unless options[:cidr_ip].nil?
|
651
|
+
params.merge!(array_to_params(arguments, 'IpPermissions'))
|
610
652
|
|
611
653
|
response = send_query_request(params)
|
612
654
|
response.is_a?(Net::HTTPSuccess)
|
@@ -614,39 +656,21 @@ module Awsum
|
|
614
656
|
|
615
657
|
# Revoke access on a specific SecurityGroup
|
616
658
|
#
|
617
|
-
# ===
|
659
|
+
# ===Usage
|
618
660
|
# ====User/Group access
|
619
|
-
#
|
620
|
-
# * <tt>:source_security_group_owner_id</tt> - Owner of the security group to authorize access to when operating on a user/group pair
|
661
|
+
# ec2.revoke_security_group_ingress('security_group', {:ip_protocol => :tcp, :from_port => 80, :to_port => 80, :groups => [{:group_name => :revoked_group}]})
|
621
662
|
# ====CIDR IP access
|
622
|
-
#
|
623
|
-
|
624
|
-
|
625
|
-
|
626
|
-
def revoke_security_group_ingress(group_name, options = {})
|
627
|
-
got_at_least_one_user_group_option = !options[:source_security_group_name].nil? || !options[:source_security_group_owner_id].nil?
|
628
|
-
got_user_group_options = !options[:source_security_group_name].nil? && !options[:source_security_group_owner_id].nil?
|
629
|
-
got_at_least_one_cidr_option = !options[:ip_protocol].nil? || !options[:from_port].nil? || !options[:to_port].nil? || !options[:cidr_ip].nil?
|
630
|
-
#Add in defaults
|
631
|
-
options = {:cidr_ip => '0.0.0.0/0'}.merge(options) if got_at_least_one_cidr_option
|
632
|
-
options = {:ip_protocol => 'tcp'}.merge(options) if got_at_least_one_cidr_option
|
633
|
-
got_cidr_options = !options[:ip_protocol].nil? && !options[:from_port].nil? && !options[:to_port].nil? && !options[:cidr_ip].nil?
|
634
|
-
raise ArgumentError.new('Can only authorize user/group or CIDR IP, not both') if got_at_least_one_user_group_option && got_at_least_one_cidr_option
|
635
|
-
raise ArgumentError.new('Need all user/group options when revoking user/group access') if got_at_least_one_user_group_option && !got_user_group_options
|
636
|
-
raise ArgumentError.new('Need all CIDR IP options when revoking CIDR IP access') if got_at_least_one_cidr_option && !got_cidr_options
|
637
|
-
raise ArgumentError.new('ip_protocol can only be one of tcp, udp or icmp') if got_at_least_one_cidr_option && !%w(tcp udp icmp).detect{|p| p == options[:ip_protocol] }
|
663
|
+
# ec2.revoke_security_group_ingress('security_group', {:ip_protocol => :tcp, :from_port => 80, :to_port => 80, :ip_ranges => [{:cidr_ip => '0.0.0.0/0'}]})
|
664
|
+
def revoke_security_group_ingress(group_name, arguments)
|
665
|
+
raise ArgumentError.new('Can only authorize user/group or CIDR IP, not both') if [arguments].flatten.detect{|a| a.has_key?(:ip_ranges) && a.has_key?(:groups)}
|
666
|
+
raise ArgumentError.new('ip_protocol can only be one of tcp, udp or icmp') if [arguments].flatten.detect{|a| !%w(tcp udp icmp).detect{|p| p == a[:ip_protocol].to_s } }
|
638
667
|
|
639
668
|
action = 'RevokeSecurityGroupIngress'
|
640
669
|
params = {
|
641
670
|
'Action' => action,
|
642
671
|
'GroupName' => group_name
|
643
672
|
}
|
644
|
-
params
|
645
|
-
params['SourceSecurityGroupOwnerId'] = options[:source_security_group_owner_id] unless options[:source_security_group_owner_id].nil?
|
646
|
-
params['IpProtocol'] = options[:ip_protocol] unless options[:ip_protocol].nil?
|
647
|
-
params['FromPort'] = options[:from_port] unless options[:from_port].nil?
|
648
|
-
params['ToPort'] = options[:to_port] unless options[:to_port].nil?
|
649
|
-
params['CidrIp'] = options[:cidr_ip] unless options[:cidr_ip].nil?
|
673
|
+
params.merge!(array_to_params(arguments, 'IpPermissions'))
|
650
674
|
|
651
675
|
response = send_query_request(params)
|
652
676
|
response.is_a?(Net::HTTPSuccess)
|
@@ -686,29 +710,22 @@ module Awsum
|
|
686
710
|
# Purchase reserved instances
|
687
711
|
#
|
688
712
|
# ===Options:
|
689
|
-
# * <tt>:
|
690
|
-
# * <tt>:
|
713
|
+
# * <tt>:reserved_instances_offering_id</tt> - A single reserved instance offering id
|
714
|
+
# * <tt>:instance_count</tt> - A number of reserved instances to purchase
|
691
715
|
#
|
692
716
|
# ===Example
|
693
717
|
# ec2.purchase_reserved_instances_offering('reservation-123456', 1)
|
694
|
-
|
695
|
-
# ec2.purchase_reserved_instances_offering(['reservation-123456', 'reservation-654321'], [1, 2])
|
696
|
-
def purchase_reserved_instances_offering(reserved_instances_offering_ids, instance_counts = 1)
|
718
|
+
def purchase_reserved_instances_offering(reserved_instances_offering_id, instance_count = 1)
|
697
719
|
action = 'PurchaseReservedInstancesOffering'
|
698
720
|
params = {
|
699
721
|
'Action' => action,
|
700
722
|
}
|
701
|
-
params
|
702
|
-
params
|
723
|
+
params['ReservedInstancesOfferingId'] = reserved_instances_offering_id
|
724
|
+
params['InstanceCount'] = instance_count
|
703
725
|
|
704
726
|
response = send_query_request(params)
|
705
727
|
parser = Awsum::Ec2::PurchaseReservedInstancesOfferingParser.new(self)
|
706
728
|
result = parser.parse(response.body)
|
707
|
-
if reserved_instances_offering_ids.is_a?(Array)
|
708
|
-
reserved_instances(*result)
|
709
|
-
else
|
710
|
-
reserved_instance(result)
|
711
|
-
end
|
712
729
|
end
|
713
730
|
|
714
731
|
def reserved_instances(*reserved_instances_ids)
|