right_aws 2.0.0 → 2.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +22 -1
- data/Manifest.txt +11 -1
- data/README.txt +0 -4
- data/Rakefile +19 -25
- data/lib/acf/right_acf_interface.rb +199 -135
- data/lib/acf/right_acf_invalidations.rb +144 -0
- data/lib/acf/right_acf_origin_access_identities.rb +4 -4
- data/lib/acf/right_acf_streaming_interface.rb +19 -26
- data/lib/acw/right_acw_interface.rb +1 -2
- data/lib/as/right_as_interface.rb +6 -7
- data/lib/awsbase/right_awsbase.rb +287 -91
- data/lib/awsbase/support.rb +2 -82
- data/lib/awsbase/version.rb +9 -0
- data/lib/ec2/right_ec2.rb +101 -38
- data/lib/ec2/right_ec2_ebs.rb +71 -58
- data/lib/ec2/right_ec2_images.rb +82 -42
- data/lib/ec2/right_ec2_instances.rb +74 -44
- data/lib/ec2/right_ec2_placement_groups.rb +108 -0
- data/lib/ec2/right_ec2_reserved_instances.rb +50 -46
- data/lib/ec2/right_ec2_security_groups.rb +148 -32
- data/lib/ec2/right_ec2_spot_instances.rb +53 -27
- data/lib/ec2/right_ec2_tags.rb +139 -0
- data/lib/ec2/right_ec2_vpc.rb +151 -139
- data/lib/ec2/right_ec2_windows_mobility.rb +84 -0
- data/lib/elb/right_elb_interface.rb +93 -18
- data/lib/iam/right_iam_access_keys.rb +71 -0
- data/lib/iam/right_iam_groups.rb +195 -0
- data/lib/iam/right_iam_interface.rb +341 -0
- data/lib/iam/right_iam_mfa_devices.rb +67 -0
- data/lib/iam/right_iam_users.rb +251 -0
- data/lib/rds/right_rds_interface.rb +513 -202
- data/lib/right_aws.rb +12 -12
- data/lib/route_53/right_route_53_interface.rb +630 -0
- data/lib/s3/right_s3.rb +9 -12
- data/lib/s3/right_s3_interface.rb +10 -11
- data/lib/sdb/active_sdb.rb +18 -33
- data/lib/sdb/right_sdb_interface.rb +36 -4
- data/lib/sqs/right_sqs.rb +1 -2
- data/lib/sqs/right_sqs_gen2.rb +0 -1
- data/lib/sqs/right_sqs_gen2_interface.rb +4 -5
- data/lib/sqs/right_sqs_interface.rb +6 -7
- data/right_aws.gemspec +91 -0
- data/test/awsbase/test_helper.rb +2 -0
- data/test/awsbase/test_right_awsbase.rb +12 -0
- data/test/s3/test_right_s3.rb +1 -1
- data/test/sdb/test_active_sdb.rb +1 -1
- data/test/sdb/test_batch_put_attributes.rb +54 -0
- data/test/sqs/test_right_sqs.rb +0 -6
- data/test/sqs/test_right_sqs_gen2.rb +1 -1
- metadata +109 -58
@@ -30,7 +30,11 @@ module RightAws
|
|
30
30
|
#-----------------------------------------------------------------
|
31
31
|
|
32
32
|
# Retrieve reserved instances list.
|
33
|
-
#
|
33
|
+
#
|
34
|
+
# Accepts a list of reserved instances and/or a set of filters as the last parameter.
|
35
|
+
#
|
36
|
+
# Filters: availability-zone, duration, fixed-price, instance-type, product-description,
|
37
|
+
# reserved-instances-id, start, state, tag-key, tag-value, tag:key, usage-price
|
34
38
|
#
|
35
39
|
# ec2.describe_reserved_instances #=>
|
36
40
|
# [{:aws_id=>"1ba8e2e3-1c40-434c-a741-5ff16a4c542e",
|
@@ -44,21 +48,19 @@ module RightAws
|
|
44
48
|
# :aws_start=>"2009-12-18T20:39:39.569Z"
|
45
49
|
# :aws_instance_count=>1}]
|
46
50
|
#
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
51
|
+
# ec2.describe_reserved_instances(:filters => {'availability-zone' => 'us-east-1a'})
|
52
|
+
#
|
53
|
+
# P.S. filters: http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/index.html?ApiReference-query-DescribeReservedInstances.html
|
54
|
+
#
|
55
|
+
def describe_reserved_instances(*list_and_options)
|
56
|
+
describe_resources_with_list_and_options('DescribeReservedInstances', 'ReservedInstancesId', QEc2DescribeReservedInstancesParser, list_and_options)
|
53
57
|
end
|
54
58
|
|
55
59
|
# Retrieve reserved instances offerings.
|
56
|
-
#
|
60
|
+
#
|
61
|
+
# Accepts a list of reserved instances offerings and/or a set of filters as the last parameter.
|
57
62
|
#
|
58
|
-
#
|
59
|
-
# :aws_instance_type => String
|
60
|
-
# :aws_availability_zone => String
|
61
|
-
# :aws_product_description => String
|
63
|
+
# Filters: availability-zone, duration, fixed-price, instance-type, product-description, reserved-instances-offering-id, usage-price
|
62
64
|
#
|
63
65
|
# ec2.describe_reserved_instances_offerings #=>
|
64
66
|
# [{:aws_instance_type=>"c1.medium",
|
@@ -77,19 +79,12 @@ module RightAws
|
|
77
79
|
# :aws_usage_price=>0.24,
|
78
80
|
# :aws_fixed_price=>2600.0}]
|
79
81
|
#
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
rparams['InstanceType'] = params[:aws_instance_type] if params[:aws_instance_type]
|
87
|
-
rparams['AvailabilityZone'] = params[:aws_availability_zone] if params[:aws_availability_zone]
|
88
|
-
rparams['ProductDescription'] = params[:aws_product_description] if params[:aws_product_description]
|
89
|
-
link = generate_request("DescribeReservedInstancesOfferings", rparams)
|
90
|
-
request_cache_or_info(:describe_reserved_instances_offerings, link, QEc2DescribeReservedInstancesOfferingsParser, @@bench, list.blank?)
|
91
|
-
rescue Exception
|
92
|
-
on_exception
|
82
|
+
# ec2.describe_reserved_instances_offerings(:filters => {'availability-zone' => 'us-east-1c'})
|
83
|
+
#
|
84
|
+
# P.S. filters: http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/index.html?ApiReference-query-DescribeReservedInstancesOfferings.html
|
85
|
+
#
|
86
|
+
def describe_reserved_instances_offerings(*list_and_options)
|
87
|
+
describe_resources_with_list_and_options('DescribeReservedInstancesOfferings', 'ReservedInstancesOfferingId', QEc2DescribeReservedInstancesOfferingsParser, list_and_options)
|
93
88
|
end
|
94
89
|
|
95
90
|
# Purchase a Reserved Instance.
|
@@ -111,21 +106,30 @@ module RightAws
|
|
111
106
|
|
112
107
|
class QEc2DescribeReservedInstancesParser < RightAWSParser #:nodoc:
|
113
108
|
def tagstart(name, attributes)
|
114
|
-
|
109
|
+
case full_tag_name
|
110
|
+
when %r{/reservedInstancesSet/item$} then @item = { :tags => {} }
|
111
|
+
when %r{/tagSet/item$} then @aws_tag = {}
|
112
|
+
end
|
115
113
|
end
|
116
114
|
def tagend(name)
|
117
115
|
case name
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
116
|
+
when 'reservedInstancesId' then @item[:aws_id] = @text
|
117
|
+
when 'instanceType' then @item[:aws_instance_type] = @text
|
118
|
+
when 'availabilityZone' then @item[:aws_availability_zone] = @text
|
119
|
+
when 'duration' then @item[:aws_duration] = @text.to_i
|
120
|
+
when 'usagePrice' then @item[:aws_usage_price] = @text.to_f
|
121
|
+
when 'fixedPrice' then @item[:aws_fixed_price] = @text.to_f
|
122
|
+
when 'instanceCount' then @item[:aws_instance_count] = @text.to_i
|
123
|
+
when 'productDescription' then @item[:aws_product_description] = @text
|
124
|
+
when 'state' then @item[:aws_state] = @text
|
125
|
+
when 'start' then @item[:aws_start] = @text
|
126
|
+
else
|
127
|
+
case full_tag_name
|
128
|
+
when %r{/tagSet/item/key$} then @aws_tag[:key] = @text
|
129
|
+
when %r{/tagSet/item/value$} then @aws_tag[:value] = @text
|
130
|
+
when %r{/tagSet/item$} then @item[:tags][@aws_tag[:key]] = @aws_tag[:value]
|
131
|
+
when %r{/reservedInstancesSet/item$} then @result << @item
|
132
|
+
end
|
129
133
|
end
|
130
134
|
end
|
131
135
|
def reset
|
@@ -136,19 +140,19 @@ module RightAws
|
|
136
140
|
class QEc2DescribeReservedInstancesOfferingsParser < RightAWSParser #:nodoc:
|
137
141
|
def tagstart(name, attributes)
|
138
142
|
@item = {} if name == 'item'
|
139
|
-
|
143
|
+
end
|
140
144
|
def tagend(name)
|
141
145
|
case name
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
146
|
+
when 'reservedInstancesOfferingId' then @item[:aws_id] = @text
|
147
|
+
when 'instanceType' then @item[:aws_instance_type] = @text
|
148
|
+
when 'availabilityZone' then @item[:aws_availability_zone] = @text
|
149
|
+
when 'duration' then @item[:aws_duration] = @text.to_i
|
150
|
+
when 'usagePrice' then @item[:aws_usage_price] = @text.to_f
|
151
|
+
when 'fixedPrice' then @item[:aws_fixed_price] = @text.to_f
|
152
|
+
when 'productDescription' then @item[:aws_product_description] = @text
|
149
153
|
when 'item' then @result << @item
|
154
|
+
end
|
150
155
|
end
|
151
|
-
end
|
152
156
|
def reset
|
153
157
|
@result = []
|
154
158
|
end
|
@@ -29,7 +29,12 @@ module RightAws
|
|
29
29
|
# Security groups
|
30
30
|
#-----------------------------------------------------------------
|
31
31
|
|
32
|
-
# Retrieve Security Groups information.
|
32
|
+
# Retrieve Security Groups information.
|
33
|
+
#
|
34
|
+
# Accepts a list of security groups and/or a set of filters as the last parameter.
|
35
|
+
#
|
36
|
+
# Filters: description, group-name, ip-permission.cidr, ip-permission.from-port, ip-permission.group-name,
|
37
|
+
# ip-permission.protocol, ip-permission.to-port, ip-permission.user-id, owner-id
|
33
38
|
#
|
34
39
|
# # Amazon cloud:
|
35
40
|
# ec2 = Rightscale::Ec2.new(AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY)
|
@@ -79,10 +84,12 @@ module RightAws
|
|
79
84
|
# :aws_description=>"default group",
|
80
85
|
# :aws_owner=>"826693181925"}]
|
81
86
|
#
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
87
|
+
# ec2.describe_security_groups(:filters => {'ip-permission.from-port' => '22'})
|
88
|
+
#
|
89
|
+
# P.S. filters: http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-DescribeSecurityGroups.html
|
90
|
+
#
|
91
|
+
def describe_security_groups(*list_and_options)
|
92
|
+
describe_resources_with_list_and_options('DescribeSecurityGroups', 'GroupName', QEc2DescribeSecurityGroupsParser, list_and_options) do |parser|
|
86
93
|
result = []
|
87
94
|
parser.result.each do |item|
|
88
95
|
result_item = { :aws_owner => item[:owner_id],
|
@@ -97,10 +104,7 @@ module RightAws
|
|
97
104
|
# IP permissions
|
98
105
|
Array(permission[:ip_ranges]).each do |ip_range|
|
99
106
|
perm = result_perm.dup
|
100
|
-
|
101
|
-
if @params[:eucalyptus] then perm[:cidr_ip] = ip_range
|
102
|
-
else perm[:cidr_ips] = ip_range
|
103
|
-
end
|
107
|
+
perm[:cidr_ips] = ip_range
|
104
108
|
aws_perms << perm
|
105
109
|
end
|
106
110
|
# Group permissions
|
@@ -108,12 +112,6 @@ module RightAws
|
|
108
112
|
perm = result_perm.dup
|
109
113
|
perm[:group] = group[:group_name]
|
110
114
|
perm[:owner] = group[:user_id]
|
111
|
-
# AWS does not support Port Based Group Permissions but Eucalyptus does
|
112
|
-
unless @params[:port_based_group_ingress]
|
113
|
-
perm.delete(:from_port)
|
114
|
-
perm.delete(:to_port)
|
115
|
-
perm.delete(:protocol)
|
116
|
-
end
|
117
115
|
aws_perms << perm
|
118
116
|
end
|
119
117
|
end
|
@@ -122,8 +120,6 @@ module RightAws
|
|
122
120
|
end
|
123
121
|
result
|
124
122
|
end
|
125
|
-
rescue Exception
|
126
|
-
on_exception
|
127
123
|
end
|
128
124
|
|
129
125
|
# Create new Security Group. Returns +true+ or an exception.
|
@@ -132,7 +128,7 @@ module RightAws
|
|
132
128
|
#
|
133
129
|
def create_security_group(name, description=nil)
|
134
130
|
# EC2 doesn't like an empty description...
|
135
|
-
description = "-" if description.
|
131
|
+
description = "-" if description.right_blank?
|
136
132
|
link = generate_request("CreateSecurityGroup",
|
137
133
|
'GroupName' => name.to_s,
|
138
134
|
'GroupDescription' => description.to_s)
|
@@ -153,13 +149,14 @@ module RightAws
|
|
153
149
|
on_exception
|
154
150
|
end
|
155
151
|
|
156
|
-
# Edit group permissions.
|
152
|
+
# Edit AWS/Eucaliptus security group permissions.
|
157
153
|
#
|
158
|
-
#
|
159
|
-
#
|
160
|
-
#
|
161
|
-
#
|
162
|
-
# :
|
154
|
+
# Options:
|
155
|
+
# action - :authorize (or :grant) | :revoke (or :remove)
|
156
|
+
# group_name - security group name
|
157
|
+
# permissions - a combination of options below:
|
158
|
+
# :source_group_owner => UserId
|
159
|
+
# :source_group => GroupName
|
163
160
|
# :from_port => from port
|
164
161
|
# :to_port => to port
|
165
162
|
# :port => set both :from_port and to_port with the same value
|
@@ -174,7 +171,8 @@ module RightAws
|
|
174
171
|
# :port => '80',
|
175
172
|
# :cidr_ip => '127.0.0.1/32') #=> true
|
176
173
|
#
|
177
|
-
# P.S.
|
174
|
+
# P.S. This method is deprecated for AWS and but still good for Eucaliptus clouds.
|
175
|
+
# Use +modify_security_group_ingress+ method for AWS clouds.
|
178
176
|
#
|
179
177
|
def edit_security_group(action, group_name, params)
|
180
178
|
hash = {}
|
@@ -184,16 +182,134 @@ module RightAws
|
|
184
182
|
else raise "Unknown action #{action.inspect}!"
|
185
183
|
end
|
186
184
|
hash['GroupName'] = group_name
|
187
|
-
hash['SourceSecurityGroupName'] = params[:source_group] unless params[:source_group].
|
188
|
-
hash['SourceSecurityGroupOwnerId'] = params[:source_group_owner].to_s.gsub(/-/,'') unless params[:source_group_owner].
|
189
|
-
hash['IpProtocol'] = params[:protocol] unless params[:protocol].
|
190
|
-
unless params[:port].
|
185
|
+
hash['SourceSecurityGroupName'] = params[:source_group] unless params[:source_group].right_blank?
|
186
|
+
hash['SourceSecurityGroupOwnerId'] = params[:source_group_owner].to_s.gsub(/-/,'') unless params[:source_group_owner].right_blank?
|
187
|
+
hash['IpProtocol'] = params[:protocol] unless params[:protocol].right_blank?
|
188
|
+
unless params[:port].right_blank?
|
191
189
|
hash['FromPort'] = params[:port]
|
192
190
|
hash['ToPort'] = params[:port]
|
193
191
|
end
|
194
|
-
hash['FromPort'] = params[:from_port] unless params[:from_port].
|
195
|
-
hash['ToPort'] = params[:to_port] unless params[:to_port].
|
196
|
-
hash['CidrIp'] = params[:cidr_ip] unless params[:cidr_ip].
|
192
|
+
hash['FromPort'] = params[:from_port] unless params[:from_port].right_blank?
|
193
|
+
hash['ToPort'] = params[:to_port] unless params[:to_port].right_blank?
|
194
|
+
hash['CidrIp'] = params[:cidr_ip] unless params[:cidr_ip].right_blank?
|
195
|
+
#
|
196
|
+
link = generate_request(action, hash)
|
197
|
+
request_info(link, RightBoolResponseParser.new(:logger => @logger))
|
198
|
+
rescue Exception
|
199
|
+
on_exception
|
200
|
+
end
|
201
|
+
|
202
|
+
# Modify AWS security group permissions.
|
203
|
+
#
|
204
|
+
# Options:
|
205
|
+
# action - :authorize (or :grant) | :revoke (or :remove)
|
206
|
+
# group_name - security group name
|
207
|
+
# permissions - a combination of options below:
|
208
|
+
# # Ports:
|
209
|
+
# :from_port => from port
|
210
|
+
# :to_port => to port
|
211
|
+
# :port => set both :from_port and to_port with the same value
|
212
|
+
# # Protocol
|
213
|
+
# :protocol => :tcp | :udp | :icmp
|
214
|
+
# # Group(s)
|
215
|
+
# :source_group_owner => UserId
|
216
|
+
# :source_group => GroupName
|
217
|
+
# # or
|
218
|
+
# :source_groups => { UserId1 => GroupName1, UserName2 => GroupName2 }
|
219
|
+
# :source_groups => [ [ UserId1, GroupName1 ], [ UserName2 => GroupName2 ] ]
|
220
|
+
# # CidrIp(s)
|
221
|
+
# :cidr_ip => '0.0.0.0/0'
|
222
|
+
# :cidr_ips => ['1.1.1.1/1', '2.2.2.2/2']
|
223
|
+
#
|
224
|
+
# # CidrIP based permissions:
|
225
|
+
#
|
226
|
+
# ec2.modify_security_group_ingress(:authorize, 'my_cool_group',
|
227
|
+
# :cidr_ip => "127.0.0.0/31",
|
228
|
+
# :port => 811,
|
229
|
+
# :protocol => 'tcp' ) #=> true
|
230
|
+
#
|
231
|
+
# ec2.modify_security_group_ingress(:revoke, 'my_cool_group',
|
232
|
+
# :cidr_ips => ["127.0.0.1/32", "127.0.0.2/32"],
|
233
|
+
# :port => 812,
|
234
|
+
# :protocol => 'tcp' ) #=> true
|
235
|
+
#
|
236
|
+
# # Group based permissions:
|
237
|
+
#
|
238
|
+
# ec2.modify_security_group_ingress(:authorize, 'my_cool_group',
|
239
|
+
# :source_group_owner => "586789340000",
|
240
|
+
# :source_group => "sketchy-us",
|
241
|
+
# :port => 800,
|
242
|
+
# :protocol => 'tcp' ) #=> true
|
243
|
+
#
|
244
|
+
# ec2.modify_security_group_ingress(:authorize, 'my_cool_group',
|
245
|
+
# :source_groups => { "586789340000" => "sketchy-us",
|
246
|
+
# "635201710000" => "sketchy" },
|
247
|
+
# :port => 801,
|
248
|
+
# :protocol => 'tcp' ) #=> true
|
249
|
+
#
|
250
|
+
# ec2.modify_security_group_ingress(:revoke, 'my_cool_group',
|
251
|
+
# :source_groups => [[ "586789340000", "sketchy-us" ],
|
252
|
+
# [ "586789340000", "default" ]],
|
253
|
+
# :port => 809,
|
254
|
+
# :protocol => 'tcp' ) #=> true
|
255
|
+
#
|
256
|
+
# # +Permissions+ can be an array of permission hashes:
|
257
|
+
#
|
258
|
+
# ec2.modify_security_group_ingress(:authorize, 'my_cool_group',
|
259
|
+
# [{ :source_groups => { "586789340000" => "sketchy-us",
|
260
|
+
# "635201710000" => "sketchy" },
|
261
|
+
# :port => 803,
|
262
|
+
# :protocol => 'tcp'},
|
263
|
+
# { :cidr_ips => ["127.0.0.1/32", "127.0.0.2/32"],
|
264
|
+
# :port => 812,
|
265
|
+
# :protocol => 'tcp' }]) #=> true
|
266
|
+
#
|
267
|
+
def modify_security_group_ingress(action, group_name, permissions)
|
268
|
+
hash = {}
|
269
|
+
case action
|
270
|
+
when :authorize, :grant then action = "AuthorizeSecurityGroupIngress"
|
271
|
+
when :revoke, :remove then action = "RevokeSecurityGroupIngress"
|
272
|
+
else raise "Unknown action #{action.inspect}!"
|
273
|
+
end
|
274
|
+
# Group Name
|
275
|
+
hash["GroupName"] = group_name
|
276
|
+
#
|
277
|
+
permissions = [permissions] unless permissions.is_a?(Array)
|
278
|
+
permissions.each_with_index do |permission, idx|
|
279
|
+
pid = idx+1
|
280
|
+
# Protocol
|
281
|
+
hash["IpPermissions.#{pid}.IpProtocol"] = permission[:protocol]
|
282
|
+
# Port
|
283
|
+
unless permission[:port].right_blank?
|
284
|
+
hash["IpPermissions.#{pid}.FromPort"] = permission[:port]
|
285
|
+
hash["IpPermissions.#{pid}.ToPort"] = permission[:port]
|
286
|
+
else
|
287
|
+
hash["IpPermissions.#{pid}.FromPort"] = permission[:from_port]
|
288
|
+
hash["IpPermissions.#{pid}.ToPort"] = permission[:to_port]
|
289
|
+
end
|
290
|
+
# Source Group(s)
|
291
|
+
# Old way (if it is used):
|
292
|
+
# :source_group_owner => UserId, :source_group => GroupName
|
293
|
+
if !permission[:source_group].right_blank? && !permission[:source_group_owner].right_blank?
|
294
|
+
permission[:source_groups] = { permission[:source_group_owner] => permission[:source_group]}
|
295
|
+
end
|
296
|
+
# # Fix UserId(s): '0000-0000-0000' => '000000000000'
|
297
|
+
# permission[:source_groups] = Array(permission[:source_groups])
|
298
|
+
# permission[:source_groups].each do |item|
|
299
|
+
# item[0] = item[0].to_s.gsub(/-/,'')
|
300
|
+
# end
|
301
|
+
# New way:
|
302
|
+
# :source_groups => {UserId1 => GroupName1, ... UserIdN => GroupNameN}
|
303
|
+
# or (this allows using same UserId multiple times )
|
304
|
+
# :source_groups => [[UserId1, GroupName1], ... [UserIdN, GroupNameN]]
|
305
|
+
hash.merge!(amazonize_list( ["IpPermissions.#{pid}.Groups.?.UserId",
|
306
|
+
"IpPermissions.#{pid}.Groups.?.GroupName"],
|
307
|
+
permission[:source_groups] ))
|
308
|
+
# CidrIp(s)
|
309
|
+
cidr_ips = permission[:cidr_ips] unless permission[:cidr_ips].right_blank?
|
310
|
+
cidr_ips ||= permission[:cidr_ip] unless permission[:cidr_ip].right_blank?
|
311
|
+
hash.merge!(amazonize_list("IpPermissions.1.IpRanges.?.CidrIp", cidr_ips))
|
312
|
+
end
|
197
313
|
#
|
198
314
|
link = generate_request(action, hash)
|
199
315
|
request_info(link, RightBoolResponseParser.new(:logger => @logger))
|
@@ -30,7 +30,10 @@ module RightAws
|
|
30
30
|
#-----------------------------------------------------------------
|
31
31
|
|
32
32
|
# Describe Spot Price history.
|
33
|
+
#
|
33
34
|
# Options: :start_time, :end_time, instance_types, product_description
|
35
|
+
#
|
36
|
+
# Filters: instance-type, product-description, spot-price, timestamp
|
34
37
|
#
|
35
38
|
# ec2.describe_spot_price_history #=>
|
36
39
|
# [{:spot_price=>0.054,
|
@@ -63,13 +66,21 @@ module RightAws
|
|
63
66
|
# :spot_price=>0.058,
|
64
67
|
# :instance_type=>"c1.medium"}, ... ]
|
65
68
|
#
|
69
|
+
# ec2.describe_spot_price_history(:filters => {'spot-price' => '0.2' })
|
70
|
+
#
|
71
|
+
# ec2.describe_spot_price_history(:instance_types => ["c1.medium"], :filters => {'spot-price' => '0.2' })
|
72
|
+
#
|
73
|
+
#
|
74
|
+
# P.S. filters: http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/index.html?ApiReference-query-DescribeSpotPriceHistory.html
|
75
|
+
#
|
66
76
|
def describe_spot_price_history(options={})
|
67
77
|
options = options.dup
|
68
78
|
request_hash = {}
|
69
|
-
request_hash['
|
70
|
-
request_hash['
|
71
|
-
request_hash['
|
72
|
-
request_hash
|
79
|
+
request_hash.merge!(amazonize_list(['Filter.?.Name', 'Filter.?.Value.?'], options[:filters])) unless options[:filters].right_blank?
|
80
|
+
request_hash['StartTime'] = AwsUtils::utc_iso8601(options[:start_time]) unless options[:start_time].right_blank?
|
81
|
+
request_hash['EndTime'] = AwsUtils::utc_iso8601(options[:end_time]) unless options[:end_time].right_blank?
|
82
|
+
request_hash['ProductDescription'] = options[:product_description] unless options[:product_description].right_blank?
|
83
|
+
request_hash.merge!(amazonize_list('InstanceType', Array(options[:instance_types]))) unless options[:instance_types].right_blank?
|
73
84
|
link = generate_request("DescribeSpotPriceHistory", request_hash)
|
74
85
|
request_info(link, QEc2DescribeSpotPriceHistoryParser.new)
|
75
86
|
rescue Exception
|
@@ -78,6 +89,14 @@ module RightAws
|
|
78
89
|
|
79
90
|
# Describe Spot Instance requests.
|
80
91
|
#
|
92
|
+
# Accepts a list of requests and/or a set of filters as the last parameter.
|
93
|
+
#
|
94
|
+
# Filters: availability-zone-group, create-time, fault-code, fault-message, instance-id, launch-group,
|
95
|
+
# launch.block-device-mapping.delete-on-termination, launch.block-device-mapping.device-name,
|
96
|
+
# launch.block-device-mapping.snapshot-id, launch.group-id, launch.image-id, launch.instance-type,
|
97
|
+
# launch.kernel-id, launch.key-name, launch.monitoring-enabled, launch.ramdisk-id, product-description,
|
98
|
+
# spot-instance-request-id, spot-price, state, tag-key, tag-value, tag:key, type, valid-from, valid-until
|
99
|
+
#
|
81
100
|
# ec2.describe_spot_instance_requests #=>
|
82
101
|
# [{:type=>"one-time",
|
83
102
|
# :create_time=>"2010-03-10T10:30:32.000Z",
|
@@ -113,9 +132,12 @@ module RightAws
|
|
113
132
|
# :monitoring_enabled=>false,
|
114
133
|
# :key_name=>"tim"}]
|
115
134
|
#
|
116
|
-
|
117
|
-
|
118
|
-
|
135
|
+
# ec2.describe_spot_instance_requests(:filters => {'type'=>"one-time", 'state'=>"open"})
|
136
|
+
#
|
137
|
+
# P.S. filters: http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/index.html?ApiReference-query-DescribeSpotInstanceRequests.html
|
138
|
+
#
|
139
|
+
def describe_spot_instance_requests(*list_and_options)
|
140
|
+
describe_resources_with_list_and_options('DescribeSpotInstanceRequests', 'SpotInstanceRequestId', QEc2DescribeSpotInstanceParser, list_and_options)
|
119
141
|
end
|
120
142
|
|
121
143
|
# Create a Spot Instance request.
|
@@ -205,25 +227,25 @@ module RightAws
|
|
205
227
|
request_hash = { 'SpotPrice' => options[:spot_price],
|
206
228
|
'LaunchSpecification.ImageId' => options[:image_id],
|
207
229
|
'LaunchSpecification.InstanceType' => options[:instance_type]}
|
208
|
-
request_hash['ValidFrom'] = AwsUtils::utc_iso8601(options[:valid_from]) unless options[:valid_from].
|
209
|
-
request_hash['ValidUntil'] = AwsUtils::utc_iso8601(options[:valid_until]) unless options[:valid_until].
|
210
|
-
request_hash['InstanceCount'] = options[:instance_count] unless options[:instance_count].
|
211
|
-
request_hash['Type'] = options[:type] unless options[:type].
|
212
|
-
request_hash['LaunchGroup'] = options[:launch_group] unless options[:launch_group].
|
213
|
-
request_hash['AvailabilityZoneGroup'] = options[:availability_zone_group] unless options[:availability_zone_group].
|
214
|
-
request_hash['LaunchSpecification.KeyName'] = options[:key_name] unless options[:key_name].
|
215
|
-
request_hash['LaunchSpecification.AddressingType'] = options[:addressing_type] unless options[:addressing_type].
|
216
|
-
request_hash['LaunchSpecification.KernelId'] = options[:kernel_id] unless options[:kernel_id].
|
217
|
-
request_hash['LaunchSpecification.RamdiskId'] = options[:ramdisk_id] unless options[:ramdisk_id].
|
218
|
-
request_hash['LaunchSpecification.SubnetId'] = options[:subnet_id] unless options[:subnet_id].
|
219
|
-
request_hash['LaunchSpecification.Placement.AvailabilityZone'] = options[:availability_zone] unless options[:availability_zone].
|
220
|
-
request_hash['LaunchSpecification.Monitoring.Enabled'] = options[:monitoring_enabled] unless options[:monitoring_enabled].
|
221
|
-
request_hash.merge!(amazonize_list('LaunchSpecification.SecurityGroup', options[:groups])) unless options[:groups].
|
230
|
+
request_hash['ValidFrom'] = AwsUtils::utc_iso8601(options[:valid_from]) unless options[:valid_from].right_blank?
|
231
|
+
request_hash['ValidUntil'] = AwsUtils::utc_iso8601(options[:valid_until]) unless options[:valid_until].right_blank?
|
232
|
+
request_hash['InstanceCount'] = options[:instance_count] unless options[:instance_count].right_blank?
|
233
|
+
request_hash['Type'] = options[:type] unless options[:type].right_blank?
|
234
|
+
request_hash['LaunchGroup'] = options[:launch_group] unless options[:launch_group].right_blank?
|
235
|
+
request_hash['AvailabilityZoneGroup'] = options[:availability_zone_group] unless options[:availability_zone_group].right_blank?
|
236
|
+
request_hash['LaunchSpecification.KeyName'] = options[:key_name] unless options[:key_name].right_blank?
|
237
|
+
request_hash['LaunchSpecification.AddressingType'] = options[:addressing_type] unless options[:addressing_type].right_blank?
|
238
|
+
request_hash['LaunchSpecification.KernelId'] = options[:kernel_id] unless options[:kernel_id].right_blank?
|
239
|
+
request_hash['LaunchSpecification.RamdiskId'] = options[:ramdisk_id] unless options[:ramdisk_id].right_blank?
|
240
|
+
request_hash['LaunchSpecification.SubnetId'] = options[:subnet_id] unless options[:subnet_id].right_blank?
|
241
|
+
request_hash['LaunchSpecification.Placement.AvailabilityZone'] = options[:availability_zone] unless options[:availability_zone].right_blank?
|
242
|
+
request_hash['LaunchSpecification.Monitoring.Enabled'] = options[:monitoring_enabled] unless options[:monitoring_enabled].right_blank?
|
243
|
+
request_hash.merge!(amazonize_list('LaunchSpecification.SecurityGroup', options[:groups])) unless options[:groups].right_blank?
|
222
244
|
request_hash.merge!(amazonize_block_device_mappings(options[:block_device_mappings], 'LaunchSpecification.BlockDeviceMapping'))
|
223
|
-
unless options[:user_data].
|
245
|
+
unless options[:user_data].right_blank?
|
224
246
|
# See RightAws::Ec2#run_instances
|
225
247
|
options[:user_data].strip!
|
226
|
-
request_hash['LaunchSpecification.UserData'] = Base64.encode64(options[:user_data]).delete("\n") unless options[:user_data].
|
248
|
+
request_hash['LaunchSpecification.UserData'] = Base64.encode64(options[:user_data]).delete("\n") unless options[:user_data].right_blank?
|
227
249
|
end
|
228
250
|
link = generate_request("RequestSpotInstances", request_hash)
|
229
251
|
request_info(link, QEc2DescribeSpotInstanceParser.new(:logger => @logger))
|
@@ -253,7 +275,7 @@ module RightAws
|
|
253
275
|
#
|
254
276
|
def create_spot_datafeed_subscription(bucket, prefix=nil)
|
255
277
|
request_hash = { 'Bucket' => bucket }
|
256
|
-
request_hash['Prefix'] = prefix unless prefix.
|
278
|
+
request_hash['Prefix'] = prefix unless prefix.right_blank?
|
257
279
|
link = generate_request("CreateSpotDatafeedSubscription", request_hash)
|
258
280
|
request_info(link, QEc2DescribeSpotDatafeedSubscriptionParser.new(:logger => @logger))
|
259
281
|
end
|
@@ -306,10 +328,12 @@ module RightAws
|
|
306
328
|
def tagstart(name, attributes)
|
307
329
|
case full_tag_name
|
308
330
|
when %r{spotInstanceRequestSet/item$}
|
309
|
-
@item = {}
|
331
|
+
@item = { :tags => {} }
|
310
332
|
when %r{/blockDeviceMapping/item$}
|
311
333
|
@item[:block_device_mappings] ||= []
|
312
334
|
@block_device_mapping = {}
|
335
|
+
when %r{/tagSet/item$}
|
336
|
+
@aws_tag = {}
|
313
337
|
end
|
314
338
|
end
|
315
339
|
def tagend(name)
|
@@ -351,8 +375,10 @@ module RightAws
|
|
351
375
|
when 'deleteOnTermination' then @block_device_mapping[:ebs_delete_on_termination] = @text == 'true' ? true : false
|
352
376
|
when 'item' then @item[:block_device_mappings] << @block_device_mapping
|
353
377
|
end
|
354
|
-
when %r{
|
355
|
-
|
378
|
+
when %r{/tagSet/item/key$} then @aws_tag[:key] = @text
|
379
|
+
when %r{/tagSet/item/value$} then @aws_tag[:value] = @text
|
380
|
+
when %r{/tagSet/item$} then @item[:tags][@aws_tag[:key]] = @aws_tag[:value]
|
381
|
+
when %r{spotInstanceRequestSet/item$} then @result << @item
|
356
382
|
end
|
357
383
|
end
|
358
384
|
end
|