cfhighlander 0.7.0.alpha.1544216666 → 0.8.0.alpha.1550191162
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 +4 -4
- data/README.md +63 -11
- data/bin/cfhighlander.rb +114 -3
- data/lib/cfhighlander.compiler.rb +3 -2
- data/lib/cfhighlander.dsl.template.rb +1 -1
- data/lib/cfhighlander.publisher.rb +3 -2
- data/lib/cfhighlander.tests.rb +114 -0
- data/lib/cfhighlander.version.rb +3 -0
- data/templates/cfndsl.component.template.erb +7 -0
- metadata +5 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d104f29b677e85d2bc647c37b07afcb0d7dc085e97d03845a5e6fefb197ac36c
|
4
|
+
data.tar.gz: 440af326438f2ea24845afc1eda9dfe938509c5b7140580a4e46e2a7fbd351ee
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b6df11c0ee32110b5b4157caee01343e6f3ca3bb744bb373bc85118ca015ce5c45a26cda164b691b287e10ee36e1ba2e1b1be35f1dc24bfbdd6d116e47231797
|
7
|
+
data.tar.gz: 5af50e51cc21cea03f6ed502ff9d37e0e2199dd1bd43ff3cfd676182b709c4c83e75af5fae2ecdd4ceb13851a0b0d4fc50eabef149ac6bd793d65cf1b6f0e3f5
|
data/README.md
CHANGED
@@ -77,7 +77,7 @@ end
|
|
77
77
|
|
78
78
|
```
|
79
79
|
|
80
|
-
... compile the template with ...
|
80
|
+
... compile the template with ...
|
81
81
|
|
82
82
|
```shell
|
83
83
|
cfcompile application
|
@@ -120,8 +120,8 @@ used in conjuction with ECS Cluster
|
|
120
120
|
- [rds-postgres](https://github.com/theonestack/hl-component-rds-postgres) - RDS Component for Postgres engine
|
121
121
|
- [aurora-mysql](https://github.com/theonestack/hl-component-aurora-mysql) - Aurora component for MySQL engine
|
122
122
|
- [aurora-postgres](https://github.com/theonestack/hl-component-aurora-postgres) - Aurora component for Postgres engine
|
123
|
-
- [elasticache-memcache](https://github.com/theonestack/hl-component-elasticache-memcache) - Aws Elasticache - Memcache engine
|
124
|
-
- [elasticache-memcache](https://github.com/theonestack/hl-component-elasticache-redis) - Aws Elasticache - Redis engine
|
123
|
+
- [elasticache-memcache](https://github.com/theonestack/hl-component-elasticache-memcache) - Aws Elasticache - Memcache engine
|
124
|
+
- [elasticache-memcache](https://github.com/theonestack/hl-component-elasticache-redis) - Aws Elasticache - Redis engine
|
125
125
|
- [asg](https://github.com/theonestack/hl-component-asg) - AutoScalingGroup component
|
126
126
|
- [cognito](https://github.com/theonestack/hl-component-cognito) - Cognito user pools, custom domain names and clients
|
127
127
|
|
@@ -134,7 +134,7 @@ From shell, command below will generate cloudformation for given component in `o
|
|
134
134
|
cfcompile component_name
|
135
135
|
```
|
136
136
|
|
137
|
-
Or from outer cfhighlander template, just pull component using `Component` DSL statement
|
137
|
+
Or from outer cfhighlander template, just pull component using `Component` DSL statement
|
138
138
|
|
139
139
|
```ruby
|
140
140
|
CfhighlanderTemplate do
|
@@ -264,9 +264,9 @@ via CLI (`--dstbucket`, `--dstprefix`, `-v`). Default distribution bucket and pr
|
|
264
264
|
for more details on this statements. Version defaults to `latest` if not explicitly given using `-v` switch
|
265
265
|
|
266
266
|
If no distribution options is given using mentioned CLI options or DSL statements,
|
267
|
-
bucket will be automatically created for you. Bucket name defaults to
|
267
|
+
bucket will be automatically created for you. Bucket name defaults to
|
268
268
|
`$ACCOUNT.$REGION.cfhighlander.templates`, with `/published-templates`
|
269
|
-
prefix.
|
269
|
+
prefix.
|
270
270
|
|
271
271
|
*cfpublish* command will give you quick launch CloudFirmation stack URL to assist
|
272
272
|
you in creating your stack:
|
@@ -710,7 +710,7 @@ This is also default render mode - if no render mode is specified `Substack` wil
|
|
710
710
|
|
711
711
|
`Inline` - places all defined resources from inner component in outer component cloudformation template. Resources,
|
712
712
|
Outputs, Conditions, Parameters and Mappings are all inlined - please note that some of the template elements may be renamed in this
|
713
|
-
process in order to assure unique names.
|
713
|
+
process in order to assure unique names.
|
714
714
|
|
715
715
|
There are some limitations when using inline components - Inlined component parameters, having values as outputs from another component (inlined or not)
|
716
716
|
can't be referenced in component conditions. However, conditions referencing mapping values or parameters passed as mapping values,
|
@@ -722,13 +722,13 @@ are allowed.
|
|
722
722
|
by referencing Zone Name (rather than ZoneId), meaning there is no explicit dependency between the resources. When both components
|
723
723
|
are rendered as substack, implicit dependency is created if there is at least one output from component A passed as parameter
|
724
724
|
to component B. Rendering components inlined removes this implicitly defined dependency, as a consequence stack deletion or creation
|
725
|
-
may be halted, as record set is being created/deleted before prior the record set.
|
725
|
+
may be halted, as record set is being created/deleted before prior the record set.
|
726
726
|
|
727
727
|
**`WARNING`** Be aware of [resource, condition, parameter, output and mapping limits](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cloudformation-limits.html) on a single template
|
728
728
|
when rendering inner components inlined.
|
729
729
|
|
730
730
|
**`EXAMPLE`** All of the VPC resources will be rendered in outer component template, while bastion
|
731
|
-
will be referenced as substack in example below.
|
731
|
+
will be referenced as substack in example below.
|
732
732
|
|
733
733
|
```ruby
|
734
734
|
CfhighlanderTemplate do
|
@@ -760,6 +760,58 @@ available in cfhighlander templates of all components.
|
|
760
760
|
`CFHIGHLANDER_WORKDIR` - defaults to $PWD, determines location of 'out' folder where all of the
|
761
761
|
generated files are placed
|
762
762
|
|
763
|
-
`CFHIGHLANDER_AWS_RETRY_LIMIT` - defaults to 10. Number of retries for AWS SDK before giving up.
|
763
|
+
`CFHIGHLANDER_AWS_RETRY_LIMIT` - defaults to 10. Number of retries for AWS SDK before giving up.
|
764
764
|
AWS SDK uses exponential backoff to make the API calls
|
765
|
-
|
765
|
+
|
766
|
+
|
767
|
+
|
768
|
+
## Testing components
|
769
|
+
|
770
|
+
Tests are designed for testing different configuration options on components.
|
771
|
+
They can be defined as `my_test.test.yaml` files in the `tests/` directory.
|
772
|
+
Each test file represents a single test configuration which is then compiled
|
773
|
+
and validated against AWS cloudformation api.
|
774
|
+
|
775
|
+
### Metadata
|
776
|
+
|
777
|
+
test metadata needs to defined as bellow with at least a `name:`. Other key:values are for documentation.
|
778
|
+
|
779
|
+
```yaml
|
780
|
+
test_metadata:
|
781
|
+
type: config
|
782
|
+
name: queues with config overrides
|
783
|
+
description: Create 2 queues with name and override available config
|
784
|
+
```
|
785
|
+
|
786
|
+
### Running Test
|
787
|
+
|
788
|
+
```bash
|
789
|
+
$ cfhighlander cftest [component] [options]
|
790
|
+
```
|
791
|
+
|
792
|
+
```bash
|
793
|
+
Usage:
|
794
|
+
cfhighlander cftest component[@version] -f, --format=FORMAT
|
795
|
+
|
796
|
+
Options:
|
797
|
+
-d, [--directory=DIRECTORY] # Tests directory
|
798
|
+
# Default: tests
|
799
|
+
-t, [--tests=one two three] # Point to specific test files using the relative path
|
800
|
+
[--dstbucket=DSTBUCKET] # Distribution S3 bucket
|
801
|
+
[--dstprefix=DSTPREFIX] # Distribution S3 prefix
|
802
|
+
-f, --format=FORMAT # CloudFormation templates output format
|
803
|
+
# Default: yaml
|
804
|
+
# Possible values: yaml, json
|
805
|
+
[--validate], [--no-validate] # Optionally validate template
|
806
|
+
# Default: true
|
807
|
+
-q, [--quiet], [--no-quiet] # Silently agree on user prompts (e.g. Package lambda command)
|
808
|
+
# Default: true
|
809
|
+
-r, [--report=REPORT] # report output format in reports directory
|
810
|
+
# Possible values: json, xml
|
811
|
+
|
812
|
+
Test Highlander component with test case config
|
813
|
+
```
|
814
|
+
|
815
|
+
### Reports
|
816
|
+
|
817
|
+
By default test will print the output to stdout. You can output to a file with a format of xml or json using the `-r` option
|
data/bin/cfhighlander.rb
CHANGED
@@ -10,16 +10,24 @@
|
|
10
10
|
require 'thor'
|
11
11
|
require 'rubygems'
|
12
12
|
require 'aws-sdk-core'
|
13
|
+
require_relative '../lib/cfhighlander.version'
|
13
14
|
require_relative '../lib/cfhighlander.compiler'
|
14
15
|
require_relative '../lib/cfhighlander.factory'
|
15
16
|
require_relative '../lib/cfhighlander.publisher'
|
16
17
|
require_relative '../lib/cfhighlander.validator'
|
18
|
+
require_relative '../lib/cfhighlander.tests'
|
17
19
|
require_relative '../hl_ext/aws_helper'
|
18
20
|
|
19
21
|
class HighlanderCli < Thor
|
20
22
|
|
21
23
|
package_name "cfhighlander"
|
22
24
|
|
25
|
+
map %w[--version -v] => :__print_version
|
26
|
+
desc "--version, -v", "print the version"
|
27
|
+
def __print_version
|
28
|
+
puts Cfhighlander::VERSION
|
29
|
+
end
|
30
|
+
|
23
31
|
desc 'configcompile component[@version]', 'Compile Highlander components configuration'
|
24
32
|
|
25
33
|
def configcompile(template_name)
|
@@ -121,7 +129,7 @@ class HighlanderCli < Thor
|
|
121
129
|
|
122
130
|
def cfpublish(component_name)
|
123
131
|
compiler = cfcompile(component_name, true)
|
124
|
-
publisher = Cfhighlander::Publisher::ComponentPublisher.new(compiler.component, false)
|
132
|
+
publisher = Cfhighlander::Publisher::ComponentPublisher.new(compiler.component, false, options[:format])
|
125
133
|
publisher.publishFiles(compiler.cfn_template_paths + compiler.lambda_src_paths)
|
126
134
|
|
127
135
|
puts "\n\nUse following url to launch CloudFormation stack\n\n#{publisher.getLaunchStackUrl}\n\n"
|
@@ -152,14 +160,116 @@ class HighlanderCli < Thor
|
|
152
160
|
component.distribution_prefix = distribution_prefix unless distribution_prefix.nil?
|
153
161
|
component.load
|
154
162
|
|
155
|
-
publisher = Cfhighlander::Publisher::ComponentPublisher.new(component, true)
|
163
|
+
publisher = Cfhighlander::Publisher::ComponentPublisher.new(component, true, 'yaml')
|
156
164
|
publisher.publishComponent
|
157
165
|
end
|
158
166
|
|
167
|
+
desc 'cftest component[@version]', 'Test Highlander component with test case config'
|
168
|
+
method_option :directory, :type => :string, :required => false, :default => 'tests', :aliases => "-d",
|
169
|
+
:desc => 'Tests directory'
|
170
|
+
method_option :tests, :type => :array, :required => false, :aliases => "-t",
|
171
|
+
:desc => 'Point to specific test files using the relative path'
|
172
|
+
method_option :dstbucket, :type => :string, :required => false, :default => nil,
|
173
|
+
:desc => 'Distribution S3 bucket'
|
174
|
+
method_option :dstprefix, :type => :string, :required => false, :default => nil,
|
175
|
+
:desc => 'Distribution S3 prefix'
|
176
|
+
method_option :format, :type => :string, :required => true, :default => 'yaml', :aliases => "-f",
|
177
|
+
:enum => %w(yaml json), :desc => 'CloudFormation templates output format'
|
178
|
+
method_option :validate, :type => :boolean, :default => true,
|
179
|
+
:desc => 'Optionally validate template'
|
180
|
+
method_option :quiet, :type => :boolean, :default => true, :aliases => '-q',
|
181
|
+
:desc => 'Silently agree on user prompts (e.g. Package lambda command)'
|
182
|
+
method_option :report, :type => :string, :aliases => '-r', :enum => ['json','xml'],
|
183
|
+
:desc => 'report output format in reports directory'
|
184
|
+
|
185
|
+
def cftest(component_name = nil, autogenerate_dist = false)
|
186
|
+
|
187
|
+
tests_start = Time.now
|
188
|
+
|
189
|
+
if component_name.nil?
|
190
|
+
candidates = Dir["*.cfhighlander.rb"]
|
191
|
+
if candidates.size == 0
|
192
|
+
self.help('cftest')
|
193
|
+
exit -1
|
194
|
+
else
|
195
|
+
component_name = candidates[0].gsub('.cfhighlander.rb','')
|
196
|
+
end
|
197
|
+
end
|
198
|
+
|
199
|
+
tests = CfHighlander::Tests.new(component_name,options)
|
200
|
+
tests.timestamp = Time.now.strftime('%Y-%m-%dT%H:%M:%S.%L%z')
|
201
|
+
tests.get_cases
|
202
|
+
|
203
|
+
tests.cases.each do |test|
|
204
|
+
test_name = test[:metadata]['name']
|
205
|
+
component = build_component(options, component_name, test[:config])
|
206
|
+
failure = false
|
207
|
+
|
208
|
+
if component.highlander_dsl.distribution_bucket.nil? or component.highlander_dsl.distribution_prefix.nil?
|
209
|
+
component.distribution_bucket="#{aws_account_id()}.#{aws_current_region()}.cfhighlander.templates" if component.distribution_bucket.nil?
|
210
|
+
component.distribution_prefix="published-templates/#{component.name}" if component.distribution_prefix.nil?
|
211
|
+
puts "INFO: Reloading component, as auto-generated distribution settings are being applied..."
|
212
|
+
component.load
|
213
|
+
end if autogenerate_dist
|
214
|
+
|
215
|
+
# compile cloud formation
|
216
|
+
component_compiler = Cfhighlander::Compiler::ComponentCompiler.new(component)
|
217
|
+
component_compiler.cfn_output_location = "#{ENV['CFHIGHLANDER_WORKDIR']}/out/tests/#{test_name.gsub(' ','_')}"
|
218
|
+
component_compiler.silent_mode = options[:quiet]
|
219
|
+
out_format = options[:format]
|
220
|
+
|
221
|
+
start = Time.now
|
222
|
+
begin
|
223
|
+
component_compiler.compileCloudFormation out_format
|
224
|
+
rescue => e
|
225
|
+
failure = {message: e.message, type: 'Cfhighlander::Compiler::ComponentCompiler'}
|
226
|
+
end
|
227
|
+
finish = Time.now
|
228
|
+
|
229
|
+
tests.report << {
|
230
|
+
name: test_name,
|
231
|
+
test: test[:file],
|
232
|
+
type: 'compile',
|
233
|
+
failure: failure,
|
234
|
+
time: (finish - start).to_s
|
235
|
+
}
|
236
|
+
next if failure
|
237
|
+
|
238
|
+
if options[:validate]
|
239
|
+
start = Time.now
|
240
|
+
begin
|
241
|
+
component_validator = Cfhighlander::Cloudformation::Validator.new(component)
|
242
|
+
component_validator.validate(component_compiler.cfn_template_paths, out_format)
|
243
|
+
rescue Aws::CloudFormation::Errors::ValidationError => e
|
244
|
+
failure = {message: e.message, type: 'Cfhighlander::Cloudformation::Validator'}
|
245
|
+
end
|
246
|
+
finish = Time.now
|
247
|
+
end
|
248
|
+
|
249
|
+
tests.report << {
|
250
|
+
name: test_name,
|
251
|
+
test: test[:file],
|
252
|
+
type: 'Validation',
|
253
|
+
failure: failure,
|
254
|
+
time: (finish - start).to_s
|
255
|
+
}
|
256
|
+
|
257
|
+
component_compiler
|
258
|
+
end
|
259
|
+
|
260
|
+
tests_finish = Time.now
|
261
|
+
tests.time = (tests_finish - tests_start)
|
262
|
+
|
263
|
+
tests.generate_report(options[:report]) if options[:report]
|
264
|
+
tests.print_results
|
265
|
+
exit tests.exit_code
|
266
|
+
|
267
|
+
end
|
268
|
+
|
159
269
|
end
|
160
270
|
|
161
271
|
# build component from passed cli options
|
162
|
-
def build_component(options, template_name)
|
272
|
+
def build_component(options, template_name, config=nil)
|
163
273
|
|
164
274
|
component_version = options[:version]
|
165
275
|
distribution_bucket = options[:dstbucket]
|
@@ -169,6 +279,7 @@ def build_component(options, template_name)
|
|
169
279
|
component_loader = Cfhighlander::Factory::ComponentFactory.new
|
170
280
|
component = component_loader.loadComponentFromTemplate(template_name)
|
171
281
|
component.version = component_version unless component_version.nil?
|
282
|
+
component.config = config unless config.nil?
|
172
283
|
component.distribution_bucket = distribution_bucket unless distribution_bucket.nil?
|
173
284
|
component.distribution_prefix = distribution_prefix unless distribution_prefix.nil?
|
174
285
|
component.load
|
@@ -89,7 +89,8 @@ module Cfhighlander
|
|
89
89
|
cfn_template = renderer.result(OpenStruct.new({
|
90
90
|
'dsl' => dsl,
|
91
91
|
'component_cfndsl' => component_cfndsl,
|
92
|
-
'component_requires' => (@@global_extensions_paths + @component.cfndsl_ext_files)
|
92
|
+
'component_requires' => (@@global_extensions_paths + @component.cfndsl_ext_files),
|
93
|
+
'distribution_format' => out_format
|
93
94
|
}).instance_eval {binding})
|
94
95
|
|
95
96
|
# write to output file
|
@@ -129,7 +130,7 @@ module Cfhighlander
|
|
129
130
|
dsl = @component.highlander_dsl
|
130
131
|
|
131
132
|
# create out dir if not there
|
132
|
-
@cfn_output_location = "#{@workdir}/out/#{format}"
|
133
|
+
@cfn_output_location = "#{@workdir}/out/#{format}" if @cfn_output_location.nil?
|
133
134
|
output_dir = @cfn_output_location
|
134
135
|
FileUtils.mkdir_p(output_dir) unless Dir.exist?(output_dir)
|
135
136
|
|
@@ -7,9 +7,10 @@ module Cfhighlander
|
|
7
7
|
|
8
8
|
class ComponentPublisher
|
9
9
|
|
10
|
-
def initialize(component, cleanup)
|
10
|
+
def initialize(component, cleanup, template_format)
|
11
11
|
@component = component
|
12
12
|
@cleanup_destination = cleanup
|
13
|
+
@template_format = template_format
|
13
14
|
end
|
14
15
|
|
15
16
|
def publishComponent
|
@@ -44,7 +45,7 @@ module Cfhighlander
|
|
44
45
|
template_url = "https://#{@component.highlander_dsl.distribution_bucket}.s3.amazonaws.com/"
|
45
46
|
template_url += @component.highlander_dsl.distribution_prefix + "/"
|
46
47
|
template_url += @component.highlander_dsl.version
|
47
|
-
template_url += "/#{@component.name}.compiled
|
48
|
+
template_url += "/#{@component.name}.compiled.#{@template_format}"
|
48
49
|
return template_url
|
49
50
|
end
|
50
51
|
|
@@ -0,0 +1,114 @@
|
|
1
|
+
require 'yaml'
|
2
|
+
require 'json'
|
3
|
+
|
4
|
+
module CfHighlander
|
5
|
+
class Tests
|
6
|
+
|
7
|
+
attr_accessor :cases,
|
8
|
+
:report,
|
9
|
+
:exit_code,
|
10
|
+
:report_path,
|
11
|
+
:time,
|
12
|
+
:timestamp
|
13
|
+
|
14
|
+
def initialize(component_name,options)
|
15
|
+
@component_name = component_name
|
16
|
+
@tests_dir = options[:directory]
|
17
|
+
@test_files = options[:tests] || Dir["#{@tests_dir}/*.test.yaml"]
|
18
|
+
@report_path = "reports"
|
19
|
+
@debug = false
|
20
|
+
@cases = []
|
21
|
+
@report = []
|
22
|
+
@time = nil
|
23
|
+
@timestamp = nil
|
24
|
+
@exit_code = 0
|
25
|
+
end
|
26
|
+
|
27
|
+
def get_cases
|
28
|
+
@test_files.each do |file|
|
29
|
+
test_case = load_test_case(file)
|
30
|
+
@cases << { metadata: test_case['test_metadata'], file: file, config: test_case }
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def load_test_case(file)
|
35
|
+
begin
|
36
|
+
YAML.load(File.read(file))
|
37
|
+
rescue Errno::ENOENT => e
|
38
|
+
abort "No test file found for #{file}"
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def print_results
|
43
|
+
failures = @report.select { |k,v| k[:failure] }
|
44
|
+
puts "\n\s\s============================"
|
45
|
+
puts "\s\s# CfHighlander Tests #"
|
46
|
+
puts "\s\s============================\n\n"
|
47
|
+
puts "\s\sPass: #{cases.size - failures.size}"
|
48
|
+
puts "\s\sFail: #{failures.size}"
|
49
|
+
puts "\s\sTime: #{@time}\n\n"
|
50
|
+
|
51
|
+
if failures.any?
|
52
|
+
@exit_code = 1
|
53
|
+
puts "\s\s=========Failures========="
|
54
|
+
failures.each do |failure|
|
55
|
+
puts "\s\sName: #{failure[:name]}"
|
56
|
+
puts "\s\sTest: #{failure[:test]}"
|
57
|
+
puts "\s\sType: #{failure[:type]}"
|
58
|
+
puts "\s\sMessage: #{failure[:failure][:message]}"
|
59
|
+
puts "\s\s-------------------------"
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
|
65
|
+
def report_dir
|
66
|
+
FileUtils.mkdir_p(@report_path) unless Dir.exist?(@report_path)
|
67
|
+
end
|
68
|
+
|
69
|
+
def generate_report(type)
|
70
|
+
report_dir
|
71
|
+
failures = @report.select { |k,v| k[:message] }
|
72
|
+
report = {}
|
73
|
+
report[:component] = @component_name
|
74
|
+
report[:tests] = cases.size.to_s
|
75
|
+
report[:pass] = (cases.size - failures.size).to_s
|
76
|
+
report[:failures] = failures.size.to_s
|
77
|
+
report[:time] = @time.to_s
|
78
|
+
report[:timestamp] = @timestamp.to_s
|
79
|
+
report[:testcases] = @report
|
80
|
+
case type
|
81
|
+
when 'json'
|
82
|
+
report_json(report)
|
83
|
+
when 'xml'
|
84
|
+
report_xml(report)
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
def report_xml(report)
|
89
|
+
testsuite = report.map { |k,v| "#{k}=\"#{v}\"" if k != :testcases }
|
90
|
+
File.open("reports/report.xml","w") do |f|
|
91
|
+
f.write("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n")
|
92
|
+
f.write("<testsuite #{testsuite.join(' ')}>\n")
|
93
|
+
report[:testcases].each do |test|
|
94
|
+
testcase = test.map { |k,v| "#{k}=\"#{v}\"" if k != :failure }
|
95
|
+
if test[:failure]
|
96
|
+
f.write("\t<testcase #{testcase.join(' ')}>\n")
|
97
|
+
f.write("\t\t<failure message=\"#{test[:failure][:message]}\" type=\"#{test[:failure][:type]}\"/>\n")
|
98
|
+
f.write("\t</testcase>\n")
|
99
|
+
else
|
100
|
+
f.write("\t<testcase #{testcase.join(' ')}/>\n")
|
101
|
+
end
|
102
|
+
end
|
103
|
+
f.write("</testsuite>")
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
def report_json(report)
|
108
|
+
File.open("reports/report.json","w") do |f|
|
109
|
+
f.write(JSON.pretty_generate(report))
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
end
|
114
|
+
end
|
@@ -68,4 +68,11 @@ CloudFormation do
|
|
68
68
|
<% for @condition in dsl.conditions %> Condition('<%= @condition.name %>', <%= @condition.expression %>)
|
69
69
|
<% end %>
|
70
70
|
Description '<%= dsl.description %>'
|
71
|
+
|
72
|
+
Output('CfTemplateUrl') {
|
73
|
+
Value("<%=dsl.distribute_url%>/<%=dsl.name%>.compiled.<%=distribution_format%>")
|
74
|
+
}
|
75
|
+
Output('CfTemplateVersion') {
|
76
|
+
Value("<%=dsl.version%>")
|
77
|
+
}
|
71
78
|
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.
|
4
|
+
version: 0.8.0.alpha.1550191162
|
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:
|
13
|
+
date: 2019-02-15 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: highline
|
@@ -273,7 +273,9 @@ files:
|
|
273
273
|
- lib/cfhighlander.model.component.rb
|
274
274
|
- lib/cfhighlander.model.templatemeta.rb
|
275
275
|
- lib/cfhighlander.publisher.rb
|
276
|
+
- lib/cfhighlander.tests.rb
|
276
277
|
- lib/cfhighlander.validator.rb
|
278
|
+
- lib/cfhighlander.version.rb
|
277
279
|
- lib/util/cloudformation.util.rb
|
278
280
|
- lib/util/debug.util.rb
|
279
281
|
- lib/util/zip.util.rb
|
@@ -297,8 +299,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
297
299
|
- !ruby/object:Gem::Version
|
298
300
|
version: 1.3.1
|
299
301
|
requirements: []
|
300
|
-
|
301
|
-
rubygems_version: 2.7.8
|
302
|
+
rubygems_version: 3.0.2
|
302
303
|
signing_key:
|
303
304
|
specification_version: 4
|
304
305
|
summary: DSL on top of cfndsl. Manage libraries of cloudformation components
|