cfhighlander 0.11.2 → 0.12.0.alpha.1586682642

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
  SHA256:
3
- metadata.gz: f82df7084cf7c58397cb4cc64b52e6cefec73d0e61a1de64b954da08babef64d
4
- data.tar.gz: be93a1b33e5f3d66bb7602ef69a2ce9e94dafdf2a64bf8c95a36291ca58bb3ca
3
+ metadata.gz: 02bbde329ed3125c83f384cca69be0862a1230a790a37f4c76f12701d5cd2fc1
4
+ data.tar.gz: 9ac2c3a65c60e09326d55c8232933bf2478bb5d55fbff40d4a9059e602443049
5
5
  SHA512:
6
- metadata.gz: 4517f26c01442c90af9626adcd0f0eb4f6a8dc4a1d395e98b7e779842a351e9578c18dc23c4451a38f9e90dab5720e3afaf29f9866661eefcfad9a3deec7c0bb
7
- data.tar.gz: 7be5c2cedebae06a69228dc0e03f90cd5962bd8a95799b5e81f4cae6a7210979bc75847019e38b2a62ba68d4873705741a606126d5432884ecfd724f60bd0145
6
+ metadata.gz: 8dfe1520ed5ccf4962db0aa59353e027b4e7f50b23f36f0b73e1d4298a73cab78a35ee7fb8677f73fc0b647371d964c665fcbdac1b21218602f1f638af1b7414
7
+ data.tar.gz: eba6515819000dc62cd07e5d53bdbe1438e94f36b867abd1fefe4d8fb076b4ec70e0e8c94e0875175e1f9eea4c2c31bbb60b1127dc56230e62d5253345021880
data/README.md CHANGED
@@ -301,6 +301,16 @@ compiled cloudformation templates). Same CLI / DSL options apply as for *cfpubli
301
301
 
302
302
  ## Component configuration
303
303
 
304
+ ### Default configuration values
305
+
306
+ Within each template, following configuration values are available by default in both cfhl and cfndsl templates
307
+
308
+ - `template_name` - Name of the cfhighlander template
309
+ - `template_verison` - Version of the cfhighlander component template used
310
+ - `template_dir` - Disk location of the cfhighlander template. Can be used to reference local files within component, and does work with component inheritance
311
+
312
+ ### Defining and overriding configuration
313
+
304
314
  There are 4 levels of component configuration
305
315
 
306
316
  - Component local config file `component.config.yaml` (lowest priority)
@@ -81,7 +81,7 @@ module Cfhighlander
81
81
  build_distribution_url
82
82
 
83
83
  # load component
84
- factory = Cfhighlander::Factory::ComponentFactory.new(@component_sources)
84
+ factory = Cfhighlander::Factory::ComponentFactory.new(@component_sources, parent.template_dir)
85
85
  @component_loaded = factory.loadComponentFromTemplate(
86
86
  @template,
87
87
  @template_version,
@@ -2,7 +2,7 @@
2
2
 
3
3
  extensions_folder = "#{File.dirname(__FILE__)}/../hl_ext"
4
4
 
5
- Dir["#{extensions_folder}/*.rb"].each {|f|
5
+ Dir["#{extensions_folder}/*.rb"].each { |f|
6
6
  require f
7
7
  }
8
8
 
@@ -36,7 +36,8 @@ module Cfhighlander
36
36
  :distribution_prefix,
37
37
  :lambda_functions_keys,
38
38
  :description,
39
- :dependson_components
39
+ :dependson_components,
40
+ :template_dir
40
41
 
41
42
  attr_reader :conditions,
42
43
  :subcomponents,
@@ -61,6 +62,7 @@ module Cfhighlander
61
62
  @extended_template = nil
62
63
  # execution blocks for subcomponents
63
64
  @subcomponents_exec = {}
65
+ @template_dir = nil
64
66
  end
65
67
 
66
68
  # DSL statements
@@ -85,6 +87,11 @@ module Cfhighlander
85
87
  @config['description'] = description
86
88
  end
87
89
 
90
+ def template_dir=(value)
91
+ @template_dir = value
92
+ @config['template_dir'] = value
93
+ end
94
+
88
95
  def Parameters(&block)
89
96
  @parameters.config = @config
90
97
  @parameters.instance_eval(&block) unless block.nil?
@@ -100,7 +107,7 @@ module Cfhighlander
100
107
 
101
108
  def DynamicMappings(providerName)
102
109
  maps = mappings_provider_maps(providerName, self.config)
103
- maps.each {|name, map| addMapping(name, map)} unless maps.nil?
110
+ maps.each { |name, map| addMapping(name, map) } unless maps.nil?
104
111
  end
105
112
 
106
113
  def DependsOn(template)
@@ -131,7 +138,7 @@ module Cfhighlander
131
138
  end
132
139
 
133
140
  name = template if name.nil?
134
-
141
+
135
142
  # load component
136
143
  component = Cfhighlander::Dsl::Subcomponent.new(self,
137
144
  name,
@@ -205,8 +212,8 @@ module Cfhighlander
205
212
  def loadComponents
206
213
 
207
214
  # empty config overrides to start with
208
- @config_overrides = Hash[@subcomponents.collect {|c| [c.name, { 'nested_component' => true }]}]
209
- @named_components = Hash[@subcomponents.collect {|c| [c.name, c]}]
215
+ @config_overrides = Hash[@subcomponents.collect { |c| [c.name, { 'nested_component' => true }] }]
216
+ @named_components = Hash[@subcomponents.collect { |c| [c.name, c] }]
210
217
 
211
218
  # populate overrides with master config defined overrides
212
219
  load_configfile_component_config
@@ -308,14 +315,14 @@ module Cfhighlander
308
315
  end
309
316
 
310
317
  def apply_config_overrides
311
- @config_overrides.each {|component_name, component_override|
318
+ @config_overrides.each { |component_name, component_override|
312
319
  @named_components[component_name].component_loaded.config.extend(component_override)
313
320
  }
314
321
  end
315
322
 
316
323
  def load_configfile_component_config
317
324
  if (@config.key? 'components')
318
- @config['components'].each {|component_name, component_config|
325
+ @config['components'].each { |component_name, component_config|
319
326
  if component_config.key?('config')
320
327
  if @config_overrides.key? component_name
321
328
  @config_overrides[component_name].extend(component_config['config'])
@@ -330,28 +337,28 @@ module Cfhighlander
330
337
  def apply_config_exports
331
338
  # first export from master to all children
332
339
  if ((@config.key? 'config_export') and (@config['config_export']['global']))
333
- @config['config_export']['global'].each {|global_export_key|
340
+ @config['config_export']['global'].each { |global_export_key|
334
341
  if @config.key? global_export_key
335
- @config_overrides.each {|cname, co|
342
+ @config_overrides.each { |cname, co|
336
343
  co[global_export_key] = @config[global_export_key]
337
344
  }
338
345
  end
339
346
  }
340
347
  end
341
348
 
342
- @subcomponents.each {|component|
349
+ @subcomponents.each { |component|
343
350
  cl = component.component_loaded
344
351
  if ((not cl.config.nil?) and (cl.config.key? 'config_export'))
345
352
 
346
353
  # global config
347
354
  if cl.config['config_export'].key? 'global'
348
- cl.config['config_export']['global'].each {|global_export_key|
355
+ cl.config['config_export']['global'].each { |global_export_key|
349
356
 
350
357
  # global config is exported to parent and every component
351
358
  if cl.config.key? global_export_key
352
359
 
353
360
  # cname is for component name, co for component override
354
- @config_overrides.each {|cname, co|
361
+ @config_overrides.each { |cname, co|
355
362
 
356
363
  # if templates are different e.g don't export from vpc to vpc
357
364
  config_receiver_component = @named_components[cname]
@@ -377,7 +384,7 @@ module Cfhighlander
377
384
  end
378
385
 
379
386
  if cl.config['config_export'].key? 'component'
380
- cl.config['config_export']['component'].each {|component_name, export_keys|
387
+ cl.config['config_export']['component'].each { |component_name, export_keys|
381
388
  # check if there is configuration of export from this component
382
389
  # and if there is export configuration for given component name
383
390
 
@@ -386,7 +393,7 @@ module Cfhighlander
386
393
  if @config_overrides.key? component.export_config[component_name]
387
394
  # override the config
388
395
  real_component_name = component.export_config[component_name]
389
- export_keys.each {|export_component_key|
396
+ export_keys.each { |export_component_key|
390
397
  puts("Exporting config for key=#{export_component_key} from #{component.name} to #{real_component_name}")
391
398
  if not @config_overrides[real_component_name].key? export_component_key
392
399
  @config_overrides[real_component_name][export_component_key] = {}
@@ -397,7 +404,7 @@ module Cfhighlander
397
404
  STDERR.puts("Trying to export configuration for non-existant component #{component.export_config[component_name]}")
398
405
  end
399
406
  elsif @config_overrides.key? component_name
400
- export_keys.each {|export_component_key|
407
+ export_keys.each { |export_component_key|
401
408
  puts("Exporting config for key=#{export_component_key} from #{component.name} to #{component_name}")
402
409
  if not @config_overrides[component_name].key? export_component_key
403
410
  @config_overrides[component_name][export_component_key] = {}
@@ -417,7 +424,7 @@ module Cfhighlander
417
424
  end
418
425
 
419
426
  def load_explicit_component_config
420
- @component_configs.each {|component_name, component_config|
427
+ @component_configs.each { |component_name, component_config|
421
428
  @config_overrides[component_name].extend(component_config)
422
429
  }
423
430
 
@@ -441,7 +448,7 @@ module Cfhighlander
441
448
  if not (@distribution_bucket.nil? or @distribution_prefix.nil?)
442
449
  @distribute_url = "https://#{@distribution_bucket}.s3.amazonaws.com/#{@distribution_prefix}"
443
450
  @distribute_url = "#{@distribute_url}/#{@version}" unless @version.nil?
444
- @subcomponents.each {|component|
451
+ @subcomponents.each { |component|
445
452
  component.distribute_bucket = @distribution_bucket unless @distribution_bucket.nil?
446
453
  component.distribute_prefix = @distribution_prefix unless @distribution_prefix.nil?
447
454
  component.version = @version unless @version.nil?
@@ -481,6 +488,7 @@ def CfhighlanderTemplate(&block)
481
488
 
482
489
 
483
490
  instance.name = @template.template_name
491
+ instance.template_dir = @template.template_location
484
492
  instance.instance_eval(&block)
485
493
 
486
494
  unless @distribution_bucket.nil?
@@ -13,8 +13,8 @@ module Cfhighlander
13
13
 
14
14
  attr_accessor :component_sources
15
15
 
16
- def initialize(component_sources = [])
17
- @template_finder = Cfhighlander::Factory::TemplateFinder.new(component_sources)
16
+ def initialize(component_sources = [], parent_path=nil)
17
+ @template_finder = Cfhighlander::Factory::TemplateFinder.new(component_sources, parent_path)
18
18
  @component_sources = component_sources
19
19
  end
20
20
 
@@ -8,8 +8,9 @@ module Cfhighlander
8
8
 
9
9
  class TemplateFinder
10
10
 
11
- def initialize(component_sources = [])
12
- ## First look in local $PWD/components folder
11
+ def initialize(component_sources = [], parent_path = nil)
12
+ ## First look in parent path and it's components folder
13
+ ## Then look in local $PWD/components folder
13
14
  ## Then search for cached $HOME/.highlander/components
14
15
  ## Then search in sources given by dsl
15
16
  default_locations = [
@@ -17,10 +18,13 @@ module Cfhighlander
17
18
  File.expand_path('components'),
18
19
  File.expand_path('.'),
19
20
  ]
21
+
20
22
  default_locations << ENV['CFHIGHLANDER_WORKDIR'] if ENV.key? 'CFHIGHLANDER_WORKDIR'
21
23
  default_locations.each do |predefined_path|
22
24
  component_sources.unshift(predefined_path)
23
25
  end
26
+ component_sources.unshift "#{parent_path}/components" if parent_path
27
+ component_sources.unshift parent_path if parent_path
24
28
 
25
29
  @component_sources = component_sources
26
30
  end
@@ -97,7 +101,7 @@ module Cfhighlander
97
101
  })
98
102
  # if code execution got so far we consider file exists and download it locally
99
103
  component_files = s3.list_objects_v2({ bucket: bucket, prefix: s3_prefix })
100
- component_files.contents.each {|s3_object|
104
+ component_files.contents.each { |s3_object|
101
105
  file_name = s3_object.key.gsub(s3_prefix, '')
102
106
  destination_file = "#{local_destination}/#{file_name}"
103
107
  destination_dir = File.dirname(destination_file)
@@ -236,6 +240,7 @@ module Cfhighlander
236
240
  end
237
241
 
238
242
  def build_meta(template_name, template_version, template_location)
243
+ template_location = template_location[0..-2] if template_location.end_with? File::SEPARATOR
239
244
  return Cfhighlander::Model::TemplateMetadata.new(
240
245
  template_name: template_name,
241
246
  template_version: template_version,
@@ -1,4 +1,5 @@
1
1
  require 'yaml'
2
+ require 'securerandom'
2
3
 
3
4
  module Cfhighlander
4
5
 
@@ -131,6 +132,7 @@ module Cfhighlander
131
132
  @config['component_name'] = @name
132
133
  @config['template_name'] = @template.template_name
133
134
  @config['template_version'] = @template.template_version
135
+ @config['template_dir'] = @template.template_location
134
136
 
135
137
  Dir[candidate_mappings_path].each do |mapping_file|
136
138
  mappings = YAML.load(File.read(mapping_file))
@@ -188,11 +190,17 @@ module Cfhighlander
188
190
 
189
191
  # extend cfndsl, first comes parent, than child
190
192
  # this allows for child component to shadow parent component
191
- # defined resources
193
+ # defined resources. While cfhl evaluation will use parent's template_dir configuration
194
+ # value, for cfndsl, as this is lower level, will resolve in child component template_dir configuration
195
+ # we need to ensure both parent and child components have access to their template_dir variables
196
+ new_template_dir_var = "template_dir_#{SecureRandom.hex[0..8]}"
197
+ extended_component.cfndsl_content.gsub!('template_dir', new_template_dir_var)
198
+ @config[new_template_dir_var] = extended_component.template.template_location
192
199
  @cfndsl_content = extended_component.cfndsl_content + @cfndsl_content
193
200
 
194
201
  @parent_dsl = extended_component.highlander_dsl
195
202
 
203
+ # in case of hldsl or cfndsl refering to template_dir
196
204
  end
197
205
  end
198
206
 
@@ -221,7 +229,6 @@ module Cfhighlander
221
229
  cfhl_script += ("\n#{key} = #{val.inspect}\n")
222
230
  end
223
231
  cfhl_script += File.read(@highlander_dsl_path)
224
-
225
232
  cfhl_dsl = eval(cfhl_script, binding)
226
233
  if not cfhl_dsl.extended_template.nil?
227
234
  @parent_template = cfhl_dsl.extended_template
@@ -239,6 +246,7 @@ module Cfhighlander
239
246
  @cfn_model = value.as_json
240
247
  @cfn_model_raw = JSON.parse(@cfn_model.to_json)
241
248
  end
249
+
242
250
  def eval_cfndsl
243
251
  compiler = Cfhighlander::Compiler::ComponentCompiler.new self
244
252
  compiler.lambda_mock_resolve = true
@@ -1,3 +1,3 @@
1
1
  module Cfhighlander
2
- VERSION="0.11.2".freeze
2
+ VERSION="0.12.0".freeze
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cfhighlander
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.11.2
4
+ version: 0.12.0.alpha.1586682642
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nikola Tosic
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2020-04-10 00:00:00.000000000 Z
13
+ date: 2020-04-12 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: highline
@@ -277,9 +277,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
277
277
  version: '0'
278
278
  required_rubygems_version: !ruby/object:Gem::Requirement
279
279
  requirements:
280
- - - ">="
280
+ - - ">"
281
281
  - !ruby/object:Gem::Version
282
- version: '0'
282
+ version: 1.3.1
283
283
  requirements: []
284
284
  rubyforge_project:
285
285
  rubygems_version: 2.7.7