cfhighlander 0.2.1 → 0.3.0.alpha.1528936037
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +199 -82
- data/bin/cfhighlander +1 -1
- data/bin/{highlander.rb → cfhighlander.rb} +39 -23
- data/cfndsl_ext/sg.rb +29 -2
- data/hl_ext/mapping_helper.rb +6 -4
- data/lib/{highlander.compiler.rb → cfhighlander.compiler.rb} +26 -18
- data/lib/{highlander.dsl.base.rb → cfhighlander.dsl.base.rb} +3 -2
- data/lib/cfhighlander.dsl.params.rb +108 -0
- data/lib/cfhighlander.dsl.subcomponent.rb +274 -0
- data/lib/{highlander.dsl.rb → cfhighlander.dsl.template.rb} +111 -63
- data/lib/cfhighlander.factory.rb +45 -0
- data/lib/cfhighlander.factory.templatefinder.rb +248 -0
- data/lib/{highlander.helper.rb → cfhighlander.helper.rb} +2 -2
- data/lib/{highlander.mapproviders.rb → cfhighlander.mapproviders.rb} +1 -1
- data/lib/cfhighlander.model.component.rb +177 -0
- data/lib/cfhighlander.model.templatemeta.rb +25 -0
- data/lib/{highlander.publisher.rb → cfhighlander.publisher.rb} +3 -3
- data/lib/{highlander.validator.rb → cfhighlander.validator.rb} +1 -1
- data/lib/util/zip.util.rb +1 -1
- data/templates/cfndsl.component.template.erb +15 -14
- metadata +38 -15
- data/lib/highlander.dsl.component.rb +0 -243
- data/lib/highlander.dsl.params.rb +0 -113
- data/lib/highlander.factory.rb +0 -359
@@ -2,26 +2,33 @@
|
|
2
2
|
|
3
3
|
extensions_folder = "#{File.dirname(__FILE__)}/../hl_ext"
|
4
4
|
|
5
|
-
Dir["#{extensions_folder}/*.rb"].each {
|
5
|
+
Dir["#{extensions_folder}/*.rb"].each {|f|
|
6
6
|
require f
|
7
7
|
}
|
8
8
|
|
9
9
|
# require libraries
|
10
10
|
|
11
|
-
require_relative './
|
12
|
-
require_relative './
|
13
|
-
require_relative './
|
11
|
+
require_relative './cfhighlander.dsl.base'
|
12
|
+
require_relative './cfhighlander.dsl.params'
|
13
|
+
require_relative './cfhighlander.dsl.subcomponent'
|
14
14
|
|
15
|
-
module
|
15
|
+
module Cfhighlander
|
16
16
|
|
17
17
|
module Dsl
|
18
|
+
class Condition < DslBase
|
18
19
|
|
19
|
-
|
20
|
+
attr_reader :name, :expression
|
21
|
+
|
22
|
+
def initialize(name, expression)
|
23
|
+
@name = name
|
24
|
+
@expression = expression
|
25
|
+
end
|
26
|
+
end
|
27
|
+
class HighlanderTemplate < DslBase
|
20
28
|
|
21
29
|
attr_accessor :mappings,
|
22
30
|
:parameters,
|
23
31
|
:name,
|
24
|
-
:components,
|
25
32
|
:version,
|
26
33
|
:distribute_url,
|
27
34
|
:distribution_bucket,
|
@@ -30,9 +37,11 @@ module Highlander
|
|
30
37
|
:description,
|
31
38
|
:dependson_components
|
32
39
|
|
40
|
+
attr_reader :conditions, :subcomponents
|
41
|
+
|
33
42
|
def initialize
|
34
43
|
@mappings = []
|
35
|
-
@
|
44
|
+
@subcomponents = []
|
36
45
|
@config = { 'mappings' => {}, 'component_version' => 'latest' }
|
37
46
|
@component_configs = {}
|
38
47
|
@version = 'latest'
|
@@ -43,6 +52,7 @@ module Highlander
|
|
43
52
|
@lambda_functions_keys = []
|
44
53
|
@dependson_components_templates = []
|
45
54
|
@dependson_components = []
|
55
|
+
@conditions = []
|
46
56
|
end
|
47
57
|
|
48
58
|
# DSL statements
|
@@ -54,8 +64,12 @@ module Highlander
|
|
54
64
|
end
|
55
65
|
|
56
66
|
def Name(name)
|
57
|
-
|
58
|
-
|
67
|
+
# nested components always have their name dictated by parent
|
68
|
+
# component, defaulting to template name
|
69
|
+
if (not @config.key? 'nested_component')
|
70
|
+
@name = name
|
71
|
+
@config['component_name'] = name
|
72
|
+
end
|
59
73
|
end
|
60
74
|
|
61
75
|
def Description(description)
|
@@ -68,9 +82,13 @@ module Highlander
|
|
68
82
|
@parameters.instance_eval(&block)
|
69
83
|
end
|
70
84
|
|
85
|
+
def Condition(name, expression)
|
86
|
+
@conditions << Condition.new(name, expression)
|
87
|
+
end
|
88
|
+
|
71
89
|
def DynamicMappings(providerName)
|
72
90
|
maps = mappings_provider_maps(providerName, self.config)
|
73
|
-
maps.each {
|
91
|
+
maps.each {|name, map| addMapping(name, map)} unless maps.nil?
|
74
92
|
end
|
75
93
|
|
76
94
|
def DependsOn(template)
|
@@ -78,23 +96,41 @@ module Highlander
|
|
78
96
|
end
|
79
97
|
|
80
98
|
|
81
|
-
def Component(
|
82
|
-
|
99
|
+
def Component(template_arg = nil, template: nil,
|
100
|
+
name: template,
|
101
|
+
param_values: {},
|
102
|
+
config: {},
|
103
|
+
export_config: {},
|
104
|
+
conditional: false,
|
105
|
+
enabled: true,
|
106
|
+
&block)
|
107
|
+
puts "INFO: Requested subcomponent #{name} with template #{template}"
|
108
|
+
if ((not template_arg.nil?) and template.nil?)
|
109
|
+
template = template_arg
|
110
|
+
elsif (template_arg.nil? and template.nil?)
|
111
|
+
raise 'Component must be defined with template name at minimum,' +
|
112
|
+
' passed as first argument, or template: named arguent'
|
113
|
+
end
|
114
|
+
|
115
|
+
name = template if name.nil?
|
83
116
|
|
84
117
|
# load component
|
85
|
-
component =
|
118
|
+
component = Cfhighlander::Dsl::Subcomponent.new(self,
|
86
119
|
name,
|
87
120
|
template,
|
88
121
|
param_values,
|
89
122
|
@component_sources,
|
90
123
|
config,
|
91
|
-
export_config
|
124
|
+
export_config,
|
125
|
+
conditional,
|
126
|
+
enabled
|
92
127
|
)
|
128
|
+
component.instance_eval(&block) unless block.nil?
|
93
129
|
component.distribute_bucket = @distribution_bucket unless @distribution_bucket.nil?
|
94
130
|
component.distribute_prefix = @distribution_prefix unless @distribution_prefix.nil?
|
95
131
|
component.version = @version unless @version.nil?
|
96
132
|
@component_configs[name] = config
|
97
|
-
@
|
133
|
+
@subcomponents << component
|
98
134
|
end
|
99
135
|
|
100
136
|
def ComponentVersion(version)
|
@@ -147,8 +183,8 @@ module Highlander
|
|
147
183
|
def loadComponents()
|
148
184
|
|
149
185
|
# empty config overrides to start with
|
150
|
-
@config_overrides = Hash[@
|
151
|
-
@named_components = Hash[@
|
186
|
+
@config_overrides = Hash[@subcomponents.collect {|c| [c.name, { 'nested_component' => true }]}]
|
187
|
+
@named_components = Hash[@subcomponents.collect {|c| [c.name, c]}]
|
152
188
|
|
153
189
|
# populate overrides with master config defined overrides
|
154
190
|
load_configfile_component_config
|
@@ -170,7 +206,7 @@ module Highlander
|
|
170
206
|
|
171
207
|
|
172
208
|
# load components and extract parent stack parameters and mappings
|
173
|
-
@
|
209
|
+
@subcomponents.each do |component|
|
174
210
|
|
175
211
|
component.load @config_overrides[component.name]
|
176
212
|
# add all of it's stack parameters unless same template has been already processed
|
@@ -180,21 +216,8 @@ module Highlander
|
|
180
216
|
.parameters
|
181
217
|
.param_list.each do |param|
|
182
218
|
|
183
|
-
# add stack parameters
|
184
|
-
if param.class == Highlander::Dsl::StackParam
|
185
|
-
# sub-component stack param becomes top-level component param
|
186
|
-
param_name = param.is_global ? param.name : "#{component.name}#{param.name}"
|
187
|
-
stack_param = Highlander::Dsl::ComponentParam.new(
|
188
|
-
param_name,
|
189
|
-
param.type,
|
190
|
-
param.default_value,
|
191
|
-
param.no_echo
|
192
|
-
)
|
193
|
-
@parameters.addParam stack_param
|
194
|
-
end unless component.param_values.key? param.name
|
195
|
-
|
196
219
|
# for map parameters add maps
|
197
|
-
if param.class ==
|
220
|
+
if param.class == Cfhighlander::Dsl::MappingParam
|
198
221
|
if not param.mapProvider.nil?
|
199
222
|
maps = param.mapProvider.getMaps(component.component_loaded.config)
|
200
223
|
maps.each do |name, map|
|
@@ -211,12 +234,24 @@ module Highlander
|
|
211
234
|
|
212
235
|
end
|
213
236
|
|
214
|
-
|
215
|
-
|
216
|
-
|
237
|
+
component.component_loaded.eval_cfndsl()
|
238
|
+
end
|
239
|
+
|
240
|
+
# in 2nd pass, load parameters
|
241
|
+
# 2nd pass is required as all of cfndsl models need to be populated
|
242
|
+
available_outputs = {}
|
243
|
+
@subcomponents.each do |c|
|
244
|
+
c.component_loaded.outputs.each do |out|
|
245
|
+
available_outputs[out.name] = out
|
246
|
+
end
|
247
|
+
end
|
248
|
+
|
249
|
+
@subcomponents.each do |component|
|
250
|
+
component.resolve_parameter_values available_outputs
|
251
|
+
end
|
217
252
|
|
218
253
|
@dependson_components_templates.each do |template|
|
219
|
-
component =
|
254
|
+
component = Cfhighlander::Dsl::Subcomponent.new(self,
|
220
255
|
template,
|
221
256
|
template,
|
222
257
|
{},
|
@@ -228,7 +263,7 @@ module Highlander
|
|
228
263
|
end
|
229
264
|
|
230
265
|
def load_extension_exports
|
231
|
-
@
|
266
|
+
@subcomponents.each do |c|
|
232
267
|
component = c.component_loaded
|
233
268
|
config = component.config
|
234
269
|
if ((config.key? 'lib_export') and (config['lib_export'].key? 'global'))
|
@@ -237,7 +272,7 @@ module Highlander
|
|
237
272
|
if global_export_config.key? 'cfndsl'
|
238
273
|
global_export_config['cfndsl'].each do |exported_extension|
|
239
274
|
extension_file_path = "#{component.component_dir}/ext/cfndsl/#{exported_extension}.rb"
|
240
|
-
@
|
275
|
+
@subcomponents.each do |cr|
|
241
276
|
cr.component_loaded.cfndsl_ext_files << extension_file_path unless cr == c
|
242
277
|
end
|
243
278
|
end
|
@@ -248,16 +283,20 @@ module Highlander
|
|
248
283
|
end
|
249
284
|
|
250
285
|
def apply_config_overrides
|
251
|
-
@config_overrides.each {
|
286
|
+
@config_overrides.each {|component_name, component_override|
|
252
287
|
@named_components[component_name].component_loaded.config.extend(component_override)
|
253
288
|
}
|
254
289
|
end
|
255
290
|
|
256
291
|
def load_configfile_component_config
|
257
292
|
if (@config.key? 'components')
|
258
|
-
@config['components'].each {
|
293
|
+
@config['components'].each {|component_name, component_config|
|
259
294
|
if component_config.key?('config')
|
260
|
-
@config_overrides
|
295
|
+
if @config_overrides.key? component_name
|
296
|
+
@config_overrides[component_name].extend(component_config['config'])
|
297
|
+
else
|
298
|
+
STDERR.puts("WARN: Overriding config for non-existing component #{component_name}")
|
299
|
+
end
|
261
300
|
end
|
262
301
|
}
|
263
302
|
end
|
@@ -266,28 +305,28 @@ module Highlander
|
|
266
305
|
def apply_config_exports
|
267
306
|
# first export from master to all children
|
268
307
|
if ((@config.key? 'config_export') and (@config['config_export']['global']))
|
269
|
-
@config['config_export']['global'].each {
|
308
|
+
@config['config_export']['global'].each {|global_export_key|
|
270
309
|
if @config.key? global_export_key
|
271
|
-
@config_overrides.each {
|
310
|
+
@config_overrides.each {|cname, co|
|
272
311
|
co[global_export_key] = @config[global_export_key]
|
273
312
|
}
|
274
313
|
end
|
275
314
|
}
|
276
315
|
end
|
277
316
|
|
278
|
-
@
|
317
|
+
@subcomponents.each {|component|
|
279
318
|
cl = component.component_loaded
|
280
319
|
if ((not cl.config.nil?) and (cl.config.key? 'config_export'))
|
281
320
|
|
282
321
|
# global config
|
283
322
|
if cl.config['config_export'].key? 'global'
|
284
|
-
cl.config['config_export']['global'].each {
|
323
|
+
cl.config['config_export']['global'].each {|global_export_key|
|
285
324
|
|
286
325
|
# global config is exported to parent and every component
|
287
326
|
if cl.config.key? global_export_key
|
288
327
|
|
289
328
|
# cname is for component name, co for component override
|
290
|
-
@config_overrides.each {
|
329
|
+
@config_overrides.each {|cname, co|
|
291
330
|
|
292
331
|
# if templates are different e.g don't export from vpc to vpc
|
293
332
|
config_receiver_component = @named_components[cname]
|
@@ -295,11 +334,11 @@ module Highlander
|
|
295
334
|
if (not config_receiver_component.export_config.nil?) and (config_receiver_component.export_config.key? component.template)
|
296
335
|
allow_from_component_name = config_receiver_component.export_config[component.template]
|
297
336
|
if allow_from_component_name == component.name
|
298
|
-
puts("Exporting key #{global_export_key} from component #{component.name} to #{cname}")
|
337
|
+
puts("INFO: Exporting key #{global_export_key} from component #{component.name} to #{cname}")
|
299
338
|
co[global_export_key] = cl.config[global_export_key]
|
300
339
|
end
|
301
340
|
else
|
302
|
-
puts("Exporting key #{global_export_key} from component #{component.name} to #{cname}")
|
341
|
+
puts("INFO: Exporting key #{global_export_key} from component #{component.name} to #{cname}")
|
303
342
|
co[global_export_key] = cl.config[global_export_key]
|
304
343
|
end
|
305
344
|
end
|
@@ -313,7 +352,7 @@ module Highlander
|
|
313
352
|
end
|
314
353
|
|
315
354
|
if cl.config['config_export'].key? 'component'
|
316
|
-
cl.config['config_export']['component'].each {
|
355
|
+
cl.config['config_export']['component'].each {|component_name, export_keys|
|
317
356
|
# check if there is configuration of export from this component
|
318
357
|
# and if there is export configuration for given component name
|
319
358
|
|
@@ -322,7 +361,7 @@ module Highlander
|
|
322
361
|
if @config_overrides.key? component.export_config[component_name]
|
323
362
|
# override the config
|
324
363
|
real_component_name = component.export_config[component_name]
|
325
|
-
export_keys.each {
|
364
|
+
export_keys.each {|export_component_key|
|
326
365
|
puts("Exporting config for key=#{export_component_key} from #{component.name} to #{real_component_name}")
|
327
366
|
if not @config_overrides[real_component_name].key? export_component_key
|
328
367
|
@config_overrides[real_component_name][export_component_key] = {}
|
@@ -333,7 +372,7 @@ module Highlander
|
|
333
372
|
STDERR.puts("Trying to export configuration for non-existant component #{component.export_config[component_name]}")
|
334
373
|
end
|
335
374
|
elsif @config_overrides.key? component_name
|
336
|
-
export_keys.each {
|
375
|
+
export_keys.each {|export_component_key|
|
337
376
|
puts("Exporting config for key=#{export_component_key} from #{component.name} to #{component_name}")
|
338
377
|
if not @config_overrides[component_name].key? export_component_key
|
339
378
|
@config_overrides[component_name][export_component_key] = {}
|
@@ -353,7 +392,7 @@ module Highlander
|
|
353
392
|
end
|
354
393
|
|
355
394
|
def load_explicit_component_config
|
356
|
-
@component_configs.each {
|
395
|
+
@component_configs.each {|component_name, component_config|
|
357
396
|
@config_overrides[component_name].extend(component_config)
|
358
397
|
}
|
359
398
|
end
|
@@ -368,15 +407,15 @@ module Highlander
|
|
368
407
|
build_distribution_url
|
369
408
|
end
|
370
409
|
|
371
|
-
def name=(value)
|
372
|
-
|
373
|
-
end
|
410
|
+
# def name=(value)
|
411
|
+
# self.Name(value)
|
412
|
+
# end
|
374
413
|
|
375
414
|
def build_distribution_url
|
376
415
|
if not (@distribution_bucket.nil? or @distribution_prefix.nil?)
|
377
416
|
@distribute_url = "https://#{@distribution_bucket}.s3.amazonaws.com/#{@distribution_prefix}"
|
378
417
|
@distribute_url = "#{@distribute_url}/#{@version}" unless @version.nil?
|
379
|
-
@
|
418
|
+
@subcomponents.each {|component|
|
380
419
|
component.distribute_bucket = @distribution_bucket unless @distribution_bucket.nil?
|
381
420
|
component.distribute_prefix = @distribution_prefix unless @distribution_prefix.nil?
|
382
421
|
component.version = @version unless @version.nil?
|
@@ -391,13 +430,12 @@ module Highlander
|
|
391
430
|
|
392
431
|
end
|
393
432
|
|
394
|
-
def
|
395
|
-
instance =
|
433
|
+
def CfhighlanderTemplate(&block)
|
434
|
+
instance = Cfhighlander::Dsl::HighlanderTemplate.new
|
396
435
|
|
397
436
|
puts "Processing higlander component #{@name}\n\tLocation:#{@highlander_dsl_path}" +
|
398
437
|
"\n\tConfig:#{@config}"
|
399
438
|
|
400
|
-
component_config = @config
|
401
439
|
|
402
440
|
instance.config = @config
|
403
441
|
|
@@ -407,6 +445,7 @@ def HighlanderComponent(&block)
|
|
407
445
|
|
408
446
|
unless @version.nil?
|
409
447
|
instance.version = @version
|
448
|
+
instance.config['component_version'] = @version
|
410
449
|
end
|
411
450
|
|
412
451
|
unless @distribution_bucket.nil?
|
@@ -416,13 +455,22 @@ def HighlanderComponent(&block)
|
|
416
455
|
instance.DistributionPrefix(@distribution_prefix)
|
417
456
|
end
|
418
457
|
|
458
|
+
instance.name = @template.template_name
|
419
459
|
instance.instance_eval(&block)
|
420
|
-
|
421
|
-
instance.name = @name
|
422
|
-
end
|
460
|
+
|
423
461
|
|
424
462
|
# load sub-components
|
425
463
|
instance.loadComponents
|
426
464
|
|
427
465
|
return instance
|
428
466
|
end
|
467
|
+
|
468
|
+
def CfhighlanderComponent(&block)
|
469
|
+
STDERR.puts("DEPRECATED: #{@template.template_name}: use CfhighlanderTemplate instead of CfhighlanderComponent")
|
470
|
+
CfhighlanderTemplate(&block)
|
471
|
+
end
|
472
|
+
|
473
|
+
def HighlanderComponent(&block)
|
474
|
+
STDERR.puts("DEPRECATED: #{@template.template_name}: use CfhighlanderTemplate instead of HighlanderComponent")
|
475
|
+
CfhighlanderTemplate(&block)
|
476
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
require_relative './cfhighlander.dsl.template'
|
2
|
+
require_relative './cfhighlander.factory.templatefinder'
|
3
|
+
require_relative './cfhighlander.model.component'
|
4
|
+
require 'fileutils'
|
5
|
+
require 'git'
|
6
|
+
|
7
|
+
|
8
|
+
module Cfhighlander
|
9
|
+
|
10
|
+
module Factory
|
11
|
+
|
12
|
+
class ComponentFactory
|
13
|
+
|
14
|
+
attr_accessor :component_sources
|
15
|
+
|
16
|
+
def initialize(component_sources = [])
|
17
|
+
@template_finder = Cfhighlander::Factory::TemplateFinder.new(component_sources)
|
18
|
+
@component_sources = component_sources
|
19
|
+
end
|
20
|
+
|
21
|
+
# Find component and given list of sources
|
22
|
+
# @return [Cfhighlander::Factory::Component]
|
23
|
+
def loadComponentFromTemplate(template_name, template_version = nil, component_name = nil)
|
24
|
+
|
25
|
+
template_meta = @template_finder.findTemplate(template_name, template_version)
|
26
|
+
|
27
|
+
raise StandardError, "highlander template #{template_name}@#{template_version} not located" +
|
28
|
+
" in sources #{@component_sources}" if template_meta.nil?
|
29
|
+
|
30
|
+
component_name = template_name if component_name.nil?
|
31
|
+
return buildComponentFromLocation(template_meta, component_name)
|
32
|
+
|
33
|
+
end
|
34
|
+
|
35
|
+
|
36
|
+
def buildComponentFromLocation(template_meta, component_name)
|
37
|
+
component = Model::Component.new(template_meta, component_name)
|
38
|
+
component.load_config
|
39
|
+
return component
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|