cfer 0.3.0 → 0.4.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.
@@ -3,6 +3,14 @@ module Cfer::Util
3
3
  class CferError < StandardError
4
4
  end
5
5
 
6
+ class CferValidationError < CferError
7
+ attr_reader :errors
8
+ def initialize(errors)
9
+ @errors = errors
10
+ super(errors)
11
+ end
12
+ end
13
+
6
14
  class StackExistsError < CferError
7
15
  end
8
16
 
@@ -1,3 +1,9 @@
1
1
  module Cfer
2
- VERSION = "0.3.0"
2
+ VERSION = "0.4.0"
3
+
4
+ begin
5
+ require 'semantic'
6
+ SEMANTIC_VERSION = Semantic::Version.new(VERSION)
7
+ rescue LoadError
8
+ end
3
9
  end
@@ -0,0 +1,6 @@
1
+ Cfer::Core::Resource.extend_resource "AWS::AutoScaling::AutoScalingGroup" do
2
+ def desired_size(size)
3
+ desired_capacity size
4
+ end
5
+ end
6
+
@@ -0,0 +1,30 @@
1
+ require 'cferext/aws/iam/policy_generator'
2
+
3
+ Cfer::Core::Resource.extend_resource "AWS::IAM::ManagedPolicy" do
4
+ include CferExt::AWS::IAM::WithPolicyDocument
5
+ end
6
+
7
+ Cfer::Core::Resource.extend_resource "AWS::IAM::User" do
8
+ include CferExt::AWS::IAM::WithPolicies
9
+ end
10
+
11
+ Cfer::Core::Resource.extend_resource "AWS::IAM::Group" do
12
+ include CferExt::AWS::IAM::WithPolicies
13
+ end
14
+
15
+ Cfer::Core::Resource.extend_resource "AWS::IAM::Role" do
16
+ include CferExt::AWS::IAM::WithPolicies
17
+
18
+ def assume_role_policy_document(doc = nil, &block)
19
+ doc = CferExt::AWS::IAM.generate_policy(&block) if doc == nil
20
+ properties :AssumeRolePolicyDocument => doc
21
+ end
22
+ end
23
+
24
+ Cfer::Core::Resource.extend_resource "AWS::IAM::Policy" do
25
+ def policy_document(doc = nil, &block)
26
+ doc = CferExt::AWS::IAM.generate_policy(&block) if doc == nil
27
+ properties :PolicyDocument => doc
28
+ end
29
+ end
30
+
@@ -0,0 +1,54 @@
1
+ require 'docile'
2
+
3
+ module CferExt
4
+ module AWS
5
+ module IAM
6
+ class PolicyGenerator < Cfer::BlockHash
7
+ def initialize
8
+ self[:Version] = '2012-10-17'
9
+ self[:Statement] = []
10
+ end
11
+
12
+ def statement(options = {}, &block)
13
+ statement = Cfer::BlockHash.new(&block)
14
+ statement.merge! options
15
+ statement.build_from_block(&block)
16
+ self[:Statement].unshift statement
17
+ end
18
+
19
+ def allow(&block)
20
+ statement Effect: :Allow, &block
21
+ end
22
+
23
+ def deny(&block)
24
+ statement Effect: :Deny, &block
25
+ end
26
+ end
27
+
28
+ module WithPolicyDocument
29
+ end
30
+
31
+ module WithPolicies
32
+ def policy(doc = nil, &block)
33
+ self[:Properties][:Policies] ||= []
34
+ doc = CferExt::AWS::IAM.generate_policy(&block) if doc == nil
35
+ get_property(:Policies) << doc.to_h
36
+ end
37
+ end
38
+
39
+ def self.generate_policy(&block)
40
+ policy = PolicyGenerator.new
41
+ policy.build_from_block(&block)
42
+ policy
43
+ end
44
+
45
+ EC2_ASSUME_ROLE_POLICY_DOCUMENT =
46
+ CferExt::AWS::IAM.generate_policy do
47
+ allow do
48
+ principal Service: 'ec2.amazonaws.com'
49
+ action 'sts:AssumeRole'
50
+ end
51
+ end.freeze
52
+ end
53
+ end
54
+ end
metadata CHANGED
@@ -1,183 +1,211 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cfer
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sean Edwards
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-02-28 00:00:00.000000000 Z
11
+ date: 2016-04-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: docile
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.1'
17
20
  - - ">="
18
21
  - !ruby/object:Gem::Version
19
- version: '0'
22
+ version: 1.1.5
20
23
  type: :runtime
21
24
  prerelease: false
22
25
  version_requirements: !ruby/object:Gem::Requirement
23
26
  requirements:
27
+ - - "~>"
28
+ - !ruby/object:Gem::Version
29
+ version: '1.1'
24
30
  - - ">="
25
31
  - !ruby/object:Gem::Version
26
- version: '0'
32
+ version: 1.1.5
27
33
  - !ruby/object:Gem::Dependency
28
34
  name: thor
29
35
  requirement: !ruby/object:Gem::Requirement
30
36
  requirements:
31
- - - ">="
37
+ - - "~>"
32
38
  - !ruby/object:Gem::Version
33
- version: '0'
39
+ version: 0.19.1
34
40
  type: :runtime
35
41
  prerelease: false
36
42
  version_requirements: !ruby/object:Gem::Requirement
37
43
  requirements:
38
- - - ">="
44
+ - - "~>"
39
45
  - !ruby/object:Gem::Version
40
- version: '0'
46
+ version: 0.19.1
41
47
  - !ruby/object:Gem::Dependency
42
48
  name: activesupport
43
49
  requirement: !ruby/object:Gem::Requirement
44
50
  requirements:
51
+ - - "~>"
52
+ - !ruby/object:Gem::Version
53
+ version: '4.2'
45
54
  - - ">="
46
55
  - !ruby/object:Gem::Version
47
- version: '0'
56
+ version: 4.2.6
48
57
  type: :runtime
49
58
  prerelease: false
50
59
  version_requirements: !ruby/object:Gem::Requirement
51
60
  requirements:
61
+ - - "~>"
62
+ - !ruby/object:Gem::Version
63
+ version: '4.2'
52
64
  - - ">="
53
65
  - !ruby/object:Gem::Version
54
- version: '0'
66
+ version: 4.2.6
55
67
  - !ruby/object:Gem::Dependency
56
68
  name: aws-sdk
57
69
  requirement: !ruby/object:Gem::Requirement
58
70
  requirements:
71
+ - - "~>"
72
+ - !ruby/object:Gem::Version
73
+ version: '2.2'
59
74
  - - ">="
60
75
  - !ruby/object:Gem::Version
61
- version: '0'
76
+ version: 2.2.33
62
77
  type: :runtime
63
78
  prerelease: false
64
79
  version_requirements: !ruby/object:Gem::Requirement
65
80
  requirements:
81
+ - - "~>"
82
+ - !ruby/object:Gem::Version
83
+ version: '2.2'
66
84
  - - ">="
67
85
  - !ruby/object:Gem::Version
68
- version: '0'
86
+ version: 2.2.33
69
87
  - !ruby/object:Gem::Dependency
70
88
  name: aws-sdk-resources
71
89
  requirement: !ruby/object:Gem::Requirement
72
90
  requirements:
91
+ - - "~>"
92
+ - !ruby/object:Gem::Version
93
+ version: '2.2'
73
94
  - - ">="
74
95
  - !ruby/object:Gem::Version
75
- version: '0'
96
+ version: 2.2.33
76
97
  type: :runtime
77
98
  prerelease: false
78
99
  version_requirements: !ruby/object:Gem::Requirement
79
100
  requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '2.2'
80
104
  - - ">="
81
105
  - !ruby/object:Gem::Version
82
- version: '0'
106
+ version: 2.2.33
83
107
  - !ruby/object:Gem::Dependency
84
108
  name: preconditions
85
109
  requirement: !ruby/object:Gem::Requirement
86
110
  requirements:
87
- - - ">="
111
+ - - "~>"
88
112
  - !ruby/object:Gem::Version
89
- version: '0'
113
+ version: 0.3.0
90
114
  type: :runtime
91
115
  prerelease: false
92
116
  version_requirements: !ruby/object:Gem::Requirement
93
117
  requirements:
94
- - - ">="
118
+ - - "~>"
95
119
  - !ruby/object:Gem::Version
96
- version: '0'
120
+ version: 0.3.0
97
121
  - !ruby/object:Gem::Dependency
98
122
  name: semantic
99
123
  requirement: !ruby/object:Gem::Requirement
100
124
  requirements:
125
+ - - "~>"
126
+ - !ruby/object:Gem::Version
127
+ version: '1.4'
101
128
  - - ">="
102
129
  - !ruby/object:Gem::Version
103
- version: '0'
130
+ version: 1.4.1
104
131
  type: :runtime
105
132
  prerelease: false
106
133
  version_requirements: !ruby/object:Gem::Requirement
107
134
  requirements:
135
+ - - "~>"
136
+ - !ruby/object:Gem::Version
137
+ version: '1.4'
108
138
  - - ">="
109
139
  - !ruby/object:Gem::Version
110
- version: '0'
140
+ version: 1.4.1
111
141
  - !ruby/object:Gem::Dependency
112
142
  name: rainbow
113
143
  requirement: !ruby/object:Gem::Requirement
114
144
  requirements:
115
- - - ">="
145
+ - - "~>"
116
146
  - !ruby/object:Gem::Version
117
- version: '0'
147
+ version: '2.1'
118
148
  type: :runtime
119
149
  prerelease: false
120
150
  version_requirements: !ruby/object:Gem::Requirement
121
151
  requirements:
122
- - - ">="
152
+ - - "~>"
123
153
  - !ruby/object:Gem::Version
124
- version: '0'
154
+ version: '2.1'
125
155
  - !ruby/object:Gem::Dependency
126
156
  name: highline
127
157
  requirement: !ruby/object:Gem::Requirement
128
158
  requirements:
159
+ - - "~>"
160
+ - !ruby/object:Gem::Version
161
+ version: '1.7'
129
162
  - - ">="
130
163
  - !ruby/object:Gem::Version
131
- version: '0'
164
+ version: 1.7.8
132
165
  type: :runtime
133
166
  prerelease: false
134
167
  version_requirements: !ruby/object:Gem::Requirement
135
168
  requirements:
169
+ - - "~>"
170
+ - !ruby/object:Gem::Version
171
+ version: '1.7'
136
172
  - - ">="
137
173
  - !ruby/object:Gem::Version
138
- version: '0'
174
+ version: 1.7.8
139
175
  - !ruby/object:Gem::Dependency
140
176
  name: table_print
141
177
  requirement: !ruby/object:Gem::Requirement
142
178
  requirements:
143
- - - ">="
179
+ - - "~>"
144
180
  - !ruby/object:Gem::Version
145
- version: '0'
146
- type: :runtime
147
- prerelease: false
148
- version_requirements: !ruby/object:Gem::Requirement
149
- requirements:
150
- - - ">="
151
- - !ruby/object:Gem::Version
152
- version: '0'
153
- - !ruby/object:Gem::Dependency
154
- name: rake
155
- requirement: !ruby/object:Gem::Requirement
156
- requirements:
181
+ version: '1.5'
157
182
  - - ">="
158
183
  - !ruby/object:Gem::Version
159
- version: '0'
184
+ version: 1.5.6
160
185
  type: :runtime
161
186
  prerelease: false
162
187
  version_requirements: !ruby/object:Gem::Requirement
163
188
  requirements:
189
+ - - "~>"
190
+ - !ruby/object:Gem::Version
191
+ version: '1.5'
164
192
  - - ">="
165
193
  - !ruby/object:Gem::Version
166
- version: '0'
194
+ version: 1.5.6
167
195
  - !ruby/object:Gem::Dependency
168
- name: erubis
196
+ name: git
169
197
  requirement: !ruby/object:Gem::Requirement
170
198
  requirements:
171
- - - ">="
199
+ - - "~>"
172
200
  - !ruby/object:Gem::Version
173
- version: '0'
201
+ version: '1.3'
174
202
  type: :runtime
175
203
  prerelease: false
176
204
  version_requirements: !ruby/object:Gem::Requirement
177
205
  requirements:
178
- - - ">="
206
+ - - "~>"
179
207
  - !ruby/object:Gem::Version
180
- version: '0'
208
+ version: '1.3'
181
209
  - !ruby/object:Gem::Dependency
182
210
  name: bundler
183
211
  requirement: !ruby/object:Gem::Requirement
@@ -185,7 +213,7 @@ dependencies:
185
213
  - - ">="
186
214
  - !ruby/object:Gem::Version
187
215
  version: '0'
188
- type: :development
216
+ type: :runtime
189
217
  prerelease: false
190
218
  version_requirements: !ruby/object:Gem::Requirement
191
219
  requirements:
@@ -196,16 +224,16 @@ dependencies:
196
224
  name: yard
197
225
  requirement: !ruby/object:Gem::Requirement
198
226
  requirements:
199
- - - ">="
227
+ - - "~>"
200
228
  - !ruby/object:Gem::Version
201
- version: '0'
229
+ version: 0.8.7.6
202
230
  type: :development
203
231
  prerelease: false
204
232
  version_requirements: !ruby/object:Gem::Requirement
205
233
  requirements:
206
- - - ">="
234
+ - - "~>"
207
235
  - !ruby/object:Gem::Version
208
- version: '0'
236
+ version: 0.8.7.6
209
237
  description: Toolkit for automating infrastructure using AWS CloudFormation
210
238
  email:
211
239
  - stedwards87+cfer@gmail.com
@@ -232,13 +260,13 @@ files:
232
260
  - bin/setup
233
261
  - cfer.gemspec
234
262
  - doc/cfer-demo.gif
235
- - examples/chef_instance.rb
236
263
  - examples/common/instance_deps.rb
237
264
  - examples/instance.rb
238
265
  - examples/vpc.rb
239
266
  - lib/cfer.rb
240
267
  - lib/cfer/block.rb
241
268
  - lib/cfer/cfn/aws.rb
269
+ - lib/cfer/cfn/cfer_credentials_provider.rb
242
270
  - lib/cfer/cfn/client.rb
243
271
  - lib/cfer/cli.rb
244
272
  - lib/cfer/core/client.rb
@@ -247,11 +275,9 @@ files:
247
275
  - lib/cfer/core/stack.rb
248
276
  - lib/cfer/util/error.rb
249
277
  - lib/cfer/version.rb
250
- - lib/cferext/aws/auto_scaling/launch_configuration.rb
251
- - lib/cferext/aws/ec2/instance.rb
252
- - lib/cferext/provisioning.rb
253
- - lib/cferext/provisioning/cfn-bootstrap.rb
254
- - lib/cferext/provisioning/chef.rb
278
+ - lib/cferext/aws/auto_scaling/auto_scaling_group.rb
279
+ - lib/cferext/aws/iam/policy.rb
280
+ - lib/cferext/aws/iam/policy_generator.rb
255
281
  homepage: https://github.com/seanedwards/cfer
256
282
  licenses:
257
283
  - MIT
@@ -272,7 +298,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
272
298
  version: '0'
273
299
  requirements: []
274
300
  rubyforge_project:
275
- rubygems_version: 2.4.5
301
+ rubygems_version: 2.5.1
276
302
  signing_key:
277
303
  specification_version: 4
278
304
  summary: Toolkit for automating infrastructure using AWS CloudFormation
@@ -1,56 +0,0 @@
1
- description 'Example stack template for a small EC2 instance'
2
-
3
- # NOTE: This template depends on vpc.rb
4
-
5
- # Include common template code that will be used for examples that create EC2 instances.
6
- include_template 'common/instance_deps.rb'
7
-
8
- resource :instance, "AWS::EC2::Instance",
9
- # Set a creation policy so that the stack will wait for
10
- # on-instance provisioning to complete before marking the instance
11
- # as done.
12
- :CreationPolicy => {
13
- :ResourceSignal => {
14
- :Count => 1
15
- }
16
- } do
17
- # Chef provisioning depends on cfn-init, so set that up first.
18
- # We will have the initial provisioning set up cfn-hup, install chef, and run our cookbooks.
19
- # Cfn-hup will only rerun chef when the metadata changes.
20
- cfn_init_setup signal: :instance,
21
- cfn_init_config_set: [ :cfn_hup, :install_chef, :run_chef],
22
- cfn_hup_config_set: [ :cfn_hup, :run_chef]
23
-
24
- # Configure chef to generate a Berksfile that will download the AWS cookbook from the Chef supermarket.
25
- # Set the run list to run the AWS cookbook, so our instance will have the AWS SDK available.
26
- chef_solo version: 'latest',
27
- node: {
28
- cfer: {
29
- demo: {
30
- welcome: "Welcome to Cfer!"
31
- }
32
- },
33
- run_list: 'recipe[ec2-demo]'
34
- },
35
- # We specify a berksfile inline, but you could read this from somewhere else in your repo too.
36
- # This uses a simple cookbook to write a file, similar to the instance.rb example.
37
- # Review this cookbook here: https://github.com/seanedwards/cfer-cookbook-demo
38
- berksfile: <<-EOF
39
- source "https://supermarket.chef.io"
40
- cookbook 'ec2-demo', github: 'seanedwards/cfer-cookbook-demo', branch: 'master'
41
- EOF
42
-
43
- image_id Fn::ref(:ImageId)
44
- instance_type Fn::ref(:InstanceType)
45
- key_name Fn::ref(:KeyName)
46
-
47
- network_interfaces [ {
48
- AssociatePublicIpAddress: "true",
49
- DeviceIndex: "0",
50
- GroupSet: [ Fn::ref(:instancesg) ],
51
- SubnetId: Fn::ref(:SubnetId)
52
- } ]
53
- end
54
-
55
- output :instance, Fn::ref(:instance)
56
- output :instanceip, Fn::get_att(:instance, :PublicIp)