aws-sdk 1.5.8 → 1.6.0

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.
Files changed (53) hide show
  1. data/lib/aws.rb +2 -0
  2. data/lib/aws/api_config/Route53-2012-02-29.yml +348 -0
  3. data/lib/aws/auto_scaling/client.rb +362 -588
  4. data/lib/aws/cloud_formation/client.rb +155 -224
  5. data/lib/aws/cloud_watch/client.rb +156 -229
  6. data/lib/aws/core.rb +67 -52
  7. data/lib/aws/core/client.rb +81 -82
  8. data/lib/aws/core/collection/with_limit_and_next_token.rb +2 -2
  9. data/lib/aws/core/configuration.rb +75 -72
  10. data/lib/aws/core/http/net_http_handler.rb +3 -3
  11. data/lib/aws/core/http/request.rb +107 -138
  12. data/lib/aws/core/inflection.rb +3 -3
  13. data/lib/aws/core/json_client.rb +106 -0
  14. data/lib/aws/core/option_grammar.rb +10 -1
  15. data/lib/aws/core/options/validator.rb +140 -0
  16. data/lib/aws/core/options/xml_serializer.rb +98 -0
  17. data/lib/aws/core/query_client.rb +131 -0
  18. data/lib/aws/core/rest_client.rb +90 -0
  19. data/lib/aws/core/rest_client/input_handler.rb +145 -0
  20. data/lib/aws/core/rest_client/output_handler.rb +43 -0
  21. data/lib/aws/core/signature/version_2.rb +7 -7
  22. data/lib/aws/core/signature/version_3.rb +5 -1
  23. data/lib/aws/core/signature/version_3_https.rb +51 -0
  24. data/lib/aws/core/signature/version_4.rb +5 -22
  25. data/lib/aws/core/signer.rb +1 -1
  26. data/lib/aws/core/uri_escape.rb +2 -0
  27. data/lib/aws/core/xml/frame.rb +8 -8
  28. data/lib/aws/core/xml/grammar.rb +8 -3
  29. data/lib/aws/dynamo_db/client.rb +600 -662
  30. data/lib/aws/ec2/client.rb +2688 -3492
  31. data/lib/aws/ec2/request.rb +0 -1
  32. data/lib/aws/elb/client.rb +280 -407
  33. data/lib/aws/emr/client.rb +7 -7
  34. data/lib/aws/iam/client.rb +822 -1268
  35. data/lib/aws/route_53.rb +71 -0
  36. data/lib/aws/route_53/client.rb +272 -0
  37. data/lib/aws/route_53/config.rb +18 -0
  38. data/lib/aws/route_53/errors.rb +22 -0
  39. data/lib/aws/route_53/request.rb +23 -0
  40. data/lib/aws/s3/object_version_collection.rb +6 -6
  41. data/lib/aws/s3/paginated_collection.rb +1 -1
  42. data/lib/aws/s3/request.rb +10 -5
  43. data/lib/aws/simple_db/client.rb +184 -234
  44. data/lib/aws/simple_email_service/client.rb +147 -238
  45. data/lib/aws/simple_workflow/client.rb +997 -1191
  46. data/lib/aws/sns/client.rb +176 -264
  47. data/lib/aws/sqs/client.rb +162 -253
  48. data/lib/aws/sqs/queue.rb +1 -1
  49. data/lib/aws/sqs/request.rb +4 -0
  50. data/lib/aws/sts/client.rb +57 -66
  51. metadata +95 -71
  52. data/lib/aws/core/client/query_json.rb +0 -112
  53. data/lib/aws/core/client/query_xml.rb +0 -122
@@ -23,9 +23,9 @@ module AWS
23
23
 
24
24
  key.
25
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
26
+ gsub(/([A-Z0-9]+)([A-Z][a-z])/, '\1_\2'). # split acronyms
27
+ scan(/[a-z]+|\d+|[A-Z0-9]+[a-z]*/). # split words
28
+ join('_').downcase # join parts
29
29
 
30
30
  end
31
31
 
@@ -0,0 +1,106 @@
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
+ require 'json'
15
+
16
+ module AWS
17
+ module Core
18
+
19
+ # = AWS::Core::Client::JSON
20
+ #
21
+ # Clients extend this module if the service they represent are
22
+ # AWS Query services that accept and return JSON.
23
+ #
24
+ module JSONClient
25
+
26
+ # Constructs the option grammars, one per service operation.
27
+ # @private
28
+ def self.extended base
29
+ base.send(:include, ErrorParser)
30
+ base.send(:define_grammars)
31
+ end
32
+
33
+ # @return [Hash<Symbol,OptionGrammar>] Returns a hash option
34
+ # grammars. Keys are method names (operations) and values are
35
+ # request option grammars that convert a ruby hash of options
36
+ # into a JSON document.
37
+ # @private
38
+ def option_grammars
39
+ @option_grammars ||= {}
40
+ end
41
+
42
+ protected
43
+
44
+ # Enumerates through the operations specified in the API
45
+ # configuration (yaml configuration file found in lib/api_config/)
46
+ # and defines one request method per operation.
47
+ def define_grammars
48
+ api_config[:operations].each do |op|
49
+ option_grammars[op[:method]] = OptionGrammar.customize(op[:inputs])
50
+ end
51
+ end
52
+
53
+ def define_client_method method_name, operation
54
+ add_client_request_method(method_name) do
55
+
56
+ configure_request do |request, options|
57
+
58
+ parser = self.class.option_grammars[method_name]
59
+ x_amz_target = self.class::TARGET_PREFIX + operation
60
+
61
+ request.headers["content-type"] = "application/x-amz-json-1.0"
62
+ request.headers["x-amz-target"] = x_amz_target
63
+ request.body = parser.to_json(options)
64
+
65
+ end
66
+
67
+ process_response do |response|
68
+ response_body = response.http_response.body
69
+ response_body = "{}" if response_body == ""
70
+ data = ::JSON.load(response_body)
71
+ MetaUtils.extend_method(response, :data) { data }
72
+ end
73
+
74
+ simulate_response do |response|
75
+ data = {}
76
+ MetaUtils.extend_method(response, :data) { data }
77
+ end
78
+
79
+ end
80
+ end
81
+
82
+ module ErrorParser
83
+
84
+ def extract_error_details response
85
+ if
86
+ response.http_response.status >= 300 and
87
+ body = response.http_response.body and
88
+ json = (::JSON.load(body) rescue nil) and
89
+ type = json["__type"] and
90
+ matches = type.match(/\#(.*)$/)
91
+ then
92
+ code = matches[1]
93
+ if code == 'RequestEntityTooLarge'
94
+ message = 'Request body must be less than 1 MB'
95
+ else
96
+ message = json['message']
97
+ end
98
+ [code, message]
99
+ end
100
+ end
101
+
102
+ end
103
+
104
+ end
105
+ end
106
+ end
@@ -211,8 +211,17 @@ module AWS
211
211
  def apply(option, member_descriptors)
212
212
  super(option)
213
213
  member_option = option.member_option if option.respond_to?(:member_option)
214
+
215
+ # ignoring member name descriptors for lists, only useful for rest
216
+ descriptors = []
217
+ member_descriptors.each do |descriptor|
218
+ unless descriptor.is_a?(Hash) and descriptor[:member_name]
219
+ descriptors << descriptor
220
+ end
221
+ end
222
+
214
223
  member_option ||= ListMember.new
215
- member_option = member_option.extend_with_config(*member_descriptors)
224
+ member_option = member_option.extend_with_config(*descriptors)
216
225
  MetaUtils.extend_method(option, :member_option) { member_option }
217
226
  end
218
227
 
@@ -0,0 +1,140 @@
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
+ module Core
16
+ module Options
17
+
18
+ # Given a hash of validation rules, a validator validate request
19
+ # options. Validations support:
20
+ #
21
+ # * rejecting unknown options
22
+ # * ensuring presence of required options
23
+ # * validating expected option types (e.g. hash, array, string,
24
+ # integer, etc).
25
+ #
26
+ # After validating, a hash of request options is returned with
27
+ # with normalized values (with converted types).
28
+ class Validator
29
+
30
+ # @param [Hash] rules A hash of option rules to validate against.
31
+ def initialize rules
32
+ @rules = rules
33
+ end
34
+
35
+ # @return [Hash]
36
+ attr_reader :rules
37
+
38
+ # @overload validate!(request_options)
39
+ # @param [Hash] request_options The hash of options to validate.
40
+ # @raise [ArgumentError] Raised when the options do not validate.
41
+ # @return [Hash]
42
+ def validate! request_options, rules = @rules
43
+
44
+ # Verify all required options are present.
45
+ rules.each_pair do |opt_name, opt_rules|
46
+ if opt_rules[:required]
47
+ unless request_options.key?(opt_name)
48
+ raise ArgumentError, "missing required option :#{opt_name}"
49
+ end
50
+ end
51
+ end
52
+
53
+ request_options.inject({}) do |options, (opt_name, value)|
54
+
55
+ # Ensure this is a valid/accepted option
56
+ unless rules.key?(opt_name)
57
+ raise ArgumentError, "unexpected option #{opt_name.inspect}"
58
+ end
59
+
60
+ # Validate and convert the value
61
+ valid_value = validate_value(rules[opt_name], value, opt_name)
62
+
63
+ options.merge(opt_name => valid_value)
64
+
65
+ end
66
+ end
67
+
68
+ protected
69
+
70
+ # Proxies calls to the correct validation method based on the
71
+ # rules[:type].
72
+ def validate_value *args
73
+ send("validate_#{args.first[:type]}", *args)
74
+ end
75
+
76
+ # Ensures the value is a hash and validates the hash context.
77
+ def validate_hash rules, value, opt_name, context = nil
78
+ unless value.respond_to?(:to_hash)
79
+ format_error('hash value', opt_name, context)
80
+ end
81
+ validate!(value.to_hash, rules[:members])
82
+ end
83
+
84
+ # Ensures the value is an array (or at least enumerable) and
85
+ # that the yielded values are valid.
86
+ def validate_array rules, value, opt_name, context = nil
87
+ unless value.respond_to?(:each)
88
+ format_error('enumerable value', opt_name, context)
89
+ end
90
+ values = []
91
+ value.each do |v|
92
+ context = "member #{values.size} of :#{opt_name}"
93
+ values << validate_value(rules[:members], v, opt_name, context)
94
+ end
95
+ values
96
+ end
97
+
98
+ # Ensures the value is a string.
99
+ def validate_string rules, value, opt_name, context = nil
100
+
101
+ unless value.respond_to?(:to_str)
102
+ format_error('string value', opt_name, context)
103
+ end
104
+
105
+ rules[:lstrip] ?
106
+ value.to_str.sub(/^#{rules[:lstrip]}/, '') :
107
+ value.to_str
108
+ end
109
+
110
+ # Ensures the value is a boolean.
111
+ def validate_boolean rules, value, opt_name, context = nil
112
+ unless [true, false].include?(value)
113
+ format_error('true or false', opt_name, context)
114
+ end
115
+ value
116
+ end
117
+
118
+ # Ensures the value is an integer.
119
+ def validate_integer rules, value, opt_name, context = nil
120
+ unless value.respond_to?(:to_int)
121
+ format_error('integer value', opt_name, context)
122
+ end
123
+ value.to_int
124
+ end
125
+
126
+ # Ensures the value is a timestamp.
127
+ def validate_timestamp rules, value, opt_name, context = nil
128
+ # TODO : add validation to timestamps values
129
+ value.to_s
130
+ end
131
+
132
+ def format_error description, opt_name, context
133
+ context = context || "option :#{opt_name}"
134
+ raise ArgumentError, "expected #{description} for #{context}"
135
+ end
136
+
137
+ end
138
+ end
139
+ end
140
+ end
@@ -0,0 +1,98 @@
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
+ require 'builder'
15
+
16
+ module AWS
17
+ module Core
18
+ module Options
19
+
20
+ # Given a hash of serialization rules, an XMLSerializer can convert
21
+ # a hash of request options into XML. The request options are
22
+ # validated before returning XML.
23
+ class XMLSerializer
24
+
25
+ # @param [String] namespace
26
+ # @param [String] operation_name
27
+ # @param [Hash] rules A hash of option rules to validate against.
28
+ def initialize namespace, operation_name, rules
29
+ @namespace = namespace
30
+ @operation_name = operation_name
31
+ @rules = rules
32
+ @validator = Validator.new(rules)
33
+ end
34
+
35
+ # @return [String] Returns the name of the API operation.
36
+ attr_reader :operation_name
37
+
38
+ # @return [String]
39
+ attr_reader :namespace
40
+
41
+ # @return [Hash]
42
+ attr_reader :rules
43
+
44
+ # @return [Validator]
45
+ attr_reader :validator
46
+
47
+ # @overload serialize!(request_options)
48
+ # @param [Hash] request_options A hash of already validated
49
+ # request options with normalized values.
50
+ # @return [String] Returns an string of the request parameters
51
+ # serialized into XML.
52
+ def serialize request_options
53
+ xml = []
54
+ builder = Builder::XmlMarkup.new(:target => xml, :indent => 2)
55
+ builder.tag!("#{operation_name}Request", :xmlns => namespace) do
56
+ request_options.each_pair do |opt_name, opt_value|
57
+ to_xml(builder, opt_name, rules[opt_name], opt_value)
58
+ end
59
+ end
60
+ xml.join
61
+ end
62
+
63
+ protected
64
+
65
+ # @param [Builder::XmlMarkup] builder An XML builder object that should
66
+ # be used to build the xml.
67
+ # @param [String,Symbol] opt_name The name of the input option.
68
+ # @param [Hash] rules The hash to XML conversion rules.
69
+ # @param [Mixed] value
70
+ # @return [String] Returns an XML string.
71
+ def to_xml builder, opt_name, rules, value
72
+
73
+ xml_name = rules[:name]
74
+ xml_name ||= opt_name.is_a?(String) ?
75
+ opt_name : Inflection.class_name(opt_name.to_s)
76
+
77
+ case value
78
+ when Hash
79
+ builder.tag!(xml_name) do
80
+ value.each_pair do |m_name, m_value|
81
+ to_xml(builder, m_name, rules[:members][m_name], m_value)
82
+ end
83
+ end
84
+ when Array
85
+ builder.tag!(xml_name) do
86
+ value.each do |member_value|
87
+ to_xml(builder, 'member', rules[:members], member_value)
88
+ end
89
+ end
90
+ else builder.tag!(xml_name, value)
91
+ end
92
+
93
+ end
94
+
95
+ end
96
+ end
97
+ end
98
+ end
@@ -0,0 +1,131 @@
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
+ #me Copyright 2011-2012 Amazon.com, Inc. or its affiliates. All Rights Reserved.
15
+ #
16
+ # Licensed under the Apache License, Version 2.0 (the "License"). You
17
+ # may not use this file except in compliance with the License. A copy of
18
+ # the License is located at
19
+ #
20
+ # http://aws.amazon.com/apache2.0/
21
+ #
22
+ # or in the "license" file accompanying this file. This file is
23
+ # distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
24
+ # ANY KIND, either express or implied. See the License for the specific
25
+ # language governing permissions and limitations under the License.
26
+
27
+ module AWS
28
+ module Core
29
+
30
+ # When a client class extends this module, its API configuration
31
+ # is parsed. For each operation in the API configuration, one
32
+ # client method is added.
33
+ #
34
+ # Clients extending Query all have in common their method
35
+ # of serializing request (input) paramters and parsing response
36
+ # (output) XML.
37
+ #
38
+ module QueryClient
39
+
40
+ # @private
41
+ def self.extended base
42
+ base.send(:include, ErrorParser)
43
+ base.send(:define_parsers)
44
+ end
45
+
46
+ # @return [Hash<Symbol,OptionGrammar>] Returns a hash option
47
+ # parsers. Hash keys are client method names and hash
48
+ # values are {OptionGrammar} objects.
49
+ # @private
50
+ def option_parsers
51
+ @option_parsers ||= {}
52
+ end
53
+
54
+ # @return [Hash<Symbol,XML::Parser>] Returns a hash of xml
55
+ # parsers. Hash keys are client method names and hash
56
+ # values are {XML::Parser} objects.
57
+ # @private
58
+ def xml_parsers
59
+ @xml_parsers ||= {}
60
+ end
61
+
62
+ protected
63
+
64
+ # Enumerates through the operations specified in the API
65
+ # configuration (yaml configuration file found in lib/api_config/)
66
+ # and defines one request method per operation.
67
+ def define_parsers
68
+ api_config[:operations].each do |op|
69
+
70
+ method_name = op[:method]
71
+
72
+ option_parsers[method_name] = OptionGrammar.customize(op[:inputs])
73
+ xml_parsers[method_name] = XML::Parser.new(op[:outputs])
74
+
75
+ end
76
+ end
77
+
78
+ def define_client_method method_name, operation_name
79
+ add_client_request_method(method_name) do
80
+
81
+ configure_request do |request, options|
82
+
83
+ now = Time.now.utc.strftime('%Y-%m-%dT%H:%M:%SZ')
84
+
85
+ request.headers['Content-Type'] =
86
+ "application/x-www-form-urlencoded; charset=utf-8"
87
+
88
+ request.add_param 'Timestamp', now
89
+ request.add_param 'Version', self.class::API_VERSION
90
+ request.add_param 'Action', operation_name
91
+
92
+ parser = self.class.option_parsers[method_name]
93
+ parser.request_params(options).each do |param|
94
+ request.add_param(param)
95
+ end
96
+
97
+ end
98
+
99
+ process_response do |response|
100
+ parser = self.class.xml_parsers[method_name]
101
+ response.data = parser.parse(response.http_response.body)
102
+ end
103
+
104
+ simulate_response do |response|
105
+ parser = self.class.xml_parsers[method_name]
106
+ response.data = parser.simulate
107
+ end
108
+
109
+ end
110
+ end
111
+
112
+ module ErrorParser
113
+
114
+ protected
115
+
116
+ def extract_error_details response
117
+ if
118
+ response.http_response.status >= 300 and
119
+ body = response.http_response.body and
120
+ error = errors_module::GRAMMAR.parse(body) and
121
+ error[:code]
122
+ then
123
+ [error[:code], error[:message]]
124
+ end
125
+ end
126
+
127
+ end
128
+
129
+ end
130
+ end
131
+ end