sfn 3.0.12 → 3.0.14
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +3 -0
- data/bin/command-config-generator +1 -1
- data/docs/callbacks.md +1 -1
- data/docs/command-config.md +90 -1
- data/docs/lint.md +137 -21
- data/docs/sparkle-packs.md +1 -1
- data/lib/sfn/command_module/template.rb +22 -8
- data/lib/sfn/config/lint.rb +2 -1
- data/lib/sfn/config/validate.rb +1 -1
- data/lib/sfn/version.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d86015ce1785c5da228500177b6b6520a7157ff3
|
4
|
+
data.tar.gz: 595dea3bfa80bac4cc4f351310309749fbe9a62e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7c2fe1e37172359fddb155d4a9dd2a185de4534be1a9403bb348a6c0380301eb27a1e878c53855eea7815ce57cb4a93986fd52509b77de54d9ea5871c5adb667
|
7
|
+
data.tar.gz: b418420b239d1944b300a645b9310e948c7f74310d31fafee687eacad0dfede58a54b1c9319efe6f1d458834a9127dbe16cc4cafb9e1693aa7a9414c1f8cc3bb
|
data/CHANGELOG.md
CHANGED
data/docs/callbacks.md
CHANGED
data/docs/command-config.md
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
---
|
2
2
|
title: "Commands and configuration"
|
3
|
-
weight:
|
3
|
+
weight: 6
|
4
4
|
anchors:
|
5
5
|
- title: "Conf Command"
|
6
6
|
url: "#conf-command"
|
@@ -24,6 +24,8 @@ anchors:
|
|
24
24
|
url: "#init-command"
|
25
25
|
- title: "Inspect Command"
|
26
26
|
url: "#inspect-command"
|
27
|
+
- title: "Lint Command"
|
28
|
+
url: "#lint-command"
|
27
29
|
- title: "List Command"
|
28
30
|
url: "#list-command"
|
29
31
|
- title: "Print Command"
|
@@ -887,6 +889,93 @@ $ sfn inspect
|
|
887
889
|
| | Valid | `TrueClass`, `FalseClass` |
|
888
890
|
| | Default | |
|
889
891
|
|
892
|
+
## Lint Command
|
893
|
+
|
894
|
+
~~~
|
895
|
+
$ sfn lint
|
896
|
+
~~~
|
897
|
+
|
898
|
+
| Option | Attribute | Value
|
899
|
+
|--------|-----------|------
|
900
|
+
| `--apply-nesting` | Description | Apply stack nesting |
|
901
|
+
| | Valid | `String`, `Symbol` |
|
902
|
+
| | Default | "deep"|
|
903
|
+
| `--base-directory` | Description | Path to root of of templates directory |
|
904
|
+
| | Valid | `String` |
|
905
|
+
| | Default | |
|
906
|
+
| `--compile-parameters` | Description | Pass template compile time parameters directly |
|
907
|
+
| | Valid | `Bogo::Smash` |
|
908
|
+
| | Default | |
|
909
|
+
| `--config` | Description | Configuration file path |
|
910
|
+
| | Valid | `String` |
|
911
|
+
| | Default | |
|
912
|
+
| `--credentials` | Description | Provider credentials (Key:Value[,Key:Value,...]) |
|
913
|
+
| | Valid | `Bogo::Smash` |
|
914
|
+
| | Default | |
|
915
|
+
| `--debug` | Description | Enable debug output |
|
916
|
+
| | Valid | `TrueClass`, `FalseClass` |
|
917
|
+
| | Default | |
|
918
|
+
| `--defaults` | Description | Automatically accept default values |
|
919
|
+
| | Valid | `TrueClass`, `FalseClass` |
|
920
|
+
| | Default | |
|
921
|
+
| `--disabled-rule-set` | Description | Disable rule set from being applied |
|
922
|
+
| | Valid | `String` |
|
923
|
+
| | Default | |
|
924
|
+
| `--enabled-rule-set` | Description | Only apply this rule set |
|
925
|
+
| | Valid | `String` |
|
926
|
+
| | Default | |
|
927
|
+
| `--file` | Description | Path to template file |
|
928
|
+
| | Valid | `String` |
|
929
|
+
| | Default | |
|
930
|
+
| `--file-path-prompt` | Description | Enable interactive prompt for template path discovery |
|
931
|
+
| | Valid | `TrueClass`, `FalseClass` |
|
932
|
+
| | Default | true|
|
933
|
+
| `--ignore-parameters` | Description | Parameters to ignore during modifications |
|
934
|
+
| | Valid | `String` |
|
935
|
+
| | Default | |
|
936
|
+
| `--interactive-parameters` | Description | Prompt for template parameters |
|
937
|
+
| | Valid | `TrueClass`, `FalseClass` |
|
938
|
+
| | Default | true|
|
939
|
+
| `--lint-directory` | Description | Directory containing lint rule sets |
|
940
|
+
| | Valid | `String` |
|
941
|
+
| | Default | |
|
942
|
+
| `--local-rule-sets-only` | Description | Only apply rule sets provided by lint directory |
|
943
|
+
| | Valid | `TrueClass`, `FalseClass` |
|
944
|
+
| | Default | false|
|
945
|
+
| `--nesting-bucket` | Description | Bucket to use for storing nested stack templates |
|
946
|
+
| | Valid | `String` |
|
947
|
+
| | Default | |
|
948
|
+
| `--nesting-prefix` | Description | File name prefix for storing template in bucket |
|
949
|
+
| | Valid | `String` |
|
950
|
+
| | Default | |
|
951
|
+
| `--no-base-directory` | Description | Unset any value used for the template root directory path |
|
952
|
+
| | Valid | `TrueClass`, `FalseClass` |
|
953
|
+
| | Default | |
|
954
|
+
| `--poll` | Description | Poll stack events on modification actions |
|
955
|
+
| | Valid | `TrueClass`, `FalseClass` |
|
956
|
+
| | Default | true|
|
957
|
+
| `--print-only` | Description | Print the resulting stack template |
|
958
|
+
| | Valid | `TrueClass`, `FalseClass` |
|
959
|
+
| | Default | |
|
960
|
+
| `--processing` | Description | Call the unicorns and explode the glitter bombs |
|
961
|
+
| | Valid | `TrueClass`, `FalseClass` |
|
962
|
+
| | Default | true|
|
963
|
+
| `--sparkle-pack` | Description | Load SparklePack gem |
|
964
|
+
| | Valid | `String` |
|
965
|
+
| | Default | |
|
966
|
+
| `--translate` | Description | Translate generated template to given provider |
|
967
|
+
| | Valid | `String` |
|
968
|
+
| | Default | |
|
969
|
+
| `--translate-chunk` | Description | Chunk length for serialization |
|
970
|
+
| | Valid | `Integer` |
|
971
|
+
| | Default | |
|
972
|
+
| `--upload-root-template` | Description | Upload root template to storage bucket |
|
973
|
+
| | Valid | `TrueClass`, `FalseClass` |
|
974
|
+
| | Default | |
|
975
|
+
| `--yes` | Description | Automatically accept any requests for confirmation |
|
976
|
+
| | Valid | `TrueClass`, `FalseClass` |
|
977
|
+
| | Default | |
|
978
|
+
|
890
979
|
## List Command
|
891
980
|
|
892
981
|
~~~
|
data/docs/lint.md
CHANGED
@@ -1,25 +1,113 @@
|
|
1
1
|
---
|
2
2
|
title: "Lint"
|
3
|
-
weight:
|
3
|
+
weight: 8
|
4
|
+
anchors:
|
5
|
+
- title: "Lint Framework"
|
6
|
+
url: "#lint-framework"
|
7
|
+
- title: "Composition"
|
8
|
+
url: "#composition"
|
9
|
+
- title: "Usage"
|
10
|
+
url: "#usage"
|
4
11
|
---
|
5
12
|
|
6
13
|
## Lint
|
7
14
|
|
8
|
-
The lint framework built within the sfn tool utilizes the JMESPath query language
|
15
|
+
The lint framework built within the sfn tool utilizes the [JMESPath][jmespath] query language
|
9
16
|
for identifying patterns and apply validation rules.
|
10
17
|
|
11
|
-
### Lint
|
18
|
+
### Lint Framework
|
12
19
|
|
13
|
-
|
20
|
+
A rule set is a named collection of rules to be applied to a template. Each rule
|
21
|
+
is composed of one or more definitions. A rule passes only if _all_ definitions
|
22
|
+
can be successfully applied. Linting related classes:
|
14
23
|
|
15
|
-
|
16
|
-
|
17
|
-
|
24
|
+
* `Sfn::Lint::RuleSet`
|
25
|
+
* `Sfn::Lint::Rule`
|
26
|
+
* `Sfn::Lint::Definition`
|
27
|
+
|
28
|
+
### Composition
|
29
|
+
|
30
|
+
#### Long Form
|
31
|
+
|
32
|
+
##### `Sfn::Lint::Definition`
|
33
|
+
|
34
|
+
Definitions define a search expression to be applied to a given template. The search
|
35
|
+
expression is a [JMESPath compatible query expression][jmespath-expr]. The matches
|
36
|
+
of the search expression are then processed. If the results are valid, a `true` result
|
37
|
+
is expected. If the results are invalid, a `false` value is expected, or an `Array<String>`
|
38
|
+
value is expected which provides the list of invalid items.
|
18
39
|
|
19
40
|
~~~ruby
|
20
|
-
|
41
|
+
Sfn::Lint::Definition.new('Resources.[*][0][*].Type') do |matches, template|
|
42
|
+
unless(search.nil?)
|
43
|
+
result = search.find_all{|i| !i.start_with?('AWS')}
|
44
|
+
result.empty? ? true : result
|
45
|
+
else
|
46
|
+
true
|
47
|
+
end
|
48
|
+
end
|
49
|
+
~~~
|
50
|
+
|
51
|
+
The processing block is provided two arguments. The first is the match result of the
|
52
|
+
search expression. The second is the full template `Hash` that is being processed.
|
53
|
+
|
54
|
+
##### `Sfn::Lint::Rule`
|
55
|
+
|
56
|
+
Rules are composed of definitions. When a rule is applied to a template it will only
|
57
|
+
pass if _all_ definitions are successfully applied. A rule also includes a failure
|
58
|
+
message to provide user context of the failure.
|
59
|
+
|
60
|
+
~~~ruby
|
61
|
+
definition = Sfn::Lint::Definition.new('Resources.[*][0][*].Type') do |matches, template|
|
62
|
+
unless(search.nil?)
|
63
|
+
result = search.find_all{|i| !i.start_with?('AWS')}
|
64
|
+
result.empty? ? true : result
|
65
|
+
else
|
66
|
+
true
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
Sfn::Lint::Rule.new(
|
71
|
+
:aws_resources_only,
|
72
|
+
[definition],
|
73
|
+
'All types must be within AWS root namespace'
|
74
|
+
)
|
75
|
+
~~~
|
76
|
+
|
77
|
+
##### `Sfn::Lint::RuleSet`
|
78
|
+
|
79
|
+
A rule set is a named collection of rules. It allows logically grouping related
|
80
|
+
rules together. Rule sets are the entry point of linting actions on templates. Once
|
81
|
+
a rule set has been created, it must then be registered to be made available.
|
82
|
+
|
83
|
+
~~~ruby
|
84
|
+
definition = Sfn::Lint::Definition.new('Resources.[*][0][*].Type') do |matches, template|
|
85
|
+
unless(search.nil?)
|
86
|
+
result = search.find_all{|i| !i.start_with?('AWS')}
|
87
|
+
result.empty? ? true : result
|
88
|
+
else
|
89
|
+
true
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
rule = Sfn::Lint::Rule.new(
|
94
|
+
:aws_resources_only,
|
95
|
+
[definition],
|
96
|
+
'All types must be within AWS root namespace'
|
97
|
+
)
|
98
|
+
|
99
|
+
rule_set = Sfn::Lint::RuleSet.new(:aws_rules, [rule])
|
100
|
+
Sfn::Lint::RuleSet.register(rule_set)
|
101
|
+
~~~
|
21
102
|
|
22
|
-
|
103
|
+
#### Short Form
|
104
|
+
|
105
|
+
Rule sets can also be created using a generator which reduces the amount of effort required
|
106
|
+
for composition. The same rule set defined above can be created using the `RuleSet.build`
|
107
|
+
generator:
|
108
|
+
|
109
|
+
~~~ruby
|
110
|
+
rule_set = Sfn::Lint::RuleSet.build(:aws_rules) do
|
23
111
|
rule :aws_resources_only do
|
24
112
|
definition 'Resources.[*][0][*].Type' do |search|
|
25
113
|
unless(search.nil?)
|
@@ -33,15 +121,41 @@ RuleSet.build(:test) do
|
|
33
121
|
fail_message 'All types must be within AWS root namespace'
|
34
122
|
end
|
35
123
|
end
|
124
|
+
|
125
|
+
Sfn::Lint::RuleSet.register(rule_set)
|
126
|
+
~~~
|
127
|
+
|
128
|
+
### Usage
|
129
|
+
|
130
|
+
Linting functionality is available via the `lint` command. The only requirement of the `lint`
|
131
|
+
command is a template provided by the `--file` flag:
|
132
|
+
|
133
|
+
~~~
|
134
|
+
$ sfn lint --file my-template
|
135
|
+
~~~
|
136
|
+
|
137
|
+
By default all registered rule sets applicable to the template will be applied. Rule sets can
|
138
|
+
be disabled by name to prevent them from being applied:
|
139
|
+
|
36
140
|
~~~
|
141
|
+
$ sfn lint --file my-template --disable-rule-set aws_rules
|
142
|
+
~~~
|
143
|
+
|
144
|
+
or you can explicitly specify what rule sets should be applied:
|
37
145
|
|
38
|
-
|
146
|
+
~~~
|
147
|
+
$ sfn lint --file my-template --enable-rule-set aws_rules
|
148
|
+
~~~
|
39
149
|
|
40
|
-
|
41
|
-
|
150
|
+
#### Local rule sets
|
151
|
+
|
152
|
+
Rule sets can be created for a local project. These rule sets are kept within a directory, and
|
153
|
+
should be defined as a single rule set per file. For example, having a directory `tests/lint`
|
154
|
+
the rule set can be created:
|
42
155
|
|
43
156
|
~~~ruby
|
44
|
-
|
157
|
+
# tests/lint/resource_type_check.rb
|
158
|
+
RuleSet.build(:aws_rules) do
|
45
159
|
rule :aws_resources_only do
|
46
160
|
definition 'Resources.[*][0][*].Type' do |search|
|
47
161
|
unless(search.nil?)
|
@@ -55,18 +169,20 @@ my_ruleset = Sfn::Lint::RuleSet.build(:test) do
|
|
55
169
|
fail_message 'All types must be within AWS root namespace'
|
56
170
|
end
|
57
171
|
end
|
58
|
-
Sfn::Lint::RuleSet.register(my_ruleset)
|
59
172
|
~~~
|
60
173
|
|
61
|
-
|
174
|
+
To include the local rule sets the target directory must be provided:
|
62
175
|
|
63
|
-
|
64
|
-
|
65
|
-
|
176
|
+
~~~
|
177
|
+
$ sfn lint --file my-template --lint-directory tests/lint
|
178
|
+
~~~
|
66
179
|
|
67
|
-
|
68
|
-
|
180
|
+
and if _only_ local rule sets should be applied, it is possible to disable all registered
|
181
|
+
rule sets:
|
69
182
|
|
70
183
|
~~~
|
71
|
-
$ sfn lint --file my-template --lint-directory tests/lint
|
184
|
+
$ sfn lint --file my-template --lint-directory tests/lint --local-rule-sets-only
|
72
185
|
~~~
|
186
|
+
|
187
|
+
[jmespath]: http://jmespath.org/
|
188
|
+
[jmespath-expr]: http://jmespath.org/specification.html
|
data/docs/sparkle-packs.md
CHANGED
@@ -166,14 +166,7 @@ module Sfn
|
|
166
166
|
config[:template]
|
167
167
|
elsif(config[:file])
|
168
168
|
if(config[:processing])
|
169
|
-
compile_state =
|
170
|
-
compile_state.keys.each do |cs_key|
|
171
|
-
if(cs_key.to_s.start_with?(arguments.first.to_s))
|
172
|
-
cli_provided = compile_state.delete(cs_key.to_s.sub("#{arguments.first.to_s}__", ''))
|
173
|
-
compile_state[cs_key].deep_merge!(cli_provided)
|
174
|
-
end
|
175
|
-
end
|
176
|
-
ui.debug "Merged compile parameters - #{compile_state}"
|
169
|
+
compile_state = merge_compile_time_parameters
|
177
170
|
sf = SparkleFormation.compile(config[:file], :sparkle)
|
178
171
|
if(name_args.first)
|
179
172
|
sf.name = name_args.first
|
@@ -234,6 +227,27 @@ module Sfn
|
|
234
227
|
end
|
235
228
|
end
|
236
229
|
|
230
|
+
# Merge parameters provided directly via configuration into
|
231
|
+
# core parameter set
|
232
|
+
def merge_compile_time_parameters
|
233
|
+
compile_state = config.fetch(:compile_parameters, Smash.new)
|
234
|
+
compile_state.keys.each do |cs_key|
|
235
|
+
if(cs_key.to_s.start_with?("#{arguments.first}__"))
|
236
|
+
cli_provided = compile_state.delete(cs_key.to_s.sub("#{arguments.first.to_s}__", ''))
|
237
|
+
if(cli_provided)
|
238
|
+
compile_state[cs_key].deep_merge!(cli_provided)
|
239
|
+
end
|
240
|
+
end
|
241
|
+
end
|
242
|
+
compile_state.keys.each do |cs_key|
|
243
|
+
unless(cs_key.start_with?("#{arguments.first}__"))
|
244
|
+
compile_state["#{arguments.first}__#{cs_key}"] = compile_state.delete(cs_key)
|
245
|
+
end
|
246
|
+
end
|
247
|
+
ui.debug "Merged compile parameters - #{compile_state}"
|
248
|
+
compile_state
|
249
|
+
end
|
250
|
+
|
237
251
|
# Force user friendly error if nesting bucket is not set within configuration
|
238
252
|
def validate_nesting_bucket!
|
239
253
|
if(config[:nesting_bucket].to_s.empty?)
|
data/lib/sfn/config/lint.rb
CHANGED
@@ -21,7 +21,8 @@ module Sfn
|
|
21
21
|
)
|
22
22
|
attribute(
|
23
23
|
:local_rule_sets_only, [TrueClass, FalseClass],
|
24
|
-
:description => 'Only apply rule sets provided by lint directory'
|
24
|
+
:description => 'Only apply rule sets provided by lint directory',
|
25
|
+
:default => false
|
25
26
|
)
|
26
27
|
end
|
27
28
|
end
|
data/lib/sfn/config/validate.rb
CHANGED
@@ -83,7 +83,7 @@ module Sfn
|
|
83
83
|
v.split(',').each do |item_pair|
|
84
84
|
key, value = item_pair.split(/[=:]/, 2)
|
85
85
|
key = key.split('__')
|
86
|
-
key = [key.pop, key.
|
86
|
+
key = [key.pop, key.join('__')].reverse
|
87
87
|
result.set(*key, value)
|
88
88
|
end
|
89
89
|
result
|
data/lib/sfn/version.rb
CHANGED