miasma-aws 0.1.22 → 0.1.24

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b255feb4bbbd9158ce1928df6b560eafc4b481c5
4
- data.tar.gz: 7d54dcb2b4b96012cab3e13d89a772604d9b378d
3
+ metadata.gz: 7d85deafb276b73b989ef3d36568de4b167c9b66
4
+ data.tar.gz: b5e8c03917f79eab1054abc8d6f60d87336659ce
5
5
  SHA512:
6
- metadata.gz: 32ab9151988b38628bec1e50b96e3cc360624c04d656e7c959586a31e6c6bac8d4a5d5e17d2fb47108b01d6ef0dabfa7ecf97036841a29e1e54573453bbdbdcf
7
- data.tar.gz: e3ceba8f15b6679679f333676a89fe7caa4ef250a047b75fcd5df15761ac50b42e46661cf15180957fed7af107dcabd91a68970aa548261ea546e2257d20b36a
6
+ metadata.gz: 61c9b43c6f169e567f42f63e2fff72f158976e71bbbe89eab08029129c142360b7a27c6dd92060eccfa3141119f3d84cf2a93bda2d0ef896b7de28d92505e42c
7
+ data.tar.gz: b1c62ce90ebeff0cd4770ba20cf26bfa521f6f2e5bc72a91ffcddf0bbe43da1abbc4c52964f91de3ecc92e20572b0280ac2d93fc055ccaa13db3b07022418461
data/CHANGELOG.md CHANGED
@@ -1,3 +1,8 @@
1
+ # v0.1.24
2
+ * Fix token usage causing request errors
3
+ * Tune retry behavior to isolate valid retry requests
4
+ * Properly pass external ID and session name through for STS
5
+
1
6
  # v0.1.22
2
7
  * Fix instance profile credential auto loading
3
8
  * Add support for region auto-detection when using instance profiles
@@ -25,10 +25,7 @@ module Miasma
25
25
  req_params = Smash.new.tap do |params|
26
26
  params['Action'] = 'AssumeRole'
27
27
  params['RoleArn'] = role_arn
28
- params['RoleSessionName'] = args.fetch(
29
- :session_name,
30
- SecureRandom.uuid.tr('-', '')
31
- )
28
+ params['RoleSessionName'] = args[:session_name] || SecureRandom.uuid.tr('-', '')
32
29
  params['ExternalId'] = args[:external_id] if args[:external_id]
33
30
  end
34
31
  result = request(
@@ -1,4 +1,4 @@
1
1
  module MiasmaAws
2
2
  # Current library version
3
- VERSION = Gem::Version.new('0.1.22')
3
+ VERSION = Gem::Version.new('0.1.24')
4
4
  end
@@ -335,6 +335,7 @@ module Miasma
335
335
  attribute :aws_sts_role_arn, String
336
336
  attribute :aws_sts_external_id, String
337
337
  attribute :aws_sts_role_session_name, String
338
+ attribute :aws_sts_region, String
338
339
  attribute :aws_credentials_file, String, :required => true, :default => File.join(Dir.home, '.aws/credentials')
339
340
  attribute :aws_config_file, String, :required => true, :default => File.join(Dir.home, '.aws/config')
340
341
  attribute :aws_access_key_id, String, :required => true
@@ -470,7 +471,11 @@ module Miasma
470
471
  :aws_profile_name => creds[:aws_profile_name],
471
472
  :aws_host => creds[:aws_host]
472
473
  )
473
- role_info = sts.assume_role(creds[:aws_sts_role_arn])
474
+ role_info = sts.assume_role(
475
+ creds[:aws_sts_role_arn],
476
+ :session_name => creds[:aws_sts_role_session_name],
477
+ :external_id => creds[:aws_sts_external_id]
478
+ )
474
479
  creds.merge!(role_info)
475
480
  true
476
481
  end
@@ -591,12 +596,10 @@ module Miasma
591
596
  dest, options = request_args
592
597
  path = URI.parse(dest).path
593
598
  options = options ? options.to_smash : Smash.new
599
+ options[:headers] = Smash[connection.default_headers.to_a].merge(options.fetch(:headers, Smash.new))
594
600
  if(self.class::API_VERSION)
595
601
  if(options[:form])
596
602
  options.set(:form, 'Version', self.class::API_VERSION)
597
- if(aws_sts_token)
598
- options.set(:form, 'SecurityToken', aws_sts_token)
599
- end
600
603
  else
601
604
  options[:params] = options.fetch(
602
605
  :params, Smash.new
@@ -605,21 +608,13 @@ module Miasma
605
608
  'Version' => self.class::API_VERSION
606
609
  )
607
610
  )
608
- if(aws_sts_token)
609
- options.set(:params, 'SecurityToken', aws_sts_token)
610
- end
611
611
  end
612
612
  end
613
+ if(aws_sts_token)
614
+ options.set(:headers, 'X-Amz-Security-Token', aws_sts_token)
615
+ end
613
616
  update_request(connection, options)
614
- signature = signer.generate(
615
- http_method, path, options.merge(
616
- Smash.new(
617
- :headers => Smash[
618
- connection.default_headers.to_a
619
- ]
620
- )
621
- )
622
- )
617
+ signature = signer.generate(http_method, path, options)
623
618
  options = Hash[options.map{|k,v|[k.to_sym,v]}]
624
619
  connection.auth(signature).send(http_method, dest, options)
625
620
  end
@@ -633,6 +628,31 @@ module Miasma
633
628
  true
634
629
  end
635
630
 
631
+ # Determine if a retry is allowed based on exception
632
+ #
633
+ # @param exception [Exception]
634
+ # @return [TrueClass, FalseClass]
635
+ def perform_request_retry(exception)
636
+ if(exception.is_a?(Miasma::Error::ApiError))
637
+ if([400, 500, 503].include?(exception.response.code))
638
+ if(exception.response.code == 400)
639
+ exception.response.body.to_s.downcase.include?('throttl')
640
+ else
641
+ true
642
+ end
643
+ else
644
+ false
645
+ end
646
+ end
647
+ end
648
+
649
+ # Always allow retry
650
+ #
651
+ # @return [TrueClass]
652
+ def retryable_allowed?(*_)
653
+ true
654
+ end
655
+
636
656
  end
637
657
 
638
658
  end
@@ -51,8 +51,9 @@ module Miasma
51
51
  end
52
52
  result = all_result_pages(nil, :body, 'DescribeAutoScalingGroupsResponse', 'DescribeAutoScalingGroupsResult', 'AutoScalingGroups', 'member') do |options|
53
53
  request(
54
+ :method => :post,
54
55
  :path => '/',
55
- :params => options.merge(params)
56
+ :form => options.merge(params)
56
57
  )
57
58
  end.map do |grp|
58
59
  (group || Group.new(self)).load_data(
@@ -28,8 +28,9 @@ module Miasma
28
28
  # @todo catch bad lookup and clear model
29
29
  def server_reload(server)
30
30
  result = request(
31
+ :method => :post,
31
32
  :path => '/',
32
- :params => {
33
+ :form => {
33
34
  'Action' => 'DescribeInstances',
34
35
  'InstanceId.1' => server.id
35
36
  }
@@ -52,8 +53,9 @@ module Miasma
52
53
  def server_destroy(server)
53
54
  if(server.persisted?)
54
55
  result = request(
56
+ :method => :post,
55
57
  :path => '/',
56
- :params => {
58
+ :form => {
57
59
  'Action' => 'TerminateInstances',
58
60
  'InstanceId.1' => server.id
59
61
  }
@@ -67,8 +69,9 @@ module Miasma
67
69
  unless(server.persisted?)
68
70
  server.load_data(server.attributes)
69
71
  result = request(
72
+ :method => :post,
70
73
  :path => '/',
71
- :params => {
74
+ :form => {
72
75
  'Action' => 'RunInstances',
73
76
  'ImageId' => server.image_id,
74
77
  'InstanceType' => server.flavor_id,
@@ -86,7 +89,13 @@ module Miasma
86
89
  # @todo need to add auto pagination helper (as common util)
87
90
  def server_all
88
91
  results = all_result_pages(nil, :body, 'DescribeInstancesResponse', 'reservationSet', 'item') do |options|
89
- request(:path => '/', :params => options.merge('Action' => 'DescribeInstances'))
92
+ request(
93
+ :method => :post,
94
+ :path => '/',
95
+ :form => options.merge(
96
+ 'Action' => 'DescribeInstances'
97
+ )
98
+ )
90
99
  end
91
100
  results.map do |srv|
92
101
  [srv[:instancesSet][:item]].flatten.compact.map do |srv|
@@ -38,8 +38,9 @@ module Miasma
38
38
  end
39
39
  end
40
40
  result = request(
41
+ :method => :post,
41
42
  :path => '/',
42
- :params => params.merge(
43
+ :form => params.merge(
43
44
  Smash.new(
44
45
  'Action' => 'CreateLoadBalancer'
45
46
  )
@@ -107,15 +108,17 @@ module Miasma
107
108
  end
108
109
  result = all_result_pages(nil, :body, 'DescribeLoadBalancersResponse', 'DescribeLoadBalancersResult', 'LoadBalancerDescriptions', 'member') do |options|
109
110
  request(
111
+ :method => :post,
110
112
  :path => '/',
111
- :params => options.merge(params)
113
+ :form => options.merge(params)
112
114
  )
113
115
  end
114
116
  if(balancer)
115
117
  health_result = all_result_pages(nil, :body, 'DescribeInstanceHealthResponse', 'DescribeInstanceHealthResult', 'InstanceStates', 'member') do |options|
116
118
  request(
119
+ :method => :post,
117
120
  :path => '/',
118
- :params => options.merge(
121
+ :form => options.merge(
119
122
  'LoadBalancerName' => balancer.id || balancer.name,
120
123
  'Action' => 'DescribeInstanceHealth'
121
124
  )
@@ -158,8 +161,9 @@ module Miasma
158
161
  def balancer_destroy(balancer)
159
162
  if(balancer.persisted?)
160
163
  request(
164
+ :method => :post,
161
165
  :path => '/',
162
- :params => Smash.new(
166
+ :form => Smash.new(
163
167
  'Action' => 'DeleteLoadBalancer',
164
168
  'LoadBalancerName' => balancer.name
165
169
  )
@@ -187,8 +191,9 @@ module Miasma
187
191
  def availability_zones
188
192
  memoize(:availability_zones) do
189
193
  res = api_for(:compute).request(
194
+ :method => :post,
190
195
  :path => '/',
191
- :params => Smash.new(
196
+ :form => Smash.new(
192
197
  'Action' => 'DescribeAvailabilityZones'
193
198
  )
194
199
  ).fetch(:body, 'DescribeAvailabilityZonesResponse', 'availabilityZoneInfo', 'item', [])
@@ -64,17 +64,17 @@ module Miasma
64
64
  d_params['StackName'] = stack.id
65
65
  descriptions = all_result_pages(nil, :body, 'DescribeStacksResponse', 'DescribeStacksResult', 'Stacks', 'member') do |options|
66
66
  request(
67
+ :method => :post,
67
68
  :path => '/',
68
- :params => options.merge(d_params),
69
- :method => :get
69
+ :form => options.merge(d_params)
70
70
  )
71
71
  end
72
72
  else
73
73
  lists = all_result_pages(nil, :body, 'ListStacksResponse', 'ListStacksResult', 'StackSummaries', 'member') do |options|
74
74
  request(
75
+ :method => :post,
75
76
  :path => '/',
76
- :form => options.merge(l_params),
77
- :method => :post
77
+ :form => options.merge(l_params)
78
78
  )
79
79
  end
80
80
  descriptions = []
@@ -226,8 +226,9 @@ module Miasma
226
226
  def stack_destroy(stack)
227
227
  if(stack.persisted?)
228
228
  request(
229
+ :method => :post,
229
230
  :path => '/',
230
- :params => Smash.new(
231
+ :form => Smash.new(
231
232
  'Action' => 'DeleteStack',
232
233
  'StackName' => stack.id
233
234
  )
@@ -245,8 +246,9 @@ module Miasma
245
246
  def stack_template_load(stack)
246
247
  if(stack.persisted?)
247
248
  result = request(
249
+ :method => :post,
248
250
  :path => '/',
249
- :params => Smash.new(
251
+ :form => Smash.new(
250
252
  'Action' => 'GetTemplate',
251
253
  'StackName' => stack.id
252
254
  )
@@ -308,9 +310,9 @@ module Miasma
308
310
  def resource_all(stack)
309
311
  results = all_result_pages(nil, :body, 'DescribeStackResourcesResponse', 'DescribeStackResourcesResult', 'StackResources', 'member') do |options|
310
312
  request(
313
+ :method => :post,
311
314
  :path => '/',
312
- :method => :get,
313
- :params => options.merge(
315
+ :form => options.merge(
314
316
  Smash.new(
315
317
  'Action' => 'DescribeStackResources',
316
318
  'StackName' => stack.id
@@ -348,9 +350,9 @@ module Miasma
348
350
  def event_all(stack, evt_id=nil)
349
351
  results = all_result_pages(nil, :body, 'DescribeStackEventsResponse', 'DescribeStackEventsResult', 'StackEvents', 'member') do |options|
350
352
  request(
353
+ :method => :post,
351
354
  :path => '/',
352
- :method => :get,
353
- :params => options.merge(
355
+ :form => options.merge(
354
356
  'Action' => 'DescribeStackEvents',
355
357
  'StackName' => stack.id
356
358
  )
@@ -437,7 +437,7 @@ module Miasma
437
437
  # happening (which implicitly forces :form) or :json is used
438
438
  # it will not properly checksum. (but that's probably okay)
439
439
  def update_request(con, opts)
440
- con.default_headers['x-amz-content-sha256'] = Digest::SHA256.
440
+ opts[:headers]['x-amz-content-sha256'] = Digest::SHA256.
441
441
  hexdigest(opts.fetch(:body, ''))
442
442
  true
443
443
  end
data/miasma-aws.gemspec CHANGED
@@ -10,7 +10,7 @@ Gem::Specification.new do |s|
10
10
  s.description = 'Smoggy AWS API'
11
11
  s.license = 'Apache 2.0'
12
12
  s.require_path = 'lib'
13
- s.add_development_dependency 'miasma', '>= 0.2.18'
13
+ s.add_development_dependency 'miasma', '>= 0.2.29'
14
14
  s.add_development_dependency 'pry'
15
15
  s.add_development_dependency 'minitest'
16
16
  s.add_development_dependency 'vcr'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: miasma-aws
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.22
4
+ version: 0.1.24
5
5
  platform: ruby
6
6
  authors:
7
7
  - Chris Roberts
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-09-29 00:00:00.000000000 Z
11
+ date: 2015-10-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: miasma
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: 0.2.18
19
+ version: 0.2.29
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: 0.2.18
26
+ version: 0.2.29
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: pry
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -134,8 +134,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
134
134
  version: '0'
135
135
  requirements: []
136
136
  rubyforge_project:
137
- rubygems_version: 2.4.8
137
+ rubygems_version: 2.2.2
138
138
  signing_key:
139
139
  specification_version: 4
140
140
  summary: Smoggy AWS API
141
141
  test_files: []
142
+ has_rdoc: