cfhighlander 0.11.2 → 0.12.0.alpha.1586682642
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +10 -0
- data/lib/cfhighlander.dsl.subcomponent.rb +1 -1
- data/lib/cfhighlander.dsl.template.rb +26 -18
- data/lib/cfhighlander.factory.rb +2 -2
- data/lib/cfhighlander.factory.templatefinder.rb +8 -3
- data/lib/cfhighlander.model.component.rb +10 -2
- data/lib/cfhighlander.version.rb +1 -1
- metadata +4 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 02bbde329ed3125c83f384cca69be0862a1230a790a37f4c76f12701d5cd2fc1
|
4
|
+
data.tar.gz: 9ac2c3a65c60e09326d55c8232933bf2478bb5d55fbff40d4a9059e602443049
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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?
|
data/lib/cfhighlander.factory.rb
CHANGED
@@ -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
|
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
|
data/lib/cfhighlander.version.rb
CHANGED
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.
|
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-
|
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:
|
282
|
+
version: 1.3.1
|
283
283
|
requirements: []
|
284
284
|
rubyforge_project:
|
285
285
|
rubygems_version: 2.7.7
|