aws-sdk 1.5.4 → 1.5.5

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.
@@ -92,12 +92,13 @@ module AWS
92
92
 
93
93
  begin
94
94
  http_response = self.class.send(method, url, opts)
95
+ unless http_response.nil?
96
+ response.body = http_response.body
97
+ response.status = http_response.code.to_i
98
+ response.headers = http_response.to_hash
99
+ end
95
100
  rescue Timeout::Error, Errno::ETIMEDOUT => e
96
101
  response.timeout = true
97
- else
98
- response.body = http_response.body
99
- response.status = http_response.code.to_i
100
- response.headers = http_response.to_hash
101
102
  end
102
103
  end
103
104
  end
@@ -17,17 +17,28 @@ module AWS
17
17
  module Core
18
18
  module Http
19
19
 
20
- # The default http request handler for the aws-sdk gem. It is based
21
- # on Net::Http.
20
+ # = NetHttpHandler
21
+ #
22
+ # This is the default HTTP handler for the aws-sdk gem. It uses
23
+ # Ruby's Net::HTTP to make requests. It uses persistent connections
24
+ # and a connection pool.
25
+ #
22
26
  class NetHttpHandler
23
27
 
24
- @@pool = Net::HTTP::ConnectionPool.new
25
-
26
- # @private
27
- def self.pool
28
- @@pool
28
+ # (see Net::HTTP::ConnectionPool.new)
29
+ def initialize options = {}
30
+ @pool = Net::HTTP::ConnectionPool.new(options)
29
31
  end
32
+
33
+ # @return [Net::HTTP::ConnectionPool]
34
+ attr_reader :pool
30
35
 
36
+ # Given a populated request object and an empty response object,
37
+ # this method will make the request and them populate the
38
+ # response.
39
+ # @param [Request] request
40
+ # @param [Response] response
41
+ # @return [nil]
31
42
  def handle request, response
32
43
 
33
44
  options = {}
@@ -38,23 +49,28 @@ module AWS
38
49
  options[:ssl_ca_file] = request.ssl_ca_file if request.ssl_ca_file
39
50
  options[:ssl_ca_path] = request.ssl_ca_path if request.ssl_ca_path
40
51
 
41
- connection = self.class.pool.connection_for(request.host, options)
52
+ connection = pool.connection_for(request.host, options)
42
53
  connection.read_timeout = request.read_timeout
43
54
 
44
55
  begin
45
- http_response = connection.request(build_request(request))
56
+ http_response = connection.request(build_net_http_request(request))
46
57
  response.body = http_response.body
47
58
  response.status = http_response.code.to_i
48
59
  response.headers = http_response.to_hash
49
60
  rescue Timeout::Error, Errno::ETIMEDOUT => e
50
61
  response.timeout = true
51
62
  end
63
+ nil
52
64
 
53
65
  end
54
66
 
55
- # @private
56
67
  protected
57
- def build_request request
68
+
69
+ # Given an AWS::Core::HttpRequest, this method translates
70
+ # it into a Net::HTTPRequest (Get, Put, Post, Head or Delete).
71
+ # @param [Request]
72
+ # @return [Net::HTTPRequest]
73
+ def build_net_http_request request
58
74
 
59
75
  # Net::HTTP adds a content-type header automatically unless its set
60
76
  # and this messes with request signature signing. Also, it expects
@@ -64,16 +80,16 @@ module AWS
64
80
  headers[key] = value.to_s
65
81
  end
66
82
 
67
- req_class = case request.http_method
83
+ request_class = case request.http_method
68
84
  when 'GET' then Net::HTTP::Get
69
85
  when 'PUT' then Net::HTTP::Put
70
86
  when 'POST' then Net::HTTP::Post
71
87
  when 'HEAD' then Net::HTTP::Head
72
88
  when 'DELETE' then Net::HTTP::Delete
73
89
  else raise "unsupported http method: #{request.http_method}"
74
- end
90
+ end
75
91
 
76
- net_http_req = req_class.new(request.uri, headers)
92
+ net_http_req = request_class.new(request.uri, headers)
77
93
  net_http_req.body = request.body
78
94
  net_http_req
79
95
 
@@ -30,13 +30,13 @@ module AWS
30
30
  @params = []
31
31
  @use_ssl = true
32
32
  @port = nil
33
- @read_timeout = 60
33
+ @default_read_timeout = 60
34
34
  end
35
35
 
36
36
  # @return [Integer] The number of seconds the service has to respond
37
37
  # before a timeout error is raised on the request. Defaults to
38
38
  # 60 seconds.
39
- attr_accessor :read_timeout
39
+ attr_accessor :default_read_timeout
40
40
 
41
41
  # @return [String] The snake-cased ruby name for the service
42
42
  # (e.g. 's3', 'iam', 'dynamo_db', etc).
@@ -69,6 +69,14 @@ module AWS
69
69
  # @return [String]
70
70
  # @private
71
71
  attr_accessor :access_key_id
72
+
73
+ # Some subclasses override this method to obseve requirements
74
+ # set by the services (e.q. SimpleWorlfow and SQS have special
75
+ # long-pulling requirements and require special read timeouts).
76
+ # @private
77
+ def read_timeout
78
+ default_read_timeout
79
+ end
72
80
 
73
81
  # @param [Boolean] state If the request should be sent over ssl or not.
74
82
  def use_ssl= state
@@ -17,21 +17,24 @@ module AWS
17
17
  # @private
18
18
  module Inflection
19
19
 
20
- def ruby_name(aws_name)
20
+ def ruby_name aws_name
21
21
 
22
- #aws_name.sub(/^.*:/, '').
23
- # gsub(/[A-Z]+[a-z]+/){|str| "_#{str.downcase}_" }.
24
- # gsub(/(^_|_$)/, '').
25
- # gsub(/__/, '_').
26
- # downcase
22
+ inflector = Hash.new do |hash,key|
27
23
 
28
- return 'etag' if aws_name == 'ETag'
24
+ key.
25
+ sub(/^.*:/, ''). # strip namespace
26
+ gsub(/([A-Z0-9]+)([A-Z][a-z])/, '\1_\2'). # split acronyms from words
27
+ scan(/[a-z]+|\d+|[A-Z0-9]+[a-z]*/). # split remaining words
28
+ join('_').downcase # join parts _ and downcase
29
29
 
30
- aws_name.
31
- sub(/^.*:/, ''). # strip namespace
32
- gsub(/([A-Z0-9]+)([A-Z][a-z])/, '\1_\2'). # split acronyms from words
33
- scan(/[a-z]+|\d+|[A-Z0-9]+[a-z]*/). # split remaining words
34
- join('_').downcase # join parts _ and downcase
30
+ end
31
+
32
+ # add a few irregular inflections
33
+ inflector['ETag'] = 'etag'
34
+ inflector['s3Bucket'] = 's3_bucket'
35
+ inflector['s3Key'] = 's3_key'
36
+
37
+ inflector[aws_name]
35
38
 
36
39
  end
37
40
  module_function :ruby_name
@@ -171,6 +171,12 @@ module AWS
171
171
  pattern.gsub(/:(\w+)/) {|sym| send("_#{sym[1..-1]}", response) }
172
172
  end
173
173
 
174
+ # @private
175
+ def eql? other
176
+ other.is_a?(self.class) and other.pattern == self.pattern
177
+ end
178
+ alias_method :==, :eql?
179
+
174
180
  protected
175
181
 
176
182
  def method_missing method_name, *args
@@ -390,9 +390,13 @@ module AWS
390
390
 
391
391
  attr = @klass.attributes[attr_name]
392
392
 
393
- method = options[:get_as] || attr.get_as
394
-
395
- v = resp_obj.key?(method) ? resp_obj[method] : resp_obj[method.to_s]
393
+ methods = [options[:get_as] || attr.get_as].flatten
394
+
395
+ v = resp_obj
396
+ methods.each do |method|
397
+ v = v.key?(method) ? v[method] : v[method.to_s]
398
+ break if v.nil?
399
+ end
396
400
  v = v[:value] if v and options[:value_wrapped]
397
401
  v = attr.translate_output_value(v)
398
402
 
@@ -45,10 +45,10 @@ module AWS
45
45
  # to AWS.config when not provided.
46
46
  #
47
47
  def initialize options = {}
48
- @config = options[:config]
49
- @config ||= AWS.config
48
+ options = options.dup
49
+ @config = (options.delete(:config) || AWS.config)
50
50
  @config = @config.with(options)
51
- @client = config.send(Inflection.ruby_name(self.class.to_s) + '_client')
51
+ @client = @config.send(Inflection.ruby_name(self.class.to_s) + '_client')
52
52
  end
53
53
 
54
54
  # @return [String]
data/lib/aws/ec2.rb CHANGED
@@ -247,6 +247,8 @@ module AWS
247
247
  autoload :ElasticIp, 'elastic_ip'
248
248
  autoload :ElasticIpCollection, 'elastic_ip_collection'
249
249
  autoload :Errors, 'errors'
250
+ autoload :ExportTask, 'export_task'
251
+ autoload :ExportTaskCollection, 'export_task_collection'
250
252
  autoload :FilteredCollection, 'filtered_collection'
251
253
  autoload :HasPermissions, 'has_permissions'
252
254
  autoload :Image, 'image'
@@ -427,5 +429,10 @@ module AWS
427
429
  VPNConnectionCollection.new(:config => config)
428
430
  end
429
431
 
432
+ # @return [ExportTaskCollection]
433
+ def export_tasks
434
+ ExportTaskCollection.new(:config => config)
435
+ end
436
+
430
437
  end
431
438
  end
@@ -428,6 +428,21 @@ module AWS
428
428
  #
429
429
  define_client_method :cancel_conversion_task, 'CancelConversionTask'
430
430
 
431
+ # Calls the CancelExportTask API operation.
432
+ # @method cancel_export_task(options = {})
433
+ #
434
+ # === Options:
435
+ #
436
+ # * +:export_task_id+ - *required* - (String)
437
+ #
438
+ # === Response Structure:
439
+ #
440
+ # This method returns no response data.
441
+ #
442
+ # @return [Core::Response]
443
+ #
444
+ define_client_method :cancel_export_task, 'CancelExportTask'
445
+
431
446
  # Calls the CancelSpotInstanceRequests API operation.
432
447
  # @method cancel_spot_instance_requests(options = {})
433
448
  #
@@ -544,6 +559,41 @@ module AWS
544
559
  #
545
560
  define_client_method :create_image, 'CreateImage'
546
561
 
562
+ # Calls the CreateInstanceExportTask API operation.
563
+ # @method create_instance_export_task(options = {})
564
+ #
565
+ # === Options:
566
+ #
567
+ # * +:description+ - (String)
568
+ # * +:instance_id+ - *required* - (String)
569
+ # * +:target_environment+ - *required* - (String)
570
+ # * +:export_to_s3+ - (Hash)
571
+ # * +:disk_image_format+ - (String)
572
+ # * +:container_format+ - (String)
573
+ # * +:s3_bucket+ - *required* - (String)
574
+ # * +:s3_prefix+ - (String)
575
+ #
576
+ # === Response Structure:
577
+ #
578
+ # * +:request_id+ - (String)
579
+ # * +:export_task+ - (Hash)
580
+ # * +:export_task_id+ - (String)
581
+ # * +:description+ - (String)
582
+ # * +:state+ - (String)
583
+ # * +:status_message+ - (String)
584
+ # * +:instance_export+ - (Hash)
585
+ # * +:instance_id+ - (String)
586
+ # * +:target_environment+ - (String)
587
+ # * +:export_to_s3+ - (Hash)
588
+ # * +:disk_image_format+ - (String)
589
+ # * +:container_format+ - (String)
590
+ # * +:s3_bucket+ - (String)
591
+ # * +:s3_key+ - (String)
592
+ #
593
+ # @return [Core::Response]
594
+ #
595
+ define_client_method :create_instance_export_task, 'CreateInstanceExportTask'
596
+
547
597
  # Calls the CreateInternetGateway API operation.
548
598
  # @method create_internet_gateway(options = {})
549
599
  #
@@ -1588,6 +1638,34 @@ module AWS
1588
1638
  #
1589
1639
  define_client_method :describe_dhcp_options, 'DescribeDhcpOptions'
1590
1640
 
1641
+ # Calls the DescribeExportTasks API operation.
1642
+ # @method describe_export_tasks(options = {})
1643
+ #
1644
+ # === Options:
1645
+ #
1646
+ # * +:export_task_ids+ - (Array<String>)
1647
+ #
1648
+ # === Response Structure:
1649
+ #
1650
+ # * +:request_id+ - (String)
1651
+ # * +:export_task_set+ - (Array<Hash>)
1652
+ # * +:export_task_id+ - (String)
1653
+ # * +:description+ - (String)
1654
+ # * +:state+ - (String)
1655
+ # * +:status_message+ - (String)
1656
+ # * +:instance_export+ - (Hash)
1657
+ # * +:instance_id+ - (String)
1658
+ # * +:target_environment+ - (String)
1659
+ # * +:export_to_s3+ - (Hash)
1660
+ # * +:disk_image_format+ - (String)
1661
+ # * +:container_format+ - (String)
1662
+ # * +:s3_bucket+ - (String)
1663
+ # * +:s3_key+ - (String)
1664
+ #
1665
+ # @return [Core::Response]
1666
+ #
1667
+ define_client_method :describe_export_tasks, 'DescribeExportTasks'
1668
+
1591
1669
  # Calls the DescribeImageAttribute API operation.
1592
1670
  # @method describe_image_attribute(options = {})
1593
1671
  #
@@ -2986,7 +3064,8 @@ module AWS
2986
3064
  # Amazon EBS volume is deleted on instance termination.
2987
3065
  # * +:no_device+ - (String) Specifies the device name to suppress
2988
3066
  # during instance launch.
2989
- # * +:monitoring+ - (Boolean)
3067
+ # * +:monitoring+ - (Hash)
3068
+ # * +:enabled+ - (Boolean)
2990
3069
  # * +:subnet_id+ - (String)
2991
3070
  # * +:disable_api_termination+ - (Boolean)
2992
3071
  # * +:instance_initiated_shutdown_behavior+ - (String)
@@ -0,0 +1,120 @@
1
+ # Copyright 2011-2012 Amazon.com, Inc. or its affiliates. All Rights Reserved.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License"). You
4
+ # may not use this file except in compliance with the License. A copy of
5
+ # the License is located at
6
+ #
7
+ # http://aws.amazon.com/apache2.0/
8
+ #
9
+ # or in the "license" file accompanying this file. This file is
10
+ # distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
11
+ # ANY KIND, either express or implied. See the License for the specific
12
+ # language governing permissions and limitations under the License.
13
+
14
+ module AWS
15
+ class EC2
16
+
17
+ # @attr_reader [String] description
18
+ # Description of the resource being exported.
19
+ #
20
+ # @attr_reader [Symbol] state State of the conversion task.
21
+ # Valid values :active, :cancelling, :cancelled and :completed.
22
+ #
23
+ # @attr_reader [String] status_message Status message related to the
24
+ # export task.
25
+ #
26
+ # @attr_reader [String] instance_id ID of instance being exported.
27
+ #
28
+ # @attr_reader [String] target_environment The target virtualization
29
+ # environment.
30
+ #
31
+ # @attr_reader [String] disk_image_format The format for the exported
32
+ # image.
33
+ #
34
+ # @attr_reader [String] container_format The container format used to
35
+ # combine disk images with metadata (such as OVF).
36
+ #
37
+ # @attr_reader [String] s3_bucket The name of the Amazon S3 bucket
38
+ # the image will be exported to.
39
+ #
40
+ # @attr_reader [String] s3_key The key of the Amazon S3 object
41
+ # the image will be exported to.
42
+ #
43
+ class ExportTask < Resource
44
+
45
+ # @private
46
+ def initialize export_task_id, options = {}
47
+ @export_task_id = export_task_id
48
+ super
49
+ end
50
+
51
+ # @return [String]
52
+ attr_reader :export_task_id
53
+
54
+ alias_method :id, :export_task_id
55
+
56
+ attribute :description, :static => true
57
+
58
+ attribute :state, :to_sym => true
59
+
60
+ attribute :status_message
61
+
62
+ attribute :instance_id,
63
+ :as => [:instance_export, :instance_id],
64
+ :static => true
65
+
66
+ attribute :target_environment,
67
+ :as => [:instance_export, :target_environment],
68
+ :static => true
69
+
70
+ attribute :disk_image_format,
71
+ :as => [:export_to_s3, :disk_image_format],
72
+ :static => true
73
+
74
+ attribute :container_format,
75
+ :as => [:export_to_s3, :container_format],
76
+ :static => true
77
+
78
+ attribute :s3_bucket_name,
79
+ :as => [:export_to_s3, :s3_bucket],
80
+ :static => true
81
+
82
+ attribute :s3_key,
83
+ :as => [:export_to_s3, :s3_key],
84
+ :static => true
85
+
86
+ populates_from(:create_instance_export_task) do |resp|
87
+ resp[:export_task] if resp[:export_task][:export_task_id] == id
88
+ end
89
+
90
+ populates_from(:describe_export_tasks) do |resp|
91
+ resp[:export_task_set].find do |task|
92
+ task[:export_task_id] == id
93
+ end
94
+ end
95
+
96
+ # @return [Instance]
97
+ def instance
98
+ Instance.new(instance_id, :config => config)
99
+ end
100
+
101
+ # @return [S3::Bucket]
102
+ def s3_bucket
103
+ S3::Bucket.new(s3_bucket_name, :config => config)
104
+ end
105
+
106
+ # @return [S3::S3Object]
107
+ def s3_object
108
+ s3_bucket.objects[s3_key]
109
+ end
110
+
111
+ # Cancels the export task.
112
+ # @return [nil]
113
+ def cancel
114
+ client.cancel_export_task(:export_task_id => export_task_id)
115
+ nil
116
+ end
117
+
118
+ end
119
+ end
120
+ end