right_aws 1.3.0 → 1.4.2

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.
data/History.txt CHANGED
@@ -1,66 +1,68 @@
1
- == 1.1.0 / 2007-08-10
1
+ == 1.1.0 2007-08-10
2
2
  Initial release.
3
3
 
4
- == 1.2.0 / 2007-09-12
5
- ------------------------------------------------------------------------
6
- r1718 | todd | 2007-09-12 15:34:37 -0700 (Wed, 12 Sep 2007) | 3 lines
4
+ == 1.2.0 2007-09-12
7
5
 
8
- (#458) Extensive documentation review, rework, and expansion. Also added
9
- coverage analysis to the test suite using RCov.
6
+ * r1718, todd, 2007-09-12 15:34:37
7
+ * # 458, Extensive documentation review, rework, and expansion. Also added
8
+ coverage analysis to the test suite using RCov.
10
9
 
11
- ------------------------------------------------------------------------
12
- r1690 | todd | 2007-09-07 15:23:11 -0700 (Fri, 07 Sep 2007) | 2 lines
10
+ * r1690, todd, 2007-09-07 15:23:11
11
+ * # 447, Add support.rb to manifest
13
12
 
14
- (#447) Add support.rb to manifest
13
+ * r1688, todd, 2007-09-07 13:57:39
14
+ * # 447, Use Active Support if available, but don't require it. Load our own
15
+ extensions if it's not present. This keeps us from overloading ActiveSupport if
16
+ a user's already using it.
15
17
 
16
- ------------------------------------------------------------------------
17
- r1688 | todd | 2007-09-07 13:57:39 -0700 (Fri, 07 Sep 2007) | 4 lines
18
+ * r1687, todd, 2007-09-07 11:36:43
19
+ * # 447, Removed dependency on activesupport
18
20
 
19
- #(447) Use Active Support if available, but don't require it. Load our own
20
- extensions if it's not present. This keeps us from overloading ActiveSupport if
21
- a user's already using it.
21
+ * r1676, konstantin, 2007-09-06 01:27:09
22
+ * paid AMIs, small fix
22
23
 
23
- ------------------------------------------------------------------------
24
- r1687 | todd | 2007-09-07 11:36:43 -0700 (Fri, 07 Sep 2007) | 2 lines
24
+ * r1667, konstantin, 2007-09-05 12:58:10
25
+ * # 427, paid AMI support for ec2_instances
25
26
 
26
- (#447) Removed dependency on activesupport
27
+ * r1658, konstantin, 2007-09-05 01:02:25
28
+ * params improvements for ec2.describe_xxx, now ones can use a String as well as an Array.
27
29
 
28
- ------------------------------------------------------------------------
29
- r1676 | konstantin | 2007-09-06 01:27:09 -0700 (Thu, 06 Sep 2007) | 1 line
30
+ * r1653, konstantin, 2007-09-04 12:31:19
31
+ * libxml and paid AMI support added
30
32
 
31
- paid AMIs, small fix
32
- ------------------------------------------------------------------------
33
- r1667 | konstantin | 2007-09-05 12:58:10 -0700 (Wed, 05 Sep 2007) | 1 line
33
+ * r1581, tve, 2007-08-24 16:21:45
34
+ * Improved RightAws documentation
34
35
 
35
- #427, Gems, paid AMI support for ec2_instances
36
- ------------------------------------------------------------------------
37
- r1658 | konstantin | 2007-09-05 01:02:25 -0700 (Wed, 05 Sep 2007) | 1 line
36
+ == 1.3.0 2007-09-26
38
37
 
39
- RightGems: a couple of params improvements, now ones can use a String as well as an Array.
40
- ------------------------------------------------------------------------
41
- r1653 | konstantin | 2007-09-04 12:31:19 -0700 (Tue, 04 Sep 2007) | 1 line
38
+ * r1754, todd, 2007-09-19 13:48:34
39
+ * # 487, # 488, Consolidate a lot of code that was repeated in three places.
40
+ Fix error handling path when using streaming GET interfaces with S3.
41
+ Also add a stub for RightHttpConnection which allows more control over the
42
+ unit tests. Expand the unit tests and coverage tests.
42
43
 
43
- Right gems: libxml and paid AMI support added
44
- ------------------------------------------------------------------------
45
- r1581 | tve | 2007-08-24 16:21:45 -0700 (Fri, 24 Aug 2007) | 1 line
44
+ * r1755, todd, 2007-09-19 14:29:19
45
+ * # 487, RDoc fixes after code consolidation
46
46
 
47
- Improved RightAws documentation
48
- ------------------------------------------------------------------------
47
+ * r1866, konstantin, 2007-10-05 06:17:36
48
+ * # 220, close connection on HTTP 5xx/4xx errors
49
49
 
50
- == 1.3.0 / 2007-09-26
51
- ------------------------------------------------------------------------
52
- r1754 | todd | 2007-09-19 13:48:34 -0700 (Wed, 19 Sep 2007) | 6 lines
50
+ == 1.4.0 2007-10-10
53
51
 
54
- (#487, #488) Consolidate a lot of code that was repeated in three places.
55
- Fix error handling path when using streaming GET interfaces with S3.
56
- Also add a stub for RightHttpConnection which
57
- allows more control over the unit tests. Expand the unit tests and coverage
58
- tests.
59
- ------------------------------------------------------------------------
60
- r1755 | todd | 2007-09-19 14:29:19 -0700 (Wed, 19 Sep 2007) | 2 lines
52
+ * r1868, konstantin, 2007-10-05 06:38:37
53
+ * # 220, inst_type branch merge into 1.3.0 release
61
54
 
62
- (#487) RDoc fixes after code consolidation
55
+ * r1869, konstantin, 2007-10-05 07:32:34
56
+ * right_http_connection 1.1.1 requirements fixed
63
57
 
64
- ------------------------------------------------------------------------
58
+ * r1879, konstantin, 2007-10-07 02:11:24
59
+ * # 524, blocks added to ec2_describe_xxx to support aws_cache
65
60
 
61
+ * r1924, konstantin, 2007-10-12 11:35:06
62
+ * # 536, user_data bug fix
66
63
 
64
+ * r1929, tve, 2007-10-15 00:00:11
65
+ * Fix libxml/rexml selection bug
66
+
67
+ * r1938, konstantin, 2007-10-16 10:53:56
68
+ * instance type support is set to default
data/Rakefile CHANGED
@@ -18,7 +18,7 @@ Hoe.new('right_aws', RightAws::VERSION::STRING) do |p|
18
18
  p.url = p.paragraphs_of('README.txt', 0).first.split(/\n/)[1..-1]
19
19
  p.changes = p.paragraphs_of('History.txt', 0..1).join("\n\n")
20
20
  p.remote_rdoc_dir = "/right_aws_gem_doc"
21
- p.extra_deps = [['right_http_connection','>= 0.1.4']]
21
+ p.extra_deps = [['right_http_connection','>= 1.2.0']]
22
22
  p.test_globs = testglobs
23
23
  end
24
24
 
@@ -89,6 +89,8 @@ module RightAws
89
89
  attr_accessor :logger
90
90
  # Initial params hash
91
91
  attr_accessor :params
92
+ # RightHttpConnection instance
93
+ attr_reader :connection
92
94
 
93
95
  def init(service_info, aws_access_key_id, aws_secret_access_key, params={}) #:nodoc:
94
96
  @params = params
@@ -117,6 +119,7 @@ module RightAws
117
119
  end
118
120
 
119
121
  def request_info_impl(connection, benchblock, request, parser, &block) #:nodoc:
122
+ @connection = connection
120
123
  @last_request = request[:request]
121
124
  @last_response = nil
122
125
  response=nil
@@ -131,7 +134,7 @@ module RightAws
131
134
  # Exceptions can originate from code directly in the block, or from user
132
135
  # code called in the other block which is passed to response.read_body.
133
136
  benchblock.service.add! do
134
- responsehdr = connection.request(request) do |response|
137
+ responsehdr = @connection.request(request) do |response|
135
138
  #########
136
139
  begin
137
140
  @last_response = response
@@ -139,7 +142,7 @@ module RightAws
139
142
  @error_handler = nil
140
143
  response.read_body(&block)
141
144
  else
142
- @error_handler = AWSErrorHandler.new(self, parser, self.class.amazon_problems) unless @error_handler
145
+ @error_handler = AWSErrorHandler.new(self, parser, :errors_list => self.class.amazon_problems) unless @error_handler
143
146
  check_result = @error_handler.check(request)
144
147
  if check_result
145
148
  @error_handler = nil
@@ -163,7 +166,7 @@ module RightAws
163
166
  return parser.result
164
167
  end
165
168
  else
166
- benchblock.service.add!{ response = connection.request(request) }
169
+ benchblock.service.add!{ response = @connection.request(request) }
167
170
  # check response for errors...
168
171
  @last_response = response
169
172
  if response.is_a?(Net::HTTPSuccess)
@@ -171,7 +174,7 @@ module RightAws
171
174
  benchblock.xml.add! { parser.parse(response) }
172
175
  return parser.result
173
176
  else
174
- @error_handler = AWSErrorHandler.new(self, parser, self.class.amazon_problems) unless @error_handler
177
+ @error_handler = AWSErrorHandler.new(self, parser, :errors_list => self.class.amazon_problems) unless @error_handler
175
178
  check_result = @error_handler.check(request)
176
179
  if check_result
177
180
  @error_handler = nil
@@ -256,6 +259,8 @@ module RightAws
256
259
 
257
260
 
258
261
  class AWSErrorHandler
262
+ # 0-100 (%)
263
+ DEFAULT_CLOSE_ON_4XX_PROBABILITY = 10
259
264
 
260
265
  @@reiteration_start_delay = 0.2
261
266
  def self.reiteration_start_delay
@@ -273,20 +278,45 @@ module RightAws
273
278
  @@reiteration_time = reiteration_time
274
279
  end
275
280
 
276
- def initialize(aws, parser, errors_list=nil, reiteration_time=nil) #:nodoc:
281
+ @@close_on_error = true
282
+ def self.close_on_error
283
+ @@close_on_error
284
+ end
285
+ def self.close_on_error=(close_on_error)
286
+ @@close_on_error = close_on_error
287
+ end
288
+
289
+ @@close_on_4xx_probability = DEFAULT_CLOSE_ON_4XX_PROBABILITY
290
+ def self.close_on_4xx_probability
291
+ @@close_on_4xx_probability
292
+ end
293
+ def self.close_on_4xx_probability=(close_on_4xx_probability)
294
+ @@close_on_4xx_probability = close_on_4xx_probability
295
+ end
296
+
297
+ # params:
298
+ # :reiteration_time
299
+ # :errors_list
300
+ # :close_on_error = true | false
301
+ # :close_on_4xx_probability = 1-100
302
+ def initialize(aws, parser, params={}) #:nodoc:
277
303
  @aws = aws # Link to RightEc2 | RightSqs | RightS3 instance
278
304
  @parser = parser # parser to parse Amazon response
279
305
  @started_at = Time.now
280
- @stop_at = @started_at + (reiteration_time || @@reiteration_time)
281
- @errors_list = errors_list || []
306
+ @stop_at = @started_at + (params[:reiteration_time] || @@reiteration_time)
307
+ @errors_list = params[:errors_list] || []
282
308
  @reiteration_delay = @@reiteration_start_delay
283
309
  @retries = 0
310
+ # close current HTTP(S) connection on 5xx, errors from list and 4xx errors
311
+ @close_on_error = params[:close_on_error].nil? ? @@close_on_error : params[:close_on_error]
312
+ @close_on_4xx_probability = params[:close_on_4xx_probability] || @@close_on_4xx_probability
284
313
  end
285
314
 
286
315
  # Returns false if
287
316
  def check(request) #:nodoc:
288
317
  result = false
289
318
  error_found = false
319
+ error_match = nil
290
320
  last_errors_text = ''
291
321
  response = @aws.last_response
292
322
  # log error
@@ -311,12 +341,20 @@ module RightAws
311
341
  @errors_list.each do |error_to_find|
312
342
  if last_errors_text[/#{error_to_find}/i]
313
343
  error_found = true
344
+ error_match = error_to_find
314
345
  @aws.logger.warn("##### Retry is needed, error pattern match: #{error_to_find} #####")
315
346
  break
316
347
  end
317
348
  end
318
349
  # check the time has gone from the first error come
319
350
  if error_found
351
+ # Close the connection to the server and recreate a new one.
352
+ # It may have a chance that one server is a semi-down and reconnection
353
+ # will help us to connect to the other server
354
+ if @close_on_error
355
+ @aws.connection.finish "#{self.class.name}: error match to pattern '#{error_match}'"
356
+ end
357
+
320
358
  if (Time.now < @stop_at)
321
359
  @retries += 1
322
360
  @aws.logger.warn("##### Retry ##{@retries} is being performed. Sleeping for #{@reiteration_delay} sec. Whole time: #{Time.now-@started_at} sec ####")
@@ -326,6 +364,16 @@ module RightAws
326
364
  result = @aws.request_info(request, @parser)
327
365
  else
328
366
  @aws.logger.warn("##### Ooops, time is over... ####")
367
+ end
368
+ # aha, this is unhandled error:
369
+ elsif @close_on_error
370
+ # Is this a 5xx error ?
371
+ if @aws.last_response.code.to_s[/^5\d\d$/]
372
+ @aws.connection.finish "#{self.class.name}: code: #{@aws.last_response.code}: '#{@aws.last_response.message}'"
373
+ # Is this a 4xxx error ?
374
+ elsif @aws.last_response.code.to_s[/^4\d\d$/] && @close_on_4xx_probability > rand(100)
375
+ @aws.connection.finish "#{self.class.name}: code: #{@aws.last_response.code}: '#{@aws.last_response.message}', " +
376
+ "probability: #{@close_on_4xx_probability}%"
329
377
  end
330
378
  end
331
379
  result
@@ -336,8 +384,36 @@ module RightAws
336
384
 
337
385
  #-----------------------------------------------------------------
338
386
 
387
+ class RightSaxParserCallback #:nodoc:
388
+ def self.include_callback
389
+ include XML::SaxParser::Callbacks
390
+ end
391
+ def initialize(right_aws_parser)
392
+ @right_aws_parser = right_aws_parser
393
+ end
394
+ def on_start_element(name, attr_hash)
395
+ @right_aws_parser.tag_start(name, attr_hash)
396
+ end
397
+ def on_characters(chars)
398
+ @right_aws_parser.text(chars)
399
+ end
400
+ def on_end_element(name)
401
+ @right_aws_parser.tag_end(name)
402
+ end
403
+ def on_start_document; end
404
+ def on_comment(msg); end
405
+ def on_processing_instruction(target, data); end
406
+ def on_cdata_block(cdata); end
407
+ def on_end_document; end
408
+ end
409
+
339
410
  class RightAWSParser #:nodoc:
340
- @@xml_lib = 'rexml' # xml library name: 'rexml' | 'libxml'
411
+ # default parsing library
412
+ DEFAULT_XML_LIBRARY = 'rexml'
413
+ # a list of supported parsers
414
+ @@supported_xml_libs = [DEFAULT_XML_LIBRARY, 'libxml']
415
+
416
+ @@xml_lib = DEFAULT_XML_LIBRARY # xml library name: 'rexml' | 'libxml'
341
417
  def self.xml_lib
342
418
  @@xml_lib
343
419
  end
@@ -379,32 +455,41 @@ module RightAws
379
455
  # Get response body
380
456
  xml_text = xml_text.body unless xml_text.is_a?(String)
381
457
  @xml_lib = params[:xml_lib] || @xml_lib
458
+ # check that we had no problems with this library otherwise use default
459
+ @xml_lib = DEFAULT_XML_LIBRARY unless @@supported_xml_libs.include?(@xml_lib)
382
460
  # load xml library
383
461
  if @xml_lib=='libxml' && !defined?(XML::SaxParser)
384
462
  begin
385
- require 'xml/libxml'
463
+ require 'xml/libxml'
464
+ # is it new ? - Setup SaxParserCallback
465
+ if XML::Parser::VERSION >= '0.5.1.0'
466
+ RightSaxParserCallback.include_callback
467
+ end
386
468
  rescue LoadError => e
387
- @xml_lib = 'rexml'
469
+ @@supported_xml_libs.delete(@xml_lib)
470
+ @xml_lib = DEFAULT_XML_LIBRARY
388
471
  if @logger
389
472
  @logger.error e.inspect
390
473
  @logger.error e.backtrace
391
- @logger.info "Can not load 'libxml' library. 'Rexml' is used for parsing."
474
+ @logger.info "Can not load 'libxml' library. '#{DEFAULT_XML_LIBRARY}' is used for parsing."
392
475
  end
393
476
  end
394
477
  end
395
478
  # Parse the xml text
396
479
  case @xml_lib
397
480
  when 'libxml'
398
- xml = XML::SaxParser.new
399
- xml.string = xml_text
400
- xml.on_start_element{|name, attr_hash| self.tag_start(name, attr_hash)}
401
- xml.on_characters{ |text| self.text(text)}
402
- xml.on_end_element{ |name| self.tag_end(name)}
481
+ xml = XML::SaxParser.new
482
+ xml.string = xml_text
483
+ # check libxml-ruby version
484
+ if XML::Parser::VERSION >= '0.5.1.0'
485
+ xml.callbacks = RightSaxParserCallback.new(self)
486
+ else
487
+ xml.on_start_element{|name, attr_hash| self.tag_start(name, attr_hash)}
488
+ xml.on_characters{ |text| self.text(text)}
489
+ xml.on_end_element{ |name| self.tag_end(name)}
490
+ end
403
491
  xml.parse
404
492
  else
405
- if @logger && @xml_lib!='rexml'
406
- @logger.info "RightAWSParser#parse: Unknown xml library ('#{@xml_lib}') is selected. The default 'rexml' is used."
407
- end
408
493
  REXML::Document.parse_stream(xml_text, self)
409
494
  end
410
495
  end
data/lib/ec2/right_ec2.rb CHANGED
@@ -68,7 +68,7 @@ module RightAws
68
68
 
69
69
  SIGNATURE_VERSION = "1"
70
70
  # Amazon EC2 API version being used
71
- API_VERSION = "2007-03-01"
71
+ API_VERSION = "2007-08-29"
72
72
  DEFAULT_HOST = "ec2.amazonaws.com"
73
73
  DEFAULT_PROTOCOL = 'https'
74
74
  DEFAULT_PORT = 443
@@ -76,7 +76,11 @@ module RightAws
76
76
  # Default addressing type (public=NAT, direct=no-NAT) used when launching instances.
77
77
  DEFAULT_ADDRESSING_TYPE = 'public'
78
78
  DNS_ADDRESSING_SET = ['public','direct']
79
-
79
+
80
+ # Default EC2 instance type (platform)
81
+ DEFAULT_INSTANCE_TYPE = 'm1.small'
82
+ INSTANCE_TYPES = ['m1.small','m1.large','m1.xlarge']
83
+
80
84
  @@bench = AwsBenchmarkingBlock.new
81
85
  def self.bench_xml
82
86
  @@bench.xml
@@ -85,6 +89,12 @@ module RightAws
85
89
  @@bench.service
86
90
  end
87
91
 
92
+ # Current API version (sometimes we have to check it outside the GEM).
93
+ @@api = ENV['EC2_API_VERSION'] || API_VERSION
94
+ def self.api
95
+ @@api
96
+ end
97
+
88
98
  # Create a new handle to an EC2 account. All handles share the same per process or per thread
89
99
  # HTTP connection to Amazon EC2. Each handle is for a specific account. The params have the
90
100
  # following options:
@@ -94,9 +104,14 @@ module RightAws
94
104
  # * <tt>:multi_thread</tt>: true=HTTP connection per thread, false=per process
95
105
  # * <tt>:logger</tt>: for log messages, default: RAILS_DEFAULT_LOGGER else STDOUT
96
106
  #
97
- def initialize(aws_access_key_id, aws_secret_access_key, params={})
98
- init({:name=>'EC2', :default_host => DEFAULT_HOST, :default_port => DEFAULT_PORT, :default_protocol => DEFAULT_PROTOCOL},
99
- aws_access_key_id, aws_secret_access_key, params)
107
+ def initialize(aws_access_key_id=nil, aws_secret_access_key=nil, params={})
108
+ init({ :name => 'EC2',
109
+ :default_host => ENV['EC2_URL'] ? URI.parse(ENV['EC2_URL']).host : DEFAULT_HOST,
110
+ :default_port => ENV['EC2_URL'] ? URI.parse(ENV['EC2_URL']).port : DEFAULT_PORT,
111
+ :default_protocol => ENV['EC2_URL'] ? URI.parse(ENV['EC2_URL']).scheme : DEFAULT_PROTOCOL },
112
+ aws_access_key_id || ENV['AWS_ACCESS_KEY_ID'] ,
113
+ aws_secret_access_key|| ENV['AWS_SECRET_ACCESS_KEY'],
114
+ params)
100
115
  end
101
116
 
102
117
 
@@ -104,7 +119,7 @@ module RightAws
104
119
  timestamp = ( Time::now ).utc.strftime("%Y-%m-%dT%H:%M:%S.000Z")
105
120
  request_hash = {"Action" => action,
106
121
  "AWSAccessKeyId" => @aws_access_key_id,
107
- "Version" => API_VERSION,
122
+ "Version" => @@api,
108
123
  "Timestamp" => timestamp,
109
124
  "SignatureVersion" => SIGNATURE_VERSION }
110
125
  request_hash.update(param)
@@ -139,18 +154,26 @@ module RightAws
139
154
  #-----------------------------------------------------------------
140
155
  #-----------------------------------------------------------------
141
156
 
142
- def ec2_describe_images(type, list) #:nodoc:
157
+ def ec2_describe_images(type, list, &block) #:nodoc:
143
158
  link = generate_request("DescribeImages", hash_params(type,list.to_a))
144
- images = request_info(link, QEc2DescribeImagesParser.new(:logger => @logger))
145
- images.collect! do |image|
146
- {:aws_id => image.imageId,
147
- :aws_location => image.imageLocation,
148
- :aws_owner => image.imageOwnerId,
149
- :aws_state => image.imageState.downcase,
150
- :aws_is_public => image.isPublic,
151
- :aws_product_codes => image.productCodes}
159
+ # We do not want to break the logic of parsing hence will use a dummy parser to process all the standart
160
+ # steps (errors checking etc). The dummy parser does nothig - just returns back the params it received.
161
+ # Then call the block (if it is) with the response. If the block returns +nil+ or +false+ then do not process
162
+ # real response parsing and exit with +nil+. Otherwise process parsing and return its result.
163
+ response, params = request_info(link, QEc2DummyParser.new)
164
+ if block
165
+ return nil unless block.call(response)
166
+ end
167
+ parser = QEc2DescribeImagesParser.new(:logger => @logger)
168
+ @@bench.xml.add!{ parser.parse(response, params) }
169
+ parser.result.collect do |image|
170
+ { :aws_id => image.imageId,
171
+ :aws_location => image.imageLocation,
172
+ :aws_owner => image.imageOwnerId,
173
+ :aws_state => image.imageState.downcase,
174
+ :aws_is_public => image.isPublic,
175
+ :aws_product_codes => image.productCodes }
152
176
  end
153
- images
154
177
  rescue Exception
155
178
  on_exception
156
179
  end
@@ -175,8 +198,19 @@ module RightAws
175
198
  # :aws_location => "marcins_cool_public_images/ubuntu-6.10.manifest.xml",
176
199
  # :aws_is_public => true}]
177
200
  #
178
- def describe_images(list=[])
179
- ec2_describe_images('ImageId', list)
201
+ # If a block is given then yields a respose before parsing.
202
+ # If the block returns +false+ or +nil+ the response is not parsed
203
+ # and describe_images returns +nil+.
204
+ #
205
+ # images = ec2.describe_images do |response|
206
+ # # Compare the response to the previous. If they are the same skip parsing - nothing
207
+ # # has changed at Amazon. Skpping the parsing will save us a lots of time for the big
208
+ # # responses.
209
+ # response.body == previous_response_body ? false : true
210
+ # end
211
+ #
212
+ def describe_images(list=[], &block)
213
+ ec2_describe_images('ImageId', list, &block)
180
214
  end
181
215
 
182
216
  #
@@ -185,8 +219,8 @@ module RightAws
185
219
  # ec2.describe_images_by_owner('522821470517')
186
220
  # ec2.describe_images_by_owner('self')
187
221
  #
188
- def describe_images_by_owner(list)
189
- ec2_describe_images('Owner', list)
222
+ def describe_images_by_owner(list, &block)
223
+ ec2_describe_images('Owner', list, &block)
190
224
  end
191
225
 
192
226
  #
@@ -195,8 +229,8 @@ module RightAws
195
229
  # ec2.describe_images_by_executable_by('522821470517')
196
230
  # ec2.describe_images_by_executable_by('self')
197
231
  #
198
- def describe_images_by_executable_by(list)
199
- ec2_describe_images('ExecutableBy', list)
232
+ def describe_images_by_executable_by(list, &block)
233
+ ec2_describe_images('ExecutableBy', list, &block)
200
234
  end
201
235
 
202
236
 
@@ -344,7 +378,8 @@ module RightAws
344
378
  :ssh_key_name => instance.keyName,
345
379
  :aws_image_id => instance.imageId,
346
380
  :aws_reason => reason,
347
- :aws_product_codes => instance.productCodes}
381
+ :aws_product_codes => instance.productCodes,
382
+ :aws_instance_type => instance.instanceType}
348
383
  end
349
384
  end
350
385
  result
@@ -366,13 +401,30 @@ module RightAws
366
401
  # :dns_name => "domU-12-34-67-89-01-C9.usma2.compute.amazonaws.com",
367
402
  # :ssh_key_name => "staging",
368
403
  # :aws_groups => ["default"],
369
- # :private_dns_name => "domU-12-34-67-89-01-C9.usma2.compute.amazonaws.com"},
404
+ # :private_dns_name => "domU-12-34-67-89-01-C9.usma2.compute.amazonaws.com",
405
+ # :aws_instance_type => "m1.small"},
370
406
  # ..., {...}]
371
407
  #
372
- def describe_instances(list=[])
373
- link = generate_request("DescribeInstances", hash_params('InstanceId',list.to_a))
374
- instances = request_info(link, QEc2DescribeInstancesParser.new(:logger => @logger))
375
- get_desc_instances(instances)
408
+ # If a block is given then yields a respose before parsing.
409
+ # If the block returns +false+ or +nil+ the response is not parsed
410
+ # and describe_instances returns +nil+.
411
+ #
412
+ # instances = ec2.describe_instances do |response|
413
+ # # Compare the response to the previous. If they are the same skip parsing - nothing
414
+ # # has changed at Amazon. Skpping the parsing will save us a lots of time for the big
415
+ # # responses.
416
+ # response.body == previous_response_body ? false : true
417
+ # end
418
+ #
419
+ def describe_instances(list=[], &block)
420
+ link = generate_request("DescribeInstances", hash_params('InstanceId',list.to_a))
421
+ response, params = request_info(link, QEc2DummyParser.new)
422
+ if block
423
+ return nil unless block.call(response)
424
+ end
425
+ parser = QEc2DescribeInstancesParser.new(:logger => @logger)
426
+ @@bench.xml.add!{ parser.parse(response, params) }
427
+ get_desc_instances(parser.result)
376
428
  rescue Exception
377
429
  on_exception
378
430
  end
@@ -401,24 +453,77 @@ module RightAws
401
453
  # :dns_name => "",
402
454
  # :ssh_key_name => "my_awesome_key",
403
455
  # :aws_groups => ["my_awesome_group"],
404
- # :private_dns_name => ""}]
456
+ # :private_dns_name => "",
457
+ # :aws_instance_type => "m1.small"}]
405
458
  #
406
- def run_instances(image_id, min_count, max_count, group_ids, key_name, user_data='', addressing_type=DEFAULT_ADDRESSING_TYPE)
407
- @logger.info("Launching instance of image #{image_id} for #{@aws_access_key_id}, key: #{key_name}, groups: #{(group_ids||[]).to_a.join(',')}")
459
+ def run_instances(image_id, min_count, max_count, group_ids, key_name, user_data='',
460
+ addressing_type = DEFAULT_ADDRESSING_TYPE,
461
+ instance_type = DEFAULT_INSTANCE_TYPE)
462
+ launch_instances(image_id, { :min_count => min_count,
463
+ :max_count => max_count,
464
+ :user_data => user_data,
465
+ :group_ids => group_ids,
466
+ :key_name => key_name,
467
+ :instance_type => instance_type,
468
+ :addressing_type => addressing_type })
469
+ end
470
+
471
+
472
+ # Launch new EC2 instances. Returns a list of launched instances or an exception.
473
+ #
474
+ # lparams and their default values:
475
+ # :min_count - 1
476
+ # :max_count - 1
477
+ # :user_data - ''
478
+ # :group_ids - [] # == 'default'
479
+ # :key_name - nil
480
+ # :instance_type - DEFAULT_INSTACE_TYPE
481
+ # :addressing_type - DEFAULT_ADDRESSING_TYPE
482
+ #
483
+ # ec2.launch_instances('ami-e444444d', 'my_awesome_group', :user_data => "Woohoo!!!", \
484
+ # :addressing_type => "public", :key_name => "my_awesome_key") #=>
485
+ # [{:aws_image_id => "ami-e444444d",
486
+ # :aws_reason => "",
487
+ # :aws_state_code => "0",
488
+ # :aws_owner => "000000000888",
489
+ # :aws_instance_id => "i-123f1234",
490
+ # :aws_reservation_id => "r-aabbccdd",
491
+ # :aws_state => "pending",
492
+ # :dns_name => "",
493
+ # :ssh_key_name => "my_awesome_key",
494
+ # :aws_groups => ["default"],
495
+ # :private_dns_name => "",
496
+ # :aws_instance_type => "m1.small"}]
497
+ #
498
+ def launch_instances(image_id, lparams={})
499
+ defaults = {
500
+ :min_count => 1,
501
+ :max_count => 1,
502
+ :user_data => '',
503
+ :group_ids => [],
504
+ :key_name => nil,
505
+ :instance_type => DEFAULT_INSTANCE_TYPE,
506
+ :addressing_type => DEFAULT_ADDRESSING_TYPE
507
+ }
508
+ lparams = defaults.merge(lparams)
509
+
510
+ @logger.info("Launching instance of image #{image_id} for #{@aws_access_key_id}, " +
511
+ "key: #{lparams[:key_name]}, groups: #{(lparams[:group_ids]||[]).to_a.join(',')}")
408
512
  # careful: keyName and securityGroups may be nil
409
- params = hash_params('SecurityGroup', group_ids.to_a)
513
+ params = hash_params('SecurityGroup', lparams[:group_ids].to_a)
410
514
  params.update( {'ImageId' => image_id,
411
- 'MinCount' => min_count.to_s,
412
- 'MaxCount' => max_count.to_s,
413
- 'AddressingType' => addressing_type })
414
- params['KeyName'] = key_name unless key_name.blank?
415
- unless user_data.blank?
416
- user_data.strip!
515
+ 'MinCount' => lparams[:min_count].to_s,
516
+ 'MaxCount' => lparams[:max_count].to_s,
517
+ 'AddressingType' => lparams[:addressing_type] })
518
+ params['InstanceType'] = lparams[:instance_type]
519
+ params['KeyName'] = lparams[:key_name] unless lparams[:key_name].blank?
520
+ unless lparams[:user_data].blank?
521
+ lparams[:user_data].strip!
417
522
  # Do not use CGI::escape(encode64(...)) as it is done in Amazons EC2 library.
418
523
  # Amazon 169.254.169.254 does not like escaped symbols!
419
524
  # And it doesn't like "\n" inside of encoded string! Grrr....
420
525
  # Otherwise, some of UserData symbols will be lost...
421
- params['UserData'] = Base64.encode64(user_data).delete("\n") unless user_data.blank?
526
+ params['UserData'] = Base64.encode64(lparams[:user_data]).delete("\n") unless lparams[:user_data].blank?
422
527
  end
423
528
  link = generate_request("RunInstances", params)
424
529
  #debugger
@@ -501,12 +606,28 @@ module RightAws
501
606
  # {:to_port => "443", :protocol => "tcp", :from_port => "443", :cidr_ips => "0.0.0.0/0"}]},
502
607
  # ..., {...}]
503
608
  #
504
- def describe_security_groups(list=[])
609
+ # If a block is given then yields a respose before parsing.
610
+ # If the block returns +false+ or +nil+ the response is not parsed
611
+ # and describe_security_groups returns +nil+.
612
+ #
613
+ # groups = ec2.describe_security_groups do |response|
614
+ # # Compare the response to the previous. If they are the same skip parsing - nothing
615
+ # # has changed at Amazon. Skpping the parsing will save us a lots of time for the big
616
+ # # responses.
617
+ # response.body == previous_response_body ? false : true
618
+ # end
619
+ #
620
+ def describe_security_groups(list=[], &block)
505
621
  link = generate_request("DescribeSecurityGroups", hash_params('GroupName',list.to_a))
506
- groups = request_info(link, QEc2DescribeSecurityGroupsParser.new(:logger => @logger))
622
+ response, params = request_info(link, QEc2DummyParser.new)
623
+ if block
624
+ return nil unless block.call(response)
625
+ end
626
+ parser = QEc2DescribeSecurityGroupsParser.new(:logger => @logger)
627
+ @@bench.xml.add!{ parser.parse(response, params) }
507
628
 
508
629
  result = []
509
- groups.each do |item|
630
+ parser.result.each do |item|
510
631
  perms = []
511
632
  item.ipPermissions.each do |perm|
512
633
  perm.groups.each do |ngroup|
@@ -636,14 +757,29 @@ module RightAws
636
757
  # {:aws_fingerprint=> "1e:29:30:47:58:6d:7b:8c:9f:08:11:20:3c:44:52:69:74:80:97:08", :aws_key_name=>"key-2"},
637
758
  # ..., {...} ]
638
759
  #
639
- def describe_key_pairs(list=[])
640
- link = generate_request("DescribeKeyPairs", hash_params('KeyName',list.to_a))
641
- result = request_info(link, QEc2DescribeKeyPairParser.new(:logger => @logger))
642
- result.collect! do |key|
643
- {:aws_key_name => key.keyName,
644
- :aws_fingerprint => key.keyFingerprint }
760
+ # If a block is given then yields a respose before parsing.
761
+ # If the block returns +false+ or +nil+ the response is not parsed
762
+ # and describe_key_pairs returns +nil+.
763
+ #
764
+ # keys = ec2.describe_key_pairs do |response|
765
+ # # Compare the response to the previous. If they are the same skip parsing - nothing
766
+ # # has changed at Amazon. Skpping the parsing will save us a lots of time for the big
767
+ # # responses.
768
+ # response.body == previous_response_body ? false : true
769
+ # end
770
+ #
771
+ def describe_key_pairs(list=[], &block)
772
+ link = generate_request("DescribeKeyPairs", hash_params('KeyName',list.to_a))
773
+ response, params = request_info(link, QEc2DummyParser.new)
774
+ if block
775
+ return nil unless block.call(response)
776
+ end
777
+ parser = QEc2DescribeKeyPairParser.new(:logger => @logger)
778
+ @@bench.xml.add!{ parser.parse(response, params) }
779
+ parser.result.collect do |key|
780
+ { :aws_key_name => key.keyName,
781
+ :aws_fingerprint => key.keyFingerprint }
645
782
  end
646
- result
647
783
  rescue Exception
648
784
  on_exception
649
785
  end
@@ -685,7 +821,7 @@ module RightAws
685
821
  # PARSERS: Boolean Response Parser
686
822
  #-----------------------------------------------------------------
687
823
 
688
- class RightBoolResponseParser < RightAWSParser
824
+ class RightBoolResponseParser < RightAWSParser #:nodoc:
689
825
  def tagend(name)
690
826
  @result = @text=='true' ? true : false if name == 'return'
691
827
  end
@@ -695,16 +831,16 @@ module RightAws
695
831
  # PARSERS: Key Pair
696
832
  #-----------------------------------------------------------------
697
833
 
698
- class QEc2DescribeKeyPairType
834
+ class QEc2DescribeKeyPairType #:nodoc:
699
835
  attr_accessor :keyName
700
836
  attr_accessor :keyFingerprint
701
837
  end
702
838
 
703
- class QEc2CreateKeyPairType < QEc2DescribeKeyPairType
839
+ class QEc2CreateKeyPairType < QEc2DescribeKeyPairType #:nodoc:
704
840
  attr_accessor :keyMaterial
705
841
  end
706
842
 
707
- class QEc2DescribeKeyPairParser < RightAWSParser
843
+ class QEc2DescribeKeyPairParser < RightAWSParser #:nodoc:
708
844
  def tagstart(name, attributes)
709
845
  @item = QEc2DescribeKeyPairType.new if name == 'item'
710
846
  end
@@ -720,7 +856,7 @@ module RightAws
720
856
  end
721
857
  end
722
858
 
723
- class QEc2CreateKeyPairParser < RightAWSParser
859
+ class QEc2CreateKeyPairParser < RightAWSParser #:nodoc:
724
860
  def tagstart(name, attributes)
725
861
  @result = QEc2CreateKeyPairType.new if !@result
726
862
  end
@@ -737,12 +873,12 @@ module RightAws
737
873
  # PARSERS: Security Groups
738
874
  #-----------------------------------------------------------------
739
875
 
740
- class QEc2UserIdGroupPairType
876
+ class QEc2UserIdGroupPairType #:nodoc:
741
877
  attr_accessor :userId
742
878
  attr_accessor :groupName
743
879
  end
744
880
 
745
- class QEc2IpPermissionType
881
+ class QEc2IpPermissionType #:nodoc:
746
882
  attr_accessor :ipProtocol
747
883
  attr_accessor :fromPort
748
884
  attr_accessor :toPort
@@ -750,7 +886,7 @@ module RightAws
750
886
  attr_accessor :ipRanges
751
887
  end
752
888
 
753
- class QEc2SecurityGroupItemType
889
+ class QEc2SecurityGroupItemType #:nodoc:
754
890
  attr_accessor :groupName
755
891
  attr_accessor :groupDescription
756
892
  attr_accessor :ownerId
@@ -758,7 +894,7 @@ module RightAws
758
894
  end
759
895
 
760
896
 
761
- class QEc2DescribeSecurityGroupsParser < RightAWSParser
897
+ class QEc2DescribeSecurityGroupsParser < RightAWSParser #:nodoc:
762
898
  def tagstart(name, attributes)
763
899
  case name
764
900
  when 'item'
@@ -808,7 +944,7 @@ module RightAws
808
944
  # PARSERS: Images
809
945
  #-----------------------------------------------------------------
810
946
 
811
- class QEc2DescribeImagesResponseItemType
947
+ class QEc2DescribeImagesResponseItemType #:nodoc:
812
948
  attr_accessor :imageId
813
949
  attr_accessor :imageState
814
950
  attr_accessor :imageLocation
@@ -817,7 +953,7 @@ module RightAws
817
953
  attr_accessor :productCodes
818
954
  end
819
955
 
820
- class QEc2DescribeImagesParser < RightAWSParser
956
+ class QEc2DescribeImagesParser < RightAWSParser #:nodoc:
821
957
  def tagstart(name, attributes)
822
958
  if name == 'item' && @xmlpath[%r{.*/imagesSet$}]
823
959
  @image = QEc2DescribeImagesResponseItemType.new
@@ -839,7 +975,7 @@ module RightAws
839
975
  end
840
976
  end
841
977
 
842
- class QEc2RegisterImageParser < RightAWSParser
978
+ class QEc2RegisterImageParser < RightAWSParser #:nodoc:
843
979
  def tagend(name)
844
980
  @result = @text if name == 'imageId'
845
981
  end
@@ -849,18 +985,18 @@ module RightAws
849
985
  # PARSERS: Image Attribute
850
986
  #-----------------------------------------------------------------
851
987
 
852
- class QEc2LaunchPermissionItemType
988
+ class QEc2LaunchPermissionItemType #:nodoc:
853
989
  attr_accessor :groups
854
990
  attr_accessor :userIds
855
991
  end
856
992
 
857
- class QEc2DescribeImageAttributeType
993
+ class QEc2DescribeImageAttributeType #:nodoc:
858
994
  attr_accessor :imageId
859
995
  attr_accessor :launchPermission
860
996
  attr_accessor :productCodes
861
997
  end
862
998
 
863
- class QEc2DescribeImageAttributeParser < RightAWSParser
999
+ class QEc2DescribeImageAttributeParser < RightAWSParser #:nodoc:
864
1000
  def tagstart(name, attributes)
865
1001
  case name
866
1002
  when 'launchPermission'
@@ -892,12 +1028,12 @@ module RightAws
892
1028
  # PARSERS: Instances
893
1029
  #-----------------------------------------------------------------
894
1030
 
895
- class QEc2InstanceStateType
1031
+ class QEc2InstanceStateType #:nodoc:
896
1032
  attr_accessor :code
897
1033
  attr_accessor :name
898
1034
  end
899
1035
 
900
- class QEc2RunningInstancesItemType
1036
+ class QEc2RunningInstancesItemType #:nodoc:
901
1037
  attr_accessor :instanceId
902
1038
  attr_accessor :imageId
903
1039
  attr_accessor :instanceState
@@ -907,16 +1043,17 @@ module RightAws
907
1043
  attr_accessor :keyName
908
1044
  attr_accessor :amiLaunchIndex
909
1045
  attr_accessor :productCodes
1046
+ attr_accessor :instanceType
910
1047
  end
911
1048
 
912
- class QEc2DescribeInstancesType
1049
+ class QEc2DescribeInstancesType #:nodoc:
913
1050
  attr_accessor :reservationId
914
1051
  attr_accessor :ownerId
915
1052
  attr_accessor :groupSet
916
1053
  attr_accessor :instancesSet
917
1054
  end
918
1055
 
919
- class QEc2DescribeInstancesParser < RightAWSParser
1056
+ class QEc2DescribeInstancesParser < RightAWSParser #:nodoc:
920
1057
  def tagstart(name, attributes)
921
1058
  case name
922
1059
  when 'item'
@@ -957,6 +1094,7 @@ module RightAws
957
1094
  @result << @reservation
958
1095
  end
959
1096
  when 'productCode' ; (@instance.productCodes ||= []) << @text
1097
+ when 'instanceType' ; @instance.instanceType = @text
960
1098
  end
961
1099
  end
962
1100
  def reset
@@ -964,7 +1102,7 @@ module RightAws
964
1102
  end
965
1103
  end
966
1104
 
967
- class QEc2ConfirmProductInstanceParser < RightAWSParser
1105
+ class QEc2ConfirmProductInstanceParser < RightAWSParser #:nodoc:
968
1106
  def tagend(name)
969
1107
  @result = @text if name == 'ownerId'
970
1108
  end
@@ -973,7 +1111,7 @@ module RightAws
973
1111
  end
974
1112
  end
975
1113
 
976
- class QEc2RunInstancesParser < RightAWSParser
1114
+ class QEc2RunInstancesParser < RightAWSParser #:nodoc:
977
1115
  def tagstart(name, attributes)
978
1116
  case name
979
1117
  when 'RunInstancesResponse'
@@ -1011,6 +1149,7 @@ module RightAws
1011
1149
  @reservation.instancesSet << @instance if @xmlpath == 'RunInstancesResponse/instancesSet'
1012
1150
  when 'RunInstancesResponse'; @result << @reservation
1013
1151
  when 'productCode' ; (@instance.productCodes ||= []) << @text
1152
+ when 'instanceType' ; @instance.instanceType = @text
1014
1153
  end
1015
1154
  end
1016
1155
  def reset
@@ -1018,13 +1157,13 @@ module RightAws
1018
1157
  end
1019
1158
  end
1020
1159
 
1021
- class QEc2TerminateInstancesResponseInfoType
1160
+ class QEc2TerminateInstancesResponseInfoType #:nodoc:
1022
1161
  attr_accessor :instanceId
1023
1162
  attr_accessor :shutdownState
1024
1163
  attr_accessor :previousState
1025
1164
  end
1026
1165
 
1027
- class QEc2TerminateInstancesParser < RightAWSParser
1166
+ class QEc2TerminateInstancesParser < RightAWSParser #:nodoc:
1028
1167
  def tagstart(name, attributes)
1029
1168
  if name == 'item'
1030
1169
  @instance = QEc2TerminateInstancesResponseInfoType.new
@@ -1055,13 +1194,13 @@ module RightAws
1055
1194
  # PARSERS: Console
1056
1195
  #-----------------------------------------------------------------
1057
1196
 
1058
- class QEc2GetConsoleOutputResponseType
1197
+ class QEc2GetConsoleOutputResponseType #:nodoc:
1059
1198
  attr_accessor :instanceId
1060
1199
  attr_accessor :timestamp
1061
1200
  attr_accessor :output
1062
1201
  end
1063
1202
 
1064
- class QEc2GetConsoleOutputParser < RightAWSParser
1203
+ class QEc2GetConsoleOutputParser < RightAWSParser #:nodoc:
1065
1204
  def tagend(name)
1066
1205
  case name
1067
1206
  when 'instanceId' ; @result.instanceId = @text
@@ -1076,4 +1215,17 @@ module RightAws
1076
1215
 
1077
1216
  end
1078
1217
 
1218
+ #-----------------------------------------------------------------
1219
+ # PARSERS: Fake
1220
+ #-----------------------------------------------------------------
1221
+
1222
+ # Dummy parser - does nothing
1223
+ # Returns the original params back
1224
+ class QEc2DummyParser # :nodoc:
1225
+ attr_accessor :result
1226
+ def parse(response, params={})
1227
+ @result = [response, params]
1228
+ end
1229
+ end
1230
+
1079
1231
  end
data/lib/right_aws.rb CHANGED
@@ -48,8 +48,8 @@ require 'sqs/right_sqs'
48
48
  module RightAws #:nodoc:
49
49
  module VERSION #:nodoc:
50
50
  MAJOR = 1
51
- MINOR = 3
52
- TINY = 0
51
+ MINOR = 4
52
+ TINY = 2
53
53
 
54
54
  STRING = [MAJOR, MINOR, TINY].join('.')
55
55
  end
data/lib/s3/right_s3.rb CHANGED
@@ -41,7 +41,7 @@ module RightAws
41
41
  # Create a new handle to an S3 account. All handles share the same per process or per thread
42
42
  # HTTP connection to Amazon S3. Each handle is for a specific account.
43
43
  # The +params+ are passed through as-is to RightAws::S3Interface.new
44
- def initialize(aws_access_key_id, aws_secret_access_key, params={})
44
+ def initialize(aws_access_key_id=nil, aws_secret_access_key=nil, params={})
45
45
  @interface = S3Interface.new(aws_access_key_id, aws_secret_access_key, params)
46
46
  end
47
47
 
@@ -55,9 +55,14 @@ module RightAws
55
55
  # :multi_thread => true|false # Multi-threaded (connection per each thread): true or false(default)
56
56
  # :logger => Logger Object} # Logger instance: logs to STDOUT if omitted }
57
57
  #
58
- def initialize(aws_access_key_id, aws_secret_access_key, params={})
59
- init({:name=>'S3', :default_host => DEFAULT_HOST, :default_port => DEFAULT_PORT, :default_protocol => DEFAULT_PROTOCOL},
60
- aws_access_key_id, aws_secret_access_key, params)
58
+ def initialize(aws_access_key_id=nil, aws_secret_access_key=nil, params={})
59
+ init({ :name => 'S3',
60
+ :default_host => ENV['S3_URL'] ? URI.parse(ENV['S3_URL']).host : DEFAULT_HOST,
61
+ :default_port => ENV['S3_URL'] ? URI.parse(ENV['S3_URL']).port : DEFAULT_PORT,
62
+ :default_protocol => ENV['S3_URL'] ? URI.parse(ENV['S3_URL']).scheme : DEFAULT_PROTOCOL },
63
+ aws_access_key_id || ENV['AWS_ACCESS_KEY_ID'],
64
+ aws_secret_access_key || ENV['AWS_SECRET_ACCESS_KEY'],
65
+ params)
61
66
  end
62
67
 
63
68
 
data/lib/sqs/right_sqs.rb CHANGED
@@ -58,7 +58,7 @@ module RightAws
58
58
  class Sqs
59
59
  attr_reader :interface
60
60
 
61
- def initialize(aws_access_key_id, aws_secret_access_key, params={})
61
+ def initialize(aws_access_key_id=nil, aws_secret_access_key=nil, params={})
62
62
  @interface = SqsInterface.new(aws_access_key_id, aws_secret_access_key, params)
63
63
  end
64
64
 
@@ -43,6 +43,10 @@ module RightAws
43
43
  @@bench.service
44
44
  end
45
45
 
46
+ @@api = API_VERSION
47
+ def self.api
48
+ @@api
49
+ end
46
50
 
47
51
  # Creates a new SqsInterface instance.
48
52
  #
@@ -55,9 +59,14 @@ module RightAws
55
59
  # :multi_thread => true|false # Multi-threaded (connection per each thread): true or false(default)
56
60
  # :logger => Logger Object} # Logger instance: logs to STDOUT if omitted }
57
61
  #
58
- def initialize(aws_access_key_id, aws_secret_access_key, params={})
59
- init({:name=>'SQS', :default_host => DEFAULT_HOST, :default_port => DEFAULT_PORT, :default_protocol => DEFAULT_PROTOCOL},
60
- aws_access_key_id, aws_secret_access_key, params)
62
+ def initialize(aws_access_key_id=nil, aws_secret_access_key=nil, params={})
63
+ init({ :name => 'SQS',
64
+ :default_host => ENV['SQS_URL'] ? URI.parse(ENV['SQS_URL']).host : DEFAULT_HOST,
65
+ :default_port => ENV['SQS_URL'] ? URI.parse(ENV['SQS_URL']).port : DEFAULT_PORT,
66
+ :default_protocol => ENV['SQS_URL'] ? URI.parse(ENV['SQS_URL']).scheme : DEFAULT_PROTOCOL },
67
+ aws_access_key_id || ENV['AWS_ACCESS_KEY_ID'],
68
+ aws_secret_access_key || ENV['AWS_SECRET_ACCESS_KEY'],
69
+ params)
61
70
  end
62
71
 
63
72
 
@@ -23,6 +23,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23
23
 
24
24
  # Stub extension/redefinition of RightHttpConnection for testing purposes.
25
25
  require 'net/http'
26
+ require 'rubygems'
26
27
  require 'right_http_connection'
27
28
 
28
29
  module Net
@@ -33,7 +34,8 @@ module Net
33
34
  end
34
35
 
35
36
  def body
36
- @mymsg ? @mymsg : real_body
37
+ # defined?() helps us to get rid of a bunch of 'warnings'
38
+ (defined?(@mymsg) && @mymsg) ? @mymsg : real_body
37
39
  end
38
40
  end
39
41
  end
@@ -13,6 +13,24 @@ class TestSqs < Test::Unit::TestCase
13
13
  @s = Rightscale::Sqs.new(TestCredentials.aws_access_key_id, TestCredentials.aws_secret_access_key)
14
14
  end
15
15
 
16
+ # Wait for the queue to appears in the queues list.
17
+ # Amazon needs some time to after the queue creation to place
18
+ # it to the accessible queues list. If we dont want to get
19
+ # the additional faults then wait a bit...
20
+ def wait_for_queue_url(queue_name)
21
+ queue_url = nil
22
+ until queue_url
23
+ queue_url = @sqs.queue_url_by_name(queue_name)
24
+ unless queue_url
25
+ print '-'
26
+ STDOUT.flush
27
+ sleep 1
28
+ end
29
+ end
30
+ queue_url
31
+ end
32
+
33
+
16
34
  #---------------------------
17
35
  # Rightscale::SqsInterface
18
36
  #---------------------------
@@ -23,6 +41,7 @@ class TestSqs < Test::Unit::TestCase
23
41
  end
24
42
 
25
43
  def test_02_list_queues
44
+ wait_for_queue_url(@queue_name)
26
45
  queues = @sqs.list_queues('right_')
27
46
  assert queues.size>0, 'Must more that 0 queues in list'
28
47
  end
@@ -31,14 +50,14 @@ class TestSqs < Test::Unit::TestCase
31
50
  queue_url = @sqs.queue_url_by_name(@queue_name)
32
51
  assert queue_url[/http.*#{@queue_name}/], "#{@queue_name} must exist!"
33
52
  assert @sqs.set_queue_attributes(queue_url, 'VisibilityTimeout', 111), 'Set_queue_attributes fail'
34
- sleep 10 # Amazon needs some time to change attribute
53
+ sleep 20 # Amazon needs some time to change attribute
35
54
  assert_equal '111', @sqs.get_queue_attributes(queue_url)['VisibilityTimeout'], 'New VisibilityTimeout must be equal to 111'
36
55
  end
37
56
 
38
57
  def test_04_set_and_get_visibility_timeout
39
58
  queue_url = @sqs.queue_url_by_name(@queue_name)
40
59
  assert @sqs.set_visibility_timeout(queue_url, 222), 'Set_visibility_timeout fail'
41
- sleep 10 # Amazon needs some time to change attribute
60
+ sleep 20 # Amazon needs some time to change attribute
42
61
  assert_equal 222, @sqs.get_visibility_timeout(queue_url), 'Get_visibility_timeout must return to 222'
43
62
  end
44
63
 
@@ -103,6 +122,7 @@ class TestSqs < Test::Unit::TestCase
103
122
  queue = @s.queue("#{@queue_name}_20", true)
104
123
  # check that it is created
105
124
  assert queue.is_a?(Rightscale::Sqs::Queue)
125
+ wait_for_queue_url(@queue_name)
106
126
  # check that amount of queues has increased
107
127
  assert_equal queues_size + 1, @s.queues.size
108
128
  # delete queue
@@ -114,10 +134,10 @@ class TestSqs < Test::Unit::TestCase
114
134
  queue = Rightscale::Sqs::Queue.create(@s, "#{@queue_name}_21", true)
115
135
  # check that it is created
116
136
  assert queue.is_a?(Rightscale::Sqs::Queue)
137
+ wait_for_queue_url(@queue_name)
117
138
  end
118
139
 
119
140
  def test_22_queue_attributes
120
- sleep 10
121
141
  queue = Rightscale::Sqs::Queue.create(@s, "#{@queue_name}_21", false)
122
142
  # get a list of attrinutes
123
143
  attributes = queue.get_attribute
@@ -127,7 +147,7 @@ class TestSqs < Test::Unit::TestCase
127
147
  # set attribute
128
148
  assert queue.set_attribute('VisibilityTimeout', v)
129
149
  # wait a bit
130
- sleep 10
150
+ sleep 20
131
151
  # check that attribute has changed
132
152
  assert_equal v, queue.get_attribute('VisibilityTimeout')
133
153
  # get queue visibility timeout
@@ -219,14 +239,14 @@ class TestSqs < Test::Unit::TestCase
219
239
  end
220
240
 
221
241
  def test_27_set_amazon_problems
222
- original_problems = RightAws::SqsInterface.amazon_problems
242
+ original_problems = Rightscale::SqsInterface.amazon_problems
223
243
  assert(original_problems.length > 0)
224
- RightAws::SqsInterface.amazon_problems= original_problems << "A New Problem"
225
- new_problems = RightAws::SqsInterface.amazon_problems
244
+ Rightscale::SqsInterface.amazon_problems= original_problems << "A New Problem"
245
+ new_problems = Rightscale::SqsInterface.amazon_problems
226
246
  assert_equal(new_problems, original_problems)
227
247
 
228
- RightAws::SqsInterface.amazon_problems= nil
229
- assert_nil(RightAws::SqsInterface.amazon_problems)
248
+ Rightscale::SqsInterface.amazon_problems= nil
249
+ assert_nil(Rightscale::SqsInterface.amazon_problems)
230
250
  end
231
251
 
232
252
  def test_28_check_threading_model
metadata CHANGED
@@ -1,10 +1,10 @@
1
1
  --- !ruby/object:Gem::Specification
2
- rubygems_version: 0.9.4
2
+ rubygems_version: 0.9.0
3
3
  specification_version: 1
4
4
  name: right_aws
5
5
  version: !ruby/object:Gem::Version
6
- version: 1.3.0
7
- date: 2007-09-26 00:00:00 -07:00
6
+ version: 1.4.2
7
+ date: 2007-10-18 00:00:00 +04:00
8
8
  summary: Interface classes for the Amazon EC2, SQS, and S3 Web Services
9
9
  require_paths:
10
10
  - lib
@@ -75,7 +75,7 @@ dependencies:
75
75
  requirements:
76
76
  - - ">="
77
77
  - !ruby/object:Gem::Version
78
- version: 0.1.4
78
+ version: 1.2.0
79
79
  version:
80
80
  - !ruby/object:Gem::Dependency
81
81
  name: hoe