right_aws 1.3.0 → 1.4.2

Sign up to get free protection for your applications and to get access to all the features.
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