miasma-aws 0.1.6 → 0.1.8

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: a3da765abdba597864cae9b1fe0b1c81900c2a94
4
- data.tar.gz: b98aab91fd9511e26ca5dbc42a8a6b8dc1730f41
3
+ metadata.gz: e6251cdfa71808a80c15f084a1c5b99fef161210
4
+ data.tar.gz: 257f0b4f25ec6fb9b5b2a47720ac852ff069579a
5
5
  SHA512:
6
- metadata.gz: e1ae3d106af0bcc11a2893a8efab2eabe9980090203409ccfb8127e09afb63df62887ea71a0ae55f7656a06903e59ac3b736bd9d101075f4f6613442a3316228
7
- data.tar.gz: 5f49561b607f000311ec3f530426f2898ca1e9278d0bcb5e472811539df9aeef34e32fc7ff378d2d49ed7fe25bd80fa5813410680fcf400d1b08f7c9802c547e
6
+ metadata.gz: 55f7fc516d4de71dfc646e603ceff90c5b7e38fe0f3c78332c7a731f40ce5a732c58a218ab4e3586a36f5e11c2129db89ae3d2e498123fbb62a267c61bc2f3f3
7
+ data.tar.gz: 5dd3c7418bbbdb9436f4ef5342dcdedf51716b5d891e0fd211ba8cb8e34016a8b8f59570925f14df1adb0d1a5d2887f7acc415964fb4073134946b0720d7b712
@@ -1,3 +1,10 @@
1
+ ## v0.1.8
2
+ * Include resource mapping for Stack
3
+ * Add support for aws credentials file
4
+ * Add stack tagging support
5
+ * Enable on failure option for stack creation
6
+ * Update list requests to use post + form to prevent param limitations via get
7
+
1
8
  ## v0.1.6
2
9
  * Fix state assignment when undefined within orchestration stacks
3
10
  * Fix multi-part S3 uploads
@@ -1,4 +1,4 @@
1
1
  module MiasmaAws
2
2
  # Current library version
3
- VERSION = Gem::Version.new('0.1.6')
3
+ VERSION = Gem::Version.new('0.1.8')
4
4
  end
@@ -327,6 +327,8 @@ module Miasma
327
327
 
328
328
  def self.included(klass)
329
329
  klass.class_eval do
330
+ attribute :aws_profile_name, String
331
+ attribute :aws_credentials_file, String, :required => true, :default => File.expand_path('~/.aws/credentials')
330
332
  attribute :aws_access_key_id, String, :required => true
331
333
  attribute :aws_secret_access_key, String, :required => true
332
334
  attribute :aws_region, String, :required => true
@@ -356,6 +358,42 @@ module Miasma
356
358
  end
357
359
  end
358
360
 
361
+ # Allow loading credentials via local credentials file
362
+ #
363
+ # @param creds [Hash]
364
+ # @return [TrueClass]
365
+ def custom_setup(creds)
366
+ if(creds[:aws_profile_name])
367
+ creds.replace(load_aws_credentials(creds[:aws_profile_name]).merge(creds))
368
+ end
369
+ end
370
+
371
+ # Load credentials from the AWS credentials file
372
+ #
373
+ # @param profile [String] name of profile to load
374
+ # @return [Smash]
375
+ def load_aws_credentials(profile)
376
+ credentials = Smash.new.tap do |creds|
377
+ key = nil
378
+ File.readlines(aws_credentials_file).each do |line|
379
+ line.strip!
380
+ if(line.start_with?('[') && line.end_with?(']'))
381
+ key = line.tr('[]', '')
382
+ creds[key] = Smash.new
383
+ else
384
+ creds[key].merge!(Smash[*line.split('=')])
385
+ end
386
+ end
387
+ end
388
+ credentials.fetch(
389
+ :default, Smash.new
390
+ ).merge(
391
+ credentials.fetch(
392
+ profile, Smash.new
393
+ )
394
+ )
395
+ end
396
+
359
397
  # Setup for API connections
360
398
  def connect
361
399
  unless(aws_host)
@@ -5,6 +5,12 @@ module Miasma
5
5
  class Orchestration
6
6
  class Aws < Orchestration
7
7
 
8
+ # Extended stack model to provide AWS specific stack options
9
+ class Stack < Orchestration::Stack
10
+ attribute :stack_policy_body, Hash, :coerce => lambda{|v| MultiJson.load(v).to_smash}
11
+ attribute :stack_policy_url, String
12
+ end
13
+
8
14
  # Service name of the API
9
15
  API_SERVICE = 'cloudformation'
10
16
  # Supported version of the AutoScaling API
@@ -35,6 +41,10 @@ module Miasma
35
41
  'AWS::AutoScaling::AutoScalingGroup' => Smash.new(
36
42
  :api => :auto_scale,
37
43
  :collection => :groups
44
+ ),
45
+ 'AWS::CloudFormation::Stack' => Smash.new(
46
+ :api => :orchestration,
47
+ :collection => :stacks
38
48
  )
39
49
  )
40
50
 
@@ -53,16 +63,29 @@ module Miasma
53
63
  descriptions = all_result_pages(nil, :body, 'DescribeStacksResponse', 'DescribeStacksResult', 'Stacks', 'member') do |options|
54
64
  request(
55
65
  :path => '/',
56
- :params => options.merge(d_params)
66
+ :form => options.merge(d_params),
67
+ :method => :post
57
68
  )
58
69
  end
70
+ policy = request(
71
+ :path => '/',
72
+ :method => :get,
73
+ :params => Smash.new(
74
+ 'Action' => 'GetStackPolicy',
75
+ 'StackName' => stack.id
76
+ )
77
+ ).get(:body, 'GetStackPolicyResult', 'StackPolicyBody')
78
+ if(policy)
79
+ descriptions.first[:stack_policy] = MultiJson.load(policy).to_smash
80
+ end
59
81
  else
60
82
  descriptions = []
61
83
  end
62
84
  lists = all_result_pages(nil, :body, 'ListStacksResponse', 'ListStacksResult', 'StackSummaries', 'member') do |options|
63
85
  request(
64
86
  :path => '/',
65
- :params => options.merge(l_params)
87
+ :form => options.merge(l_params),
88
+ :method => :post
66
89
  )
67
90
  end.map do |stk|
68
91
  desc = descriptions.detect do |d_stk|
@@ -102,11 +125,19 @@ module Miasma
102
125
  :description => o['Description']
103
126
  )
104
127
  },
128
+ :tags => Smash[
129
+ [stk.fetch('Tags', 'member', [])].flatten(1).map{|param|
130
+ [param['Key'], param['Value']]
131
+ }
132
+ ],
105
133
  :parameters => Smash[
106
134
  [stk.fetch('Parameters', 'member', [])].flatten(1).map{|param|
107
135
  [param['ParameterKey'], param['ParameterValue']]
108
136
  }
109
- ]
137
+ ],
138
+ :custom => Smash.new(
139
+ :stack_policy_body => policy
140
+ )
110
141
  ).valid_state
111
142
  end
112
143
  end
@@ -127,6 +158,22 @@ module Miasma
127
158
  (stack.notification_topics || []).each_with_index do |topic, idx|
128
159
  params["NotificationARNs.member.#{idx + 1}"] = topic
129
160
  end
161
+ (stack.tags || {}).each_with_index do |tag, idx|
162
+ params["Tags.member.#{idx + 1}.Key"] = tag.first
163
+ params["Tags.member.#{idx + 1}.Value"] = tag.last
164
+ end
165
+ if(stack.custom[:stack_policy_body])
166
+ params['StackPolicyBody'] = MultiJson.dump(stack.custom[:stack_policy_body])
167
+ end
168
+ if(stack.custom[:stack_policy_url])
169
+ params['StackPolicyURL'] = stack.custom[:stack_policy_url]
170
+ end
171
+ unless(stack.disable_rollback.nil?)
172
+ params['OnFailure'] = stack.disable_rollback ? 'nothing' : 'delete'
173
+ end
174
+ if(stack.on_failure)
175
+ params['OnFailure'] = stack.on_failure == 'nothing' ? 'DO_NOTHING' : stack.on_failure.upcase
176
+ end
130
177
  if(stack.template.empty?)
131
178
  params['UsePreviousTemplate'] = true
132
179
  else
@@ -149,8 +196,7 @@ module Miasma
149
196
  :path => '/',
150
197
  :method => :post,
151
198
  :form => Smash.new(
152
- 'Action' => 'CreateStack',
153
- 'DisableRollback' => !!stack.disable_rollback
199
+ 'Action' => 'CreateStack'
154
200
  ).merge(params)
155
201
  )
156
202
  stack.id = result.get(:body, 'CreateStackResponse', 'CreateStackResult', 'StackId')
@@ -268,7 +314,8 @@ module Miasma
268
314
  results = all_result_pages(nil, :body, 'DescribeStackResourcesResponse', 'DescribeStackResourcesResult', 'StackResources', 'member') do |options|
269
315
  request(
270
316
  :path => '/',
271
- :params => options.merge(
317
+ :method => :post,
318
+ :form => options.merge(
272
319
  Smash.new(
273
320
  'Action' => 'DescribeStackResources',
274
321
  'StackName' => stack.id
@@ -307,7 +354,8 @@ module Miasma
307
354
  results = all_result_pages(nil, :body, 'DescribeStackEventsResponse', 'DescribeStackEventsResult', 'StackEvents', 'member') do |options|
308
355
  request(
309
356
  :path => '/',
310
- :params => options.merge(
357
+ :method => :post,
358
+ :form => options.merge(
311
359
  'Action' => 'DescribeStackEvents',
312
360
  'StackName' => stack.id
313
361
  )
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.6
4
+ version: 0.1.8
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-03-06 00:00:00.000000000 Z
11
+ date: 2015-04-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: miasma