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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2db06592f56122df80f8ad27fb1bc67f8920b47a623dbd8f6343f265998efa60
4
- data.tar.gz: fcf86ec795983ec1a73d565e49685314b88dd0bc2cc22174fa1bb41841dfbaa2
3
+ metadata.gz: 16a118e3b352f9d1a3c87f8f2703a990a362c3a46d419f9c8c3a6db2bb6c8ded
4
+ data.tar.gz: 98ce45d749072b5614d9541a43474ffc98eca86983a0d4bb3a38f0967f8b7701
5
5
  SHA512:
6
- metadata.gz: 6a138171e3a15cee57f1ac71a55f8c5bce7d1db15560fe5ee4c11810c0e496e81e838350754375b377f9ffca562fb75abe5b897e1a3ae4ae36af7f5ec518ecea
7
- data.tar.gz: 8a2c7a47987d4500a074346835c65093b3e1dbbdcfbb1d7800ea3fe7d749c3ba0c3fb6e95d0fd4d89b8fe5b530d00fc9f6f57ded2b0fe863ff721319bd51f623
6
+ metadata.gz: efc14c3f56f84ff302a049a82e3e619a150c1bc5825345ed859899412ad06fa8bc7edc385d908fc11a381e197eaf65451ff6ba6156c99fabc49f2f8f3bf52153
7
+ data.tar.gz: e139dab1ac33468f77380ff9fec1e8646fa526db0e48bee5b2be4181db2d09edebdc59e05c1bfec48ff79a4bb56aa0d61cbd690b1fb9283f2f9a58f5f45349c8
data/README.md CHANGED
@@ -1,24 +1,27 @@
1
1
  [![Build Status](https://travis-ci.com/theonestack/cfhighlander.svg?branch=develop)](https://travis-ci.com/theonestack/cfhighlander)
2
2
 
3
- # Highlander
3
+ # Cfhighlander
4
4
 
5
- Highlander is DSL processor that enables composition and orchestration of Amazon CloudFormation templates
5
+ Cfhighlander is DSL processor that enables composition and orchestration of Amazon CloudFormation templates
6
6
  written using [CfnDsl](https://github.com/cfndsl/cfndsl) in an abstract way. It tries to tackle problem of merging multiple templates into master
7
7
  template in an elegant way, so higher degree of template reuse can be achieved. It does so by formalising commonly
8
- used patterns via DSL statements. For an example, passing output of one stack into other stack is achieved using
9
- `OutputParam` highlander DSL statement, rather than wiring this parameters manually in cfndsl templates. For this example to
8
+ used cfndsl template composition patterns via DSL statements. For an example, passing output of one stack into other stack is done
9
+ automatically if parameter and output names are the same,
10
+ rather than wiring them manually in 'master' cfndsl template. For this example to
10
11
  work, parent component will have to pull in both component rendering output values, and component pulling them in
11
- as parameters. It also enables it's user to build component library, where components can be distributed to s3, and
12
- consequentially references to them resolved.
12
+ as parameters. Cfhighlander allows for greater reuse of component templates by allowing references to templates
13
+ via git urls, and s3 urls. [Theonestack](https://github.com/theonestack) has several prebuilt component templates to use,
14
+ with repositories from this org being one of the default sources for searching component templates.
13
15
 
14
- Highlander DSL produces CloudFormation templates in 3 phases
16
+ Highlander DSL produces CloudFormation templates in 4 phases
15
17
 
16
18
  - Processing referenced component's configuration and resolving configuration exports
19
+ - Wiring parameters from components to their inner components
17
20
  - Producing [CfnDsl](https://github.com/cfndsl/cfndsl) templates for all components and subcomponents as intermediary
18
21
  step
19
22
  - Producing resulting CloudFormation templates using configuration and templates generated in two previous phases.
20
23
 
21
- Each phase above is executable as stand-alone through CLI, making development of Highlander templates easier by enabling
24
+ Each phase (aside from parameter wiring) above is executable as stand-alone through CLI, making development of Highlander templates easier by enabling
22
25
  debugging of produced configuration and cfndsl templates.
23
26
 
24
27
 
@@ -41,14 +44,14 @@ this file defines map used within component itself
41
44
  **Component** is basic building block of highlander systems. Components have following roles
42
45
 
43
46
  - Define (include) other components
44
- - Define how their parameters are wired with other components (sibling and outer components)
47
+ - Provide values for their inner component parameters
45
48
  - Define how their configuration affects other components
46
49
  - Define sources of their inner components
47
50
  - Define publish location for both component source code and compiled CloudFormation templates
48
51
  - Define cfndsl template used for building CloudFormation resources
49
52
 
50
53
 
51
- **Outer component** is component that defines other component via higlander dsl `Component` statement. Defined component
54
+ **Outer component** is component that defines other component via cfhighlander dsl `Component` statement. Defined component
52
55
  is called **inner component**. Components defined under same outer component are **sibling components**
53
56
 
54
57
  ## Usage
@@ -58,30 +61,30 @@ For both ways, highlander is distributed as ruby gem
58
61
 
59
62
 
60
63
  ```bash
61
- $ gem install highlander
62
- $ highlander help
63
- highlander commands:
64
- highlander cfcompile component[@version] -f, --format=FORMAT # Compile Highlander component to CloudFormation templates
65
- highlander cfpublish component[@version] -f, --format=FORMAT # Publish CloudFormation template for component, and it' referenced subcomponents
66
- highlander configcompile component[@version] # Compile Highlander components configuration
67
- highlander dslcompile component[@version] -f, --format=FORMAT # Compile Highlander component configuration and create cfndsl templates
68
- highlander help [COMMAND] # Describe available commands or one specific command
69
- highlander publish component[@version] [-v published_version] # Publish CloudFormation template for component, and it' referenced subcomponents
64
+ $ gem install cfhighlander
65
+ $ cfhighlander help
66
+ cfhighlander commands:
67
+ cfhighlander cfcompile component[@version] -f, --format=FORMAT # Compile Highlander component to CloudFormation templates
68
+ cfhighlander cfpublish component[@version] -f, --format=FORMAT # Publish CloudFormation template for component, and it' referenced subcomponents
69
+ cfhighlander configcompile component[@version] # Compile Highlander components configuration
70
+ cfhighlander dslcompile component[@version] -f, --format=FORMAT # Compile Highlander component configuration and create cfndsl templates
71
+ cfhighlander help [COMMAND] # Describe available commands or one specific command
72
+ cfhighlander publish component[@version] [-v published_version] # Publish CloudFormation template for component, and it' referenced subcomponents
70
73
 
71
74
  ```
72
75
  ### Working directory
73
76
 
74
77
  All templates and configuration generated are placed in `$WORKDIR/out` directory. Optionally, you can alter working directory
75
- via `HIGHLANDER_WORKDIR` environment variable.
78
+ via `CFHIGHLANDER_WORKDIR` environment variable.
76
79
 
77
80
  ### Commands
78
81
 
79
82
  To get full list of options for any of cli commands use `highlander help command_name` syntax
80
83
 
81
84
  ```bash
82
- $ highlander help publish
85
+ $ cfhighlander help publish
83
86
  Usage:
84
- highlander publish component[@version] [-v published_version]
87
+ cfhighlander publish component[@version] [-v published_version]
85
88
 
86
89
  Options:
87
90
  [--dstbucket=DSTBUCKET] # Distribution S3 bucket
@@ -89,13 +92,13 @@ Options:
89
92
  -v, [--version=VERSION] # Distribution component version, defaults to latest
90
93
 
91
94
  Publish CloudFormation template for component,
92
- and it' referenced subcomponents
95
+ and it's referenced subcomponents
93
96
 
94
97
  ```
95
98
 
96
99
  #### Silent mode
97
100
 
98
- Highlander DSL processor has built-in support for packaging and deploying AWS Lambda functions. Some of these lambda
101
+ Cfhighlander DSL processor has built-in support for packaging and deploying AWS Lambda functions. Some of these lambda
99
102
  functions may require shell command to be executed (e.g. pulling library dependencies) prior their packaging in ZIP archive format.
100
103
  Such commands are potential security risk, as they allow execution of arbitrary code, so for this reason user agreement is required
101
104
  e.g:
@@ -136,15 +139,14 @@ cfndsl templates. Check component configuration section for more details.
136
139
 
137
140
  #### dslcompile
138
141
 
139
- *dslcompile* will produce intermediary cfndsl templates. This is useful for debugging highlander components
142
+ *dslcompile* will produce intermediary cfndsl templates. This is useful for debugging cfhighlander components
140
143
 
141
144
  #### publish
142
145
 
143
- *publish* command publishes highlander components source code to s3 location (compared to *cfpublish* which is publishing
146
+ *publish* command publishes cfhighlander components source code to s3 location (compared to *cfpublish* which is publishing
144
147
  compiled cloudformation templates). Same CLI / DSL options apply as for *cfpublish* command. Version defaults to `latest`
145
148
 
146
149
 
147
-
148
150
  ## Component configuration
149
151
 
150
152
  There are 4 levels of component configuration
@@ -169,7 +171,7 @@ This configuration level overrides component's own config file.
169
171
  - Outer component explicit configuration. You can pass `config` named parameter to `Component` statement, such as
170
172
 
171
173
  ```ruby
172
- HighlanderComponent do
174
+ CfhighlanderTemplate do
173
175
 
174
176
  # ...
175
177
  # some dsl code
@@ -250,6 +252,47 @@ included via Ruby `require` function in compiled Cfndsl template.
250
252
 
251
253
  ## Component DSL
252
254
 
255
+ ### Inner components or subcomponents
256
+
257
+ Inner components or subcomponents are defined via `Component` DSL statement
258
+
259
+ ```ruby
260
+ CfhighlanderTemplate do
261
+
262
+ # Example1 : Include component by template name only
263
+ Component 'vpc'
264
+
265
+ # Example2 : Include component by template name, version and give it a name
266
+ Component template: 'ecs@master.snapshot'
267
+
268
+ end
269
+
270
+ ```
271
+
272
+ **Conditional components** - If you want to add top level paramater as feature toggle for one of the inner
273
+ components, just mark it as conditional, using `conditional:` named parameter. In addition to this, default
274
+ value for feature toggle can be supplied using `enabled:` named parameter
275
+
276
+
277
+ ```ruby
278
+
279
+ # Include vpc and 2 ecs clusters with feature flags
280
+ CfhighlanderTemplate do
281
+
282
+ # vpc component
283
+ Component 'vpc'
284
+
285
+ # Ecs Cluster 1 has feature toggle, enabled by default
286
+ Component name: 'ecs1', template: 'ecs', conditional: true
287
+
288
+ # Ecs Cluster 2 has feature toggle, and is explicitly disabled by default
289
+ Component name: 'ec2', template: 'ecs', conditional: true, enabled: false
290
+
291
+ end
292
+
293
+ ```
294
+
295
+
253
296
 
254
297
  ### Parameters
255
298
 
@@ -257,7 +300,7 @@ Parameters block is used to define CloudFormation template parameters, and metad
257
300
  are wired with outer or sibling components.
258
301
 
259
302
  ```ruby
260
- HighlanderComponent do
303
+ CfhighlanderTemplate do
261
304
  Parameters do
262
305
  ##
263
306
  ## parameter definitions here
@@ -270,81 +313,117 @@ Parameter block supports following parameters
270
313
 
271
314
  #### ComponentParam
272
315
 
273
- `ComponentParam` - Component parameter takes name and default value. It defines component parameter
274
- that is not auto-wired in any way with outer component. This parameter will either use default value, or value
275
- explicitly passed from outer component.
316
+ `ComponentParam` - Component parameter exposes parameter to be wired from outer component. Cfhighlander's
317
+ autowiring mechanism will try and find any stack outputs from other components defined by outer components with name
318
+ matching. If there is no explicit value provided, or autowired from outputs, parameter will be propagated to outer component.
319
+
320
+ Propagated parameter will be prefixed with component name **if it is not defined as global parameter**. Otherwise,
321
+ parameter name is kept in full.
322
+
323
+ Example below demonstrates 3 different ways of providing parameter values from outer to inner component.
324
+
325
+ - Provide value explicitly
326
+ - Provide value explicitly as output of another component
327
+ - Autowire value from output of another component with the same name
328
+ - Propagate parameter to outer component
276
329
 
277
330
  ```ruby
278
331
 
279
- # Inner Component
280
- HighlanderComponent do
332
+ # Inner Component 1
333
+ CfhighlanderTemplate do
281
334
  Name 's3'
282
335
  Parameters do
283
336
  ComponentParam 'BucketName','highlander.example.com.au'
337
+ ComponentParam 'BucketName2',''
338
+ ComponentParam 'BucketName3',''
339
+ ComponentParam 'BucketName4','', isGlobal: false # default value is false
340
+ ComponentParam 'BucketName5','', isGlobal: true
284
341
  end
342
+
285
343
  end
344
+
286
345
  ```
287
346
 
288
347
  ```ruby
289
- # Outer component
290
- HighlanderComponent do
291
- # instantiate inner component with name and template
292
- Component template:'s3',
293
- name:'s3',
294
- parameters:{'BucketName' => 'outer.example.com.au'}
348
+ # Inner Component 2
349
+ CfhighlanderTemplate do
350
+ Name 'nameproducer'
351
+
352
+ # has output 'bucket name defined in cfdnsl
295
353
  end
296
- ```
297
354
 
298
- #### StackParam
299
355
 
300
- `StackParam` - Stack parameter bubbles up to it's outer component. Outer component will either define top level parameter
301
- with same name as inner component parameter (if parameter is defined as global), or it will be prefixed with inner component name.
356
+ # -- contents of cfndsl
357
+ CloudFormation do
302
358
 
359
+ Condition 'AlwaysFalse', FnEquals('true','false')
360
+ S3_Bucket :resourcetovalidateproperly do
361
+ Condition 'AlwaysFalse'
362
+ end
303
363
 
304
- ```ruby
305
- # Outer component
306
- HighlanderComponent do
307
- Component template:'s3',name:'s3'
364
+ Output('BucketName') do
365
+ Value('highlanderbucketautowired.example.com.au')
366
+ end
308
367
  end
368
+
369
+
309
370
  ```
310
371
 
311
372
  ```ruby
312
- # Inner component
313
- HighlanderComponent do
314
- Name 's3'
315
- Parameters do
316
- StackParam 'EnvironmentName','dev', isGlobal:true
317
- StackParam 'BucketName','highlander.example.com.au', isGlobal:false
318
- end
373
+ # Outer component
374
+ CfhighlanderTemplate do
375
+ Component 'nameproducer'
376
+ Component 's3' do
377
+ parameter name: 'BucketName2', value: 'nameproducer.BucketName'
378
+ parameter name: 'BucketName3', value: 'mybucket.example.cfhighlander.org'
379
+ end
319
380
  end
381
+
320
382
  ```
321
383
 
322
384
 
323
- Example above translates to following cfndsl template in outer component
385
+ Example above translates to following wiring of parameters in cfndsl template
324
386
  ```ruby
325
387
  CloudFormation do
326
388
 
327
- Parameter('EnvironmentName') do
328
- Type 'String'
329
- Default ''
330
- end
331
-
332
- Parameter('s3BucketName') do
333
- Type 'String'
334
- Default 'highlander.example.com.au'
389
+ # Parameter that was propagated
390
+ Parameter('s3BucketName4') do
391
+ Type 'String'
392
+ Default ''
393
+ NoEcho false
335
394
  end
336
-
337
- CloudFormation_Stack('s3') do
338
- TemplateURL 'https://distributionbucket/dist/latest/s3.yaml'
339
- Parameters ({
340
-
341
- 'EnvironmentName' => Ref('EnvironmentName'),
342
-
343
- 'BucketName' => Ref('s3BucketName'),
344
-
345
- })
395
+
396
+ Parameter('BucketName5') do
397
+ Type 'String'
398
+ Default ''
399
+ NoEcho false
346
400
  end
401
+
402
+ CloudFormation_Stack('s3') do
403
+ TemplateURL './s3.compiled.yaml'
404
+ Parameters ({
405
+
406
+ # Paramater that was auto-wired
407
+ 'BucketName' => {"Fn::GetAtt":["nameproducer","Outputs.BucketName"]},
408
+
409
+ # Parameter that was explicitly wired as output param from another component
410
+ 'BucketName2' => {"Fn::GetAtt":["nameproducer","Outputs.BucketName"]},
411
+
412
+ # Paramater that was explicitly provided
413
+ 'BucketName3' => 'mybucket.example.cfhighlander.org',
414
+
415
+ # Reference to parameter that was propagated. isGlobal: false when defining
416
+ # parameter, so parameter name is prefixed with component name
417
+ 'BucketName4' => {"Ref":"s3BucketName4"},
418
+
419
+ # Reference to parameter that was propagated. isGlobal: true when defining
420
+ # parameter, so parameter name is not prefixed, but rather propagated as-is
421
+ 'BucketName5' => {"Ref":"BucketName5"},
422
+
423
+ })
424
+ end
347
425
  end
426
+
348
427
  ```
349
428
 
350
429
 
@@ -358,7 +437,7 @@ This DSL statements takes a full body, as Mapping name, Map key, and value key n
358
437
 
359
438
  ```ruby
360
439
  # Inner component
361
- HighlanderComponent do
440
+ CfhighlanderTemplate do
362
441
  Name 's3'
363
442
  Parameters do
364
443
  MappingParam 'BucketName' do
@@ -370,17 +449,13 @@ end
370
449
  ```
371
450
 
372
451
 
373
- #### OutputParam
374
-
375
- TBD
376
-
377
452
  ### DependsOn
378
453
 
379
454
  `DependsOn` - this will include any globally exported libraries from given
380
455
  template. E.g.
381
456
 
382
457
  ```ruby
383
- HighlanderComponent do
458
+ CfhighlanderTemplate do
384
459
  Name 's3'
385
460
  DependsOn 'vpc@1.0.3'
386
461
  end
@@ -398,14 +473,56 @@ so extension methods can be consumed within cfndsl template.
398
473
  #### Referencing
399
474
 
400
475
 
401
- ## Finding and loading components
476
+ ## Finding templates and creating components
477
+
478
+
479
+ Templates are located by default in following locations
480
+
481
+ - `$WD`
482
+ - `$WD/$componentname`
483
+ - `$WD/components/$componentname`
484
+ - `~/.cfhighlander/components/componentname/componentversion`
485
+ - `https://github.com/cfhighlander/theonestack/hl-component-$componentname` on `master` branch
486
+
487
+ Location of component templates can be given as git/github repo:
488
+
489
+ ```ruby
490
+
491
+ CfhighlanderTemplate do
492
+
493
+ # pulls directly from master branch of https://github.com/theonestack/hl-component-vpc
494
+ Component name: 'vpc0', template: 'vpc'
495
+
496
+ # specify branch github.com: or github: work. You specify branch with hash
497
+ Component name: 'vpc1', template: 'github:theonestack/hl-component-vpc#master'
498
+
499
+ # you can use git over ssh
500
+ # Component name: 'vpc2', template: 'git:git@github.com:theonestack/hl-component-vpc.git'
501
+
502
+ # use git over https
503
+ Component name: 'vpc3', template: 'git:https://github.com/theonestack/hl-component-sns.git'
504
+
505
+ # specify .snapshot to always clone fresh copy
506
+ Component name: 'vpc4', template: 'git:https://github.com/theonestack/hl-component-sns.git#master.snapshot'
507
+
508
+ # by default, if not found locally, highlander will search for https://github.com/theonestack/component-$componentname
509
+ # in v${version} branch (or tag for that matter)
510
+ Component name: 'vpc5', template: 'vpc@1.0.4'
511
+
512
+ end
513
+
514
+ ```
515
+
402
516
 
403
517
  ## Rendering CloudFormation templates
404
518
 
405
519
 
520
+ ```bash
521
+ $ cfhighlander cfcompile [component] [-v distributedversion]
522
+ ```
406
523
 
407
524
  ## Global Extensions
408
525
 
409
526
  Any extensions placed within `cfndsl_ext` folder will be
410
527
  available in cfndsl templates of all components. Any extensions placed within `hl_ext` folder are
411
- available in highlander templates of all components.
528
+ available in cfhighlander templates of all components.
data/bin/cfhighlander CHANGED
@@ -1,3 +1,3 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- require_relative('./highlander')
3
+ require_relative('./cfhighlander')
@@ -9,10 +9,10 @@
9
9
 
10
10
  require 'thor'
11
11
  require 'rubygems'
12
- require_relative '../lib//highlander.compiler'
13
- require_relative '../lib/highlander.factory'
14
- require_relative '../lib/highlander.publisher'
15
- require_relative '../lib/highlander.validator'
12
+ require_relative '../lib/cfhighlander.compiler'
13
+ require_relative '../lib/cfhighlander.factory'
14
+ require_relative '../lib/cfhighlander.publisher'
15
+ require_relative '../lib/cfhighlander.validator'
16
16
 
17
17
  class HighlanderCli < Thor
18
18
 
@@ -22,15 +22,15 @@ class HighlanderCli < Thor
22
22
 
23
23
  desc 'configcompile component[@version]', 'Compile Highlander components configuration'
24
24
 
25
- def configcompile(component_name)
25
+ def configcompile(template_name)
26
26
 
27
27
  # find and load component
28
- component_loader = Highlander::Factory::ComponentFactory.new
29
- component = component_loader.findComponent(component_name)
28
+ component_loader = Cfhighlander::Factory::ComponentFactory.new
29
+ component = component_loader.loadComponentFromTemplate(template_name)
30
30
  component.load
31
31
 
32
32
  # compile cfndsl template
33
- component_compiler = Highlander::Compiler::ComponentCompiler.new(component)
33
+ component_compiler = Cfhighlander::Compiler::ComponentCompiler.new(component)
34
34
  component_compiler.writeConfig(true)
35
35
  end
36
36
 
@@ -50,7 +50,7 @@ class HighlanderCli < Thor
50
50
  component = build_component(options, component_name)
51
51
 
52
52
  # compile cfndsl template
53
- component_compiler = Highlander::Compiler::ComponentCompiler.new(component)
53
+ component_compiler = Cfhighlander::Compiler::ComponentCompiler.new(component)
54
54
  component_compiler.silent_mode = options[:quiet]
55
55
  out_format = options[:format]
56
56
  component_compiler.compileCfnDsl out_format
@@ -71,16 +71,27 @@ class HighlanderCli < Thor
71
71
  method_option :quiet, :type => :boolean, :default => false, :aliases => '-q',
72
72
  :desc => 'Silently agree on user prompts (e.g. Package lambda command)'
73
73
 
74
- def cfcompile(component_name)
74
+ def cfcompile(component_name = nil)
75
+
76
+ if component_name.nil?
77
+ candidates = Dir["*.cfhighlander.rb"]
78
+ if candidates.size == 0
79
+ self.help('cfcompile')
80
+ exit -1
81
+ else
82
+ component_name = candidates[0].gsub('.cfhighlander.rb','')
83
+ end
84
+ end
85
+
75
86
  component = build_component(options, component_name)
76
87
 
77
88
  # compile cloud formation
78
- component_compiler = Highlander::Compiler::ComponentCompiler.new(component)
89
+ component_compiler = Cfhighlander::Compiler::ComponentCompiler.new(component)
79
90
  component_compiler.silent_mode = options[:quiet]
80
91
  out_format = options[:format]
81
92
  component_compiler.compileCloudFormation out_format
82
93
  if options[:validate]
83
- component_validator = Highlander::Cloudformation::Validator.new(component)
94
+ component_validator = Cfhighlander::Cloudformation::Validator.new(component)
84
95
  component_validator.validate(component_compiler.cfn_template_paths, out_format)
85
96
  end
86
97
  component_compiler
@@ -103,7 +114,7 @@ class HighlanderCli < Thor
103
114
 
104
115
  def cfpublish(component_name)
105
116
  compiler = cfcompile(component_name)
106
- publisher = Highlander::Publisher::Component.new(compiler.component, false)
117
+ publisher = Cfhighlander::Publisher::ComponentPublisher.new(compiler.component, false)
107
118
  publisher.publishFiles(compiler.cfn_template_paths + compiler.lambda_src_paths)
108
119
  end
109
120
 
@@ -117,37 +128,35 @@ class HighlanderCli < Thor
117
128
  method_option :version, :type => :string, :required => false, :default => nil, :aliases => '-v',
118
129
  :desc => 'Distribution component version, defaults to latest'
119
130
 
120
- def publish(component_name)
131
+ def publish(template_name)
121
132
  component_version = options[:version]
122
133
  distribution_bucket = options[:dstbucket]
123
134
  distribution_prefix = options[:dstprefix]
124
135
 
125
136
  # find and load component
126
- component_loader = Highlander::Factory::ComponentFactory.new
127
- component = component_loader.findComponent(component_name)
137
+ component_loader = Cfhighlander::Factory::ComponentFactory.new
138
+ component = component_loader.loadComponentFromTemplate(template_name)
128
139
  component.version = component_version
129
140
  component.distribution_bucket = distribution_bucket unless distribution_bucket.nil?
130
141
  component.distribution_prefix = distribution_prefix unless distribution_prefix.nil?
131
142
  component.load
132
143
 
133
- publisher = Highlander::Publisher::Component.new(component, true)
144
+ publisher = Cfhighlander::Publisher::ComponentPublisher.new(component, true)
134
145
  publisher.publishComponent
135
146
  end
136
147
 
137
148
  end
138
149
 
139
150
  # build component from passed cli options
140
- def build_component(options, component_name)
141
- if ENV['HIGHLANDER_WORKDIR'].nil?
142
- ENV['HIGHLANDER_WORKDIR'] = Dir.pwd
143
- end
151
+ def build_component(options, template_name)
152
+
144
153
  component_version = options[:version]
145
154
  distribution_bucket = options[:dstbucket]
146
155
  distribution_prefix = options[:dstprefix]
147
156
 
148
157
  # find and load component
149
- component_loader = Highlander::Factory::ComponentFactory.new
150
- component = component_loader.findComponent(component_name)
158
+ component_loader = Cfhighlander::Factory::ComponentFactory.new
159
+ component = component_loader.loadComponentFromTemplate(template_name)
151
160
  component.version = component_version unless component_version.nil?
152
161
  component.distribution_bucket = distribution_bucket unless distribution_bucket.nil?
153
162
  component.distribution_prefix = distribution_prefix unless distribution_prefix.nil?
@@ -155,4 +164,11 @@ def build_component(options, component_name)
155
164
  component
156
165
  end
157
166
 
167
+ if ENV['CFHIGHLANDER_WORKDIR'].nil?
168
+ ENV['CFHIGHLANDER_WORKDIR'] = Dir.pwd
169
+ end
170
+ if ENV['HIGHLANDER_WORKDIR'].nil?
171
+ ENV['HIGHLANDER_WORKDIR'] = Dir.pwd
172
+ end
173
+
158
174
  HighlanderCli.start
data/cfndsl_ext/sg.rb CHANGED
@@ -1,3 +1,4 @@
1
+ require 'netaddr'
1
2
 
2
3
  def sg_create_rules (x, ip_blocks={})
3
4
  rules = []
@@ -15,12 +16,38 @@ end
15
16
 
16
17
 
17
18
  def lookup_ips_for_sg (ips, ip_block_name={})
19
+ cidr = []
18
20
  if ip_block_name == 'stack'
19
21
  cidr = [FnJoin( "", [ "10.", Ref('StackOctet'), ".", "0.0/16" ] )]
20
22
  elsif ips.has_key? ip_block_name
21
- cidr = ips[ip_block_name]
23
+ ips[ip_block_name].each do |ip|
24
+ if (ips.include?(ip) || ip_block_name == 'stack')
25
+ cidr += lookup_ips_for_sg(ips, ip) unless ip == ip_block_name
26
+ else
27
+ if ip == 'stack'
28
+ cidr << [FnJoin( "", [ "10.", Ref('StackOctet'), ".", "0.0/16" ] )]
29
+ elsif(isCidr(ip))
30
+ cidr << ip
31
+ else
32
+ STDERR.puts("WARN: ip #{ip} is not a valid CIDR. Ignoring IP")
33
+ end
34
+ end
35
+ end
22
36
  else
23
- cidr = [ip_block_name]
37
+ if isCidr(ip_block_name)
38
+ cidr = [ip_block_name]
39
+ else
40
+ STDERR.puts("WARN: ip #{ip_block_name} is not a valid CIDR. Ignoring IP")
41
+ end
24
42
  end
25
43
  cidr
26
44
  end
45
+
46
+ def isCidr(block)
47
+ begin
48
+ NetAddr::CIDR.create(block)
49
+ return block.include?('/')
50
+ rescue NetAddr::ValidationError
51
+ return false
52
+ end
53
+ end
@@ -1,14 +1,16 @@
1
- require_relative '../lib/highlander.mapproviders'
1
+ require_relative '../lib/cfhighlander.mapproviders'
2
2
 
3
3
  # Return mapping provider as class
4
- def mappings_provider(provider_name)
4
+ def mappings_provider(provider_name, is_legacy = false)
5
5
  return nil if provider_name.nil?
6
6
  provider = nil
7
- providers = Object.const_get('Highlander').const_get('MapProviders')
7
+ module_name = is_legacy ? 'Highlander': 'Cfhighlander'
8
+ providers = Object.const_get(module_name).const_get('MapProviders')
8
9
  begin
9
10
  providers.const_get(provider_name)
10
11
  rescue NameError => e
11
- if e.to_s.include? 'uninitialized constant Highlander::MapProviders::'
12
+ if e.to_s.include? "uninitialized constant #{module_name}::MapProviders::"
13
+ return mappings_provider(provider_name, true) unless is_legacy
12
14
  return nil
13
15
  end
14
16
  STDERR.puts(e.to_s)