convection 0.4.0 → 0.4.1

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: 52f9ff70289c904424ca0729efbb738275ae4ac9
4
- data.tar.gz: c1a29763fc7d8d3bb533391070e8d8afa90a6a5c
3
+ metadata.gz: d7f560ff0230cc8a78bdc3e59c57d2b5befbfe37
4
+ data.tar.gz: 54969c701ca627f77a22a38a67e70aa43e1c93a8
5
5
  SHA512:
6
- metadata.gz: 192a854ef9284ce12e6d4ad993745fb95c57549ffc1271c96c016f601863ff814a735b2062435d6b89814949665a30ef833c02103d5c466c30a5df26c5af5077
7
- data.tar.gz: 5c7f9be96c5649c0833f2e7d059fc08497377fd8d26ea7477ff98fdd5a21432ee68e58ae4e5685cbc30a34e2af29de25c02b65d9d3da9622a715d32e4d5c7c75
6
+ metadata.gz: 1db320b7089911c0e28b80709348897131f11f4a15e3529e406c78d09760cb65d0aa8df505e98c1f2d84e707b3383311cc5c044198cc9f5ba25648beb5d3b01d
7
+ data.tar.gz: 11e1bce3c3781d8899f6ad2c5ac1a0acc6ba1ec3766160c0e1cc0c96f279330831b67121aab7e8173cf5ea55fae9f52ed3d1260be86aa17274a0410be0a9cd95
@@ -254,7 +254,7 @@ module Convection
254
254
  # template has any changes compared to the current template (in
255
255
  # CloudFormation).
256
256
  def resource_changes?
257
- ours = { 'Resources' => @template.resources.map(&:render) }
257
+ ours = { 'Resources' => @template.all_resources.map(&:render) }
258
258
  thiers = { 'Resources' => @current_template['Resources'] }
259
259
 
260
260
  ours.diff(thiers).any?
@@ -24,6 +24,12 @@ module Convection
24
24
  resources[rname] = resource
25
25
  end
26
26
  end
27
+
28
+ def attach_resource_collection(name, klass)
29
+ define_method(name) do |rname, &block|
30
+ resource_collections[rname] = klass.new(rname, self, &block)
31
+ end
32
+ end
27
33
  end
28
34
  end
29
35
 
@@ -187,6 +193,7 @@ module Convection
187
193
  attr_reader :parameters
188
194
  attr_reader :mappings
189
195
  attr_reader :conditions
196
+ attr_reader :resource_collections
190
197
  attr_reader :resources
191
198
  attr_reader :outputs
192
199
 
@@ -207,6 +214,7 @@ module Convection
207
214
  @mappings = Collection.new
208
215
  @conditions = Collection.new
209
216
  @resources = Collection.new
217
+ @resource_collections = Collection.new
210
218
  @outputs = Collection.new
211
219
  @metadata = Collection.new
212
220
  end
@@ -217,6 +225,11 @@ module Convection
217
225
 
218
226
  def execute
219
227
  instance_exec(&@definition)
228
+
229
+ resource_collections.each do |_, group|
230
+ group.run_definition
231
+ group.execute
232
+ end
220
233
  end
221
234
 
222
235
  def render(stack_ = nil)
@@ -231,12 +244,18 @@ module Convection
231
244
  'Parameters' => parameters.map(&:render),
232
245
  'Mappings' => mappings.map(&:render),
233
246
  'Conditions' => conditions.map(&:render),
234
- 'Resources' => resources.map(&:render),
247
+ 'Resources' => all_resources.map(&:render),
235
248
  'Outputs' => outputs.map(&:render),
236
249
  'Metadata' => metadata.map(&:render)
237
250
  }
238
251
  end
239
252
 
253
+ def all_resources
254
+ resource_collections.reduce(resources) do |result, (_name, resource_collection)|
255
+ result.merge(resource_collection.resources)
256
+ end
257
+ end
258
+
240
259
  def diff(other, stack_ = nil)
241
260
  render(stack_).diff(other).map { |diff| Diff.new(diff[0], *diff[1]) }
242
261
  end
@@ -353,5 +372,6 @@ require_relative 'template/condition'
353
372
  require_relative 'template/resource'
354
373
  require_relative 'template/resource_property'
355
374
  require_relative 'template/resource_attribute'
375
+ require_relative 'template/resource_collection'
356
376
  require_relative 'template/output'
357
377
  require_relative 'template/metadata'
@@ -0,0 +1,48 @@
1
+ require 'forwardable'
2
+ require_relative './resource'
3
+ require_relative '../mixin/conditional'
4
+
5
+ module Convection
6
+ module Model
7
+ class Template
8
+ # A collection of different {Convection::Model::Template::Resource}s.
9
+ class ResourceCollection
10
+ extend Forwardable
11
+ include DSL::Helpers
12
+ include DSL::Template::Resource
13
+ include Mixin::Conditional
14
+
15
+ attr_reader :name
16
+ attr_reader :parent
17
+ attr_reader :template
18
+
19
+ def_delegator :@template, :stack
20
+
21
+ class << self
22
+ def attach_to_dsl(dsl_name)
23
+ DSL::Template::Resource.attach_resource_collection(dsl_name, self)
24
+ end
25
+ end
26
+
27
+ def initialize(name, parent, &definition)
28
+ @definition = definition
29
+ @name = name
30
+ @parent = parent
31
+ @template = parent.template
32
+ end
33
+
34
+ # @note This method is in place to be overriden by subclasses.
35
+ def execute
36
+ end
37
+
38
+ def run_definition
39
+ instance_exec(&@definition) if @definition
40
+ end
41
+
42
+ def resources
43
+ @resources ||= Convection::Model::Collection.new
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,63 @@
1
+ require 'spec_helper'
2
+
3
+ class Convection::Model::Template
4
+ describe ResourceCollection do
5
+ class WebService < Convection::Model::Template::ResourceCollection
6
+ attach_to_dsl(:web_service)
7
+
8
+ attribute :use_elastic_load_balancing
9
+
10
+ def execute
11
+ web_service = self # Expose this instance to nested template methods.
12
+
13
+ ec2_instance "#{name}WebService"
14
+
15
+ elb "#{name}LoadBalancer" do
16
+ tag 'Description', "Load balancer for the #{web_service.name} web service."
17
+ end if use_elastic_load_balancing
18
+ end
19
+ end
20
+
21
+ let(:use_elb_value) { nil }
22
+ let(:template) do
23
+ outer_scope = self
24
+ Convection.template do
25
+ description 'ResourceCollection Test Template'
26
+
27
+ # A lone resource for testing merging of resources and nested resources.
28
+ ec2_instance 'LoneResource1'
29
+
30
+ web_service 'ExampleDotOrg' do
31
+ use_elastic_load_balancing outer_scope.use_elb_value
32
+ end
33
+ end
34
+ end
35
+
36
+ subject do
37
+ template_json
38
+ .fetch('Resources')
39
+ end
40
+
41
+ context 'when the use_elastic_load_balancing attribute is set' do
42
+ let(:use_elb_value) { true }
43
+
44
+ it { is_expected.to have_key('LoneResource1') }
45
+ it { is_expected.to have_key('ExampleDotOrgWebService') }
46
+ it { is_expected.to have_key('ExampleDotOrgLoadBalancer') }
47
+ end
48
+
49
+ context 'when the use_elastic_load_balancing attribute is not set' do
50
+ let(:use_elb_value) { false }
51
+
52
+ it { is_expected.to have_key('LoneResource1') }
53
+ it { is_expected.to have_key('ExampleDotOrgWebService') }
54
+ it { is_expected.to_not have_key('ExampleDotOrgLoadBalancer') }
55
+ end
56
+
57
+ private
58
+
59
+ def template_json
60
+ JSON.parse(template.to_json)
61
+ end
62
+ end
63
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: convection
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 0.4.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - John Manero
@@ -203,6 +203,7 @@ files:
203
203
  - lib/convection/model/template/resource/aws_sqs_queue_policy.rb
204
204
  - lib/convection/model/template/resource_attribute.rb
205
205
  - lib/convection/model/template/resource_attribute/update_policy.rb
206
+ - lib/convection/model/template/resource_collection.rb
206
207
  - lib/convection/model/template/resource_property.rb
207
208
  - lib/convection/model/template/resource_property/aws_cloudfront_cachebehavior.rb
208
209
  - lib/convection/model/template/resource_property/aws_cloudfront_customerrorresponse.rb
@@ -252,6 +253,7 @@ files:
252
253
  - spec/convection/model/template/resource/rds_security_groups_spec.rb
253
254
  - spec/convection/model/template/resource/vpc_endpoints_spec.rb
254
255
  - spec/convection/model/template/resource_attribute/update_policies_spec.rb
256
+ - spec/convection/model/template/resource_collection_spec.rb
255
257
  - spec/convection/model/template/template_spec.rb
256
258
  - spec/convection/model/template/validate_bytesize_spec.rb
257
259
  - spec/convection/model/template/validate_description_spec.rb
@@ -284,7 +286,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
284
286
  version: '0'
285
287
  requirements: []
286
288
  rubyforge_project:
287
- rubygems_version: 2.4.3
289
+ rubygems_version: 2.4.5
288
290
  signing_key:
289
291
  specification_version: 4
290
292
  summary: A fully generic, modular DSL for AWS CloudFormation
@@ -315,6 +317,7 @@ test_files:
315
317
  - spec/convection/model/template/resource/rds_security_groups_spec.rb
316
318
  - spec/convection/model/template/resource/vpc_endpoints_spec.rb
317
319
  - spec/convection/model/template/resource_attribute/update_policies_spec.rb
320
+ - spec/convection/model/template/resource_collection_spec.rb
318
321
  - spec/convection/model/template/template_spec.rb
319
322
  - spec/convection/model/template/validate_bytesize_spec.rb
320
323
  - spec/convection/model/template/validate_description_spec.rb