convection 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (39) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +17 -0
  3. data/.rubocop.yml +16 -0
  4. data/Gemfile +4 -0
  5. data/LICENSE +23 -0
  6. data/README.md +224 -0
  7. data/Rakefile +2 -0
  8. data/Thorfile +5 -0
  9. data/convection.gemspec +27 -0
  10. data/example/iam_role.rb +63 -0
  11. data/example/s3.rb +13 -0
  12. data/example/vpc.rb +85 -0
  13. data/lib/convection.rb +18 -0
  14. data/lib/convection/control/stack.rb +165 -0
  15. data/lib/convection/dsl/helpers.rb +15 -0
  16. data/lib/convection/dsl/intrinsic_functions.rb +79 -0
  17. data/lib/convection/model/mixin/cidr_block.rb +17 -0
  18. data/lib/convection/model/mixin/conditional.rb +21 -0
  19. data/lib/convection/model/mixin/taggable.rb +48 -0
  20. data/lib/convection/model/template.rb +127 -0
  21. data/lib/convection/model/template/mapping.rb +42 -0
  22. data/lib/convection/model/template/output.rb +37 -0
  23. data/lib/convection/model/template/parameter.rb +44 -0
  24. data/lib/convection/model/template/resource.rb +64 -0
  25. data/lib/convection/model/template/resource/aws_ec2_instance.rb +69 -0
  26. data/lib/convection/model/template/resource/aws_ec2_internet_gateway.rb +55 -0
  27. data/lib/convection/model/template/resource/aws_ec2_route.rb +55 -0
  28. data/lib/convection/model/template/resource/aws_ec2_route_table.rb +60 -0
  29. data/lib/convection/model/template/resource/aws_ec2_security_group.rb +104 -0
  30. data/lib/convection/model/template/resource/aws_ec2_subnet.rb +66 -0
  31. data/lib/convection/model/template/resource/aws_ec2_subnet_route_table_association.rb +39 -0
  32. data/lib/convection/model/template/resource/aws_ec2_vpc.rb +116 -0
  33. data/lib/convection/model/template/resource/aws_ec2_vpc_gateway_attachment.rb +43 -0
  34. data/lib/convection/model/template/resource/aws_iam_policy.rb +45 -0
  35. data/lib/convection/model/template/resource/aws_iam_role.rb +45 -0
  36. data/lib/convection/model/template/resource/aws_s3_bucket.rb +67 -0
  37. data/lib/convection/model/template/resource/aws_s3_bucket_policy.rb +40 -0
  38. data/lib/convection/version.rb +6 -0
  39. metadata +375 -0
@@ -0,0 +1,6 @@
1
+ # nodoc
2
+ module Convection
3
+ VERSION = IO.read(File.expand_path('../../../VERSION', __FILE__)) rescue '0.0.1'
4
+ SUMMARY = 'A fully generic, modular DSL for AWS CloudFormation'
5
+ DESCRIPTION = IO.read(File.expand_path('../../../README.md', __FILE__)) rescue ''
6
+ end
metadata ADDED
@@ -0,0 +1,375 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: convection
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - John Manero
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-02-12 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ~>
18
+ - !ruby/object:Gem::Version
19
+ version: '1.7'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ~>
25
+ - !ruby/object:Gem::Version
26
+ version: '1.7'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ~>
32
+ - !ruby/object:Gem::Version
33
+ version: '10.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ~>
39
+ - !ruby/object:Gem::Version
40
+ version: '10.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: thor-scmversion
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - '='
46
+ - !ruby/object:Gem::Version
47
+ version: 1.7.0
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - '='
53
+ - !ruby/object:Gem::Version
54
+ version: 1.7.0
55
+ - !ruby/object:Gem::Dependency
56
+ name: aws-sdk
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - <
60
+ - !ruby/object:Gem::Version
61
+ version: '2'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - <
67
+ - !ruby/object:Gem::Version
68
+ version: '2'
69
+ - !ruby/object:Gem::Dependency
70
+ name: netaddr
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ~>
74
+ - !ruby/object:Gem::Version
75
+ version: 1.5.0
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ~>
81
+ - !ruby/object:Gem::Version
82
+ version: 1.5.0
83
+ description: |
84
+ # Convection
85
+ _A fully generic, modular DSL for AWS CloudFormation_
86
+
87
+ This gem aims to provide a reusable model for AWS CloudFormation in Ruby. It exposes a DSL for template definition, and a simple, decoupled abstraction of a CloudFormation Stack to compile and apply templates.
88
+
89
+ ## Version 0.0.1
90
+ This is an Alpha release. It is still lacking functionality and testing. We plan to develop/improve features as we begin to use it for our own deployments in the coming months. PRs welcome.
91
+
92
+ ## Installation
93
+ Add this line to your application's Gemfile:
94
+
95
+ ```ruby
96
+ gem 'convection'
97
+ ```
98
+
99
+ And then execute:
100
+
101
+ $ bundle
102
+
103
+ Or install it yourself as:
104
+
105
+ $ gem install convection
106
+
107
+ ## Template DSL
108
+ The core DSL provides all of the available JSON primatives of CloudFormation in the form of ruby methods. These primatives are used to compose higher-order methods for commonly used definitions:
109
+
110
+ ```ruby
111
+ require 'convection'
112
+
113
+ ## Create a new instance of Convection::Model::Template
114
+ Convection.template do
115
+ description 'An example template'
116
+
117
+ parameter 'InstanceSize' do
118
+ type 'String'
119
+ description 'Instance Size'
120
+ default 'm3.medium'
121
+
122
+ allow 'm3.medium'
123
+ allow 'm3.large'
124
+ allow 'm3.xlarge'
125
+ end
126
+
127
+ ## The `resource` method can be used to define any resource
128
+ ## supported by CloudFormation: See http://docs.aws.amazon.com/\
129
+ ## AWSCloudFormation/latest/UserGuide/aws-template-resource-type-ref.html
130
+ resource 'AnEC2Instance' do
131
+ type 'AWS::EC2::Instance'
132
+ property 'AvailabilityZone', 'us-east-1a'
133
+ property 'ImageId', 'ami-76e27e1e' ## Ubuntu 14.04 hvm:ebs
134
+ property 'KeyName', 'test'
135
+ property 'SecurityGroupIds', ['sg-dd733c41', 'sg-dd738df3']
136
+ property 'Tags', [{
137
+ 'Key' => 'Name',
138
+ 'Value' => 'test-1'
139
+ }]
140
+
141
+ property 'DisableApiTermination', false
142
+ end
143
+
144
+ ## `ec2_instnce` extends `resource`. The following results in JSON
145
+ ## identical to that of Resource[AnEC2Instance]
146
+ ec2_instance 'AnOtherInstance' do
147
+ availability_zone 'us-east-1a'
148
+ image_id 'ami-76e27e1e'
149
+ key_name 'test'
150
+
151
+ security_group 'sg-dd733c41'
152
+ security_group 'sg-dd738df3'
153
+
154
+ tag 'Name', 'test-2'
155
+
156
+ ## All of the methods of the `resource` primative are available in
157
+ ## its children:
158
+ property 'DisableApiTermination', false
159
+ end
160
+ end.to_json
161
+ ```
162
+
163
+ ### Parameters
164
+ http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/parameters-section-structure.html
165
+
166
+ ```ruby
167
+ parameter 'InstanceType' do
168
+ type 'String'
169
+ description 'Set the thing\'s instance flavor'
170
+ default 'm3.medium'
171
+
172
+ allow 'm3.medium'
173
+ allow 'm3.large'
174
+ allow 'm3.xlarge'
175
+ end
176
+ ```
177
+
178
+ ### Mappings
179
+ http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/mappings-section-structure.html
180
+
181
+ ```ruby
182
+ mapping 'RegionalAMIs' do
183
+ item 'us-east-1', 'hvm', 'ami-76e27e1e'
184
+ item 'us-west-1', 'hvm', 'ami-d5180890'
185
+ item 'us-east-1', 'pv', 'ami-64e27e0c'
186
+ item 'us-west-1', 'pv', 'ami-c5180880'
187
+ end
188
+ ```
189
+
190
+ ### Conditions
191
+ http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/conditions-section-structure.html
192
+
193
+ Not implemented yet.
194
+
195
+ ### Resources
196
+ http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/resources-section-structure.html
197
+
198
+ ```ruby
199
+ resource 'AnInstance' do
200
+ type 'AWS::EC2::Instance'
201
+
202
+ ## Optional condition reference
203
+ condition 'SomeCondition'
204
+
205
+ ## Add Resource Properties
206
+ property 'AvailabilityZone', 'us-east-1a'
207
+ property 'ImageId', 'ami-76e27e1e' ## Ubuntu 14.04 hvm:ebs
208
+ property 'KeyName', 'test'
209
+ ...
210
+ end
211
+ ```
212
+
213
+ ### Outputs
214
+ http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/outputs-section-structure.html
215
+
216
+ ```ruby
217
+ output 'SomeName' do
218
+ description 'An Important Attribute'
219
+ value get_att('Resource', 'Attribute')
220
+
221
+ ## Optional condition reference
222
+ condition 'SomeCondition'
223
+ end
224
+ ```
225
+
226
+ ### Intrinsic Functions
227
+ http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference.html
228
+
229
+ All intrinsic functions are available as helper methods:
230
+
231
+ * base64(content)
232
+ * fn_and(conditions...)
233
+ * fn_equals(value_1, value_2)
234
+ * fn_if(condition, value_true, value_false)
235
+ * fn_not(condition)
236
+ * fn_or(conditions...)
237
+ * find_in_map(map_name, key_1, key_2)
238
+ * get_att(resource, attr_name)
239
+ * get_azs(region)
240
+ * join(delimiter, values...)
241
+ * select(index, objects...)
242
+ * fn_ref(resource)
243
+
244
+ ```ruby
245
+ ec2_instance "TestInstanceFoo#{ i }" do
246
+ image_id find_in_map('RegionalAMIs', fn_ref('AWS::Region'), 'hvm')
247
+ instance_type 'm3.medium'
248
+ key_name find_in_map('RegionalKeys', fn_ref('AWS::Region'), 'test')
249
+ security_group fn_ref('LousySecurityGroup')
250
+ subnet fn_ref("TestSubnet")
251
+ end
252
+ ```
253
+
254
+ ## Stack Control
255
+ The `Stack` class provides a state wrapper for CloudFormation Stacks. It tracks the state of the managed stack, and creates/updates accordingly. `Stack` is also region-aware, and can be used within a template to define resources that depend upon availability-zones or other region-specific neuances that cannot be represented as maps or require iteration.
256
+
257
+ ### Class `Convection::Control::Stack`
258
+ * `.new(name, template, options = {})`
259
+ * _name_ CloudFormation Stack name
260
+ * _template_ Instance of Convection::Model::Template
261
+ * _options_ - Hash
262
+ * _region_ - AWS region, format `us-east-1`. Default us-east-1
263
+ * _credentials_ - Optional instance of AWS::Credentials. See the [AWS-SDK Documentation](http://docs.aws.amazon.com/sdkforruby/api/frames.html)
264
+ * _parameters_ - Stack parameters, as a `Hash` of `{ key => value }`
265
+ * _tags_ - Stack tags, as a `Hash` of `{ key => value }`
266
+ * _on_failure_ - Create failure action. Default `DELETE`
267
+ * _capabilities_ - See the [AWS-SDK Documentation](http://docs.aws.amazon.com/sdkforruby/api/Aws/CloudFormation/Client.html#create_stack-instance_method)
268
+ * Additional options will be passed directly to `create_stack` and `update_stack`
269
+
270
+ * `#status` - Returns the stack status
271
+ * `#exist?` - Returns true if the stack exists and is not in a DELETED state
272
+ * `#complete?`
273
+ * `#rollback?`
274
+ * `#fail?`
275
+ * `#render` - Populates the provided template with any environment data included in the stack (e.g. availability zones). Returns a `Hash`
276
+ * `#to_json` - Render template and transofrm to a pretty-generated JSON `String`
277
+ * `#apply` - Renter template and create/update CloudFormation Stack
278
+ * `#delete` - Delete CloudFormation Stack
279
+ * `#availability_zones(&block)` - Return an array of strings representing the region's availability zones. Provided codeblock will be called for each AZ.
280
+
281
+ ## License
282
+ _Copyright (c) 2015 John Manero, Rapid7 LLC._
283
+
284
+ ```
285
+ MIT License
286
+ ===========
287
+
288
+ Permission is hereby granted, free of charge, to any person obtaining
289
+ a copy of this software and associated documentation files (the
290
+ "Software"), to deal in the Software without restriction, including
291
+ without limitation the rights to use, copy, modify, merge, publish,
292
+ distribute, sublicense, and/or sell copies of the Software, and to
293
+ permit persons to whom the Software is furnished to do so, subject to
294
+ the following conditions:
295
+
296
+ The above copyright notice and this permission notice shall be
297
+ included in all copies or substantial portions of the Software.
298
+
299
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
300
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
301
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
302
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
303
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
304
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
305
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
306
+
307
+ ```
308
+ email:
309
+ - jmanero@rapid7.com
310
+ executables: []
311
+ extensions: []
312
+ extra_rdoc_files: []
313
+ files:
314
+ - .gitignore
315
+ - .rubocop.yml
316
+ - Gemfile
317
+ - LICENSE
318
+ - README.md
319
+ - Rakefile
320
+ - Thorfile
321
+ - convection.gemspec
322
+ - example/iam_role.rb
323
+ - example/s3.rb
324
+ - example/vpc.rb
325
+ - lib/convection.rb
326
+ - lib/convection/control/stack.rb
327
+ - lib/convection/dsl/helpers.rb
328
+ - lib/convection/dsl/intrinsic_functions.rb
329
+ - lib/convection/model/mixin/cidr_block.rb
330
+ - lib/convection/model/mixin/conditional.rb
331
+ - lib/convection/model/mixin/taggable.rb
332
+ - lib/convection/model/template.rb
333
+ - lib/convection/model/template/mapping.rb
334
+ - lib/convection/model/template/output.rb
335
+ - lib/convection/model/template/parameter.rb
336
+ - lib/convection/model/template/resource.rb
337
+ - lib/convection/model/template/resource/aws_ec2_instance.rb
338
+ - lib/convection/model/template/resource/aws_ec2_internet_gateway.rb
339
+ - lib/convection/model/template/resource/aws_ec2_route.rb
340
+ - lib/convection/model/template/resource/aws_ec2_route_table.rb
341
+ - lib/convection/model/template/resource/aws_ec2_security_group.rb
342
+ - lib/convection/model/template/resource/aws_ec2_subnet.rb
343
+ - lib/convection/model/template/resource/aws_ec2_subnet_route_table_association.rb
344
+ - lib/convection/model/template/resource/aws_ec2_vpc.rb
345
+ - lib/convection/model/template/resource/aws_ec2_vpc_gateway_attachment.rb
346
+ - lib/convection/model/template/resource/aws_iam_policy.rb
347
+ - lib/convection/model/template/resource/aws_iam_role.rb
348
+ - lib/convection/model/template/resource/aws_s3_bucket.rb
349
+ - lib/convection/model/template/resource/aws_s3_bucket_policy.rb
350
+ - lib/convection/version.rb
351
+ homepage: ''
352
+ licenses:
353
+ - MIT
354
+ metadata: {}
355
+ post_install_message:
356
+ rdoc_options: []
357
+ require_paths:
358
+ - lib
359
+ required_ruby_version: !ruby/object:Gem::Requirement
360
+ requirements:
361
+ - - '>='
362
+ - !ruby/object:Gem::Version
363
+ version: '0'
364
+ required_rubygems_version: !ruby/object:Gem::Requirement
365
+ requirements:
366
+ - - '>='
367
+ - !ruby/object:Gem::Version
368
+ version: '0'
369
+ requirements: []
370
+ rubyforge_project:
371
+ rubygems_version: 2.0.14
372
+ signing_key:
373
+ specification_version: 4
374
+ summary: A fully generic, modular DSL for AWS CloudFormation
375
+ test_files: []