sfn 1.1.16 → 1.2.0

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
  SHA1:
3
- metadata.gz: 58e8684eee245ada64046f2a15637e4e7bf41e8a
4
- data.tar.gz: 7819639664f3329ba2d8abf97a4a0ed41dc97d5a
3
+ metadata.gz: eb52f9ec870e82eaf0e32aaba64f4c4ea05badf8
4
+ data.tar.gz: 54939ef76128913964444beb09d72d8c4c4b1447
5
5
  SHA512:
6
- metadata.gz: aedaee01c2ef802348a5767be88302246bf08905899e471d65ddbb178f1dc0a2f1b9a48a4ae2a7b87bca9397e68060b19c07df6a42f4b2c75c86dc260ccc5e0d
7
- data.tar.gz: d43a1d391fe8611851273e219bf78813622b5620eae3eda9bdd6fa49991465411c2c150356d71a883446311d6ac6109114d78e2b5a809a0f2f49258a35a6e945
6
+ metadata.gz: 6727eeb62882084fab9f4207f2ccea58160155a16410c6051ff1970e35a70702af087020c972c1c5d40941a5c5917a4fe0b3f5e8351f11aa70574b85ba1d830e
7
+ data.tar.gz: c7390a1b826f92b231e0b2d6df9f97258a9381824d5e6826d58496ee5044b7c5e9d322f77da7f8c0e878c98ffcfb72c888ef73186826453ad8419628823832ca
data/CHANGELOG.md CHANGED
@@ -1,52 +1,58 @@
1
- ## v1.1.16
1
+ # v1.2.0
2
+ * [fix] Always require packs when loading
3
+ * [fix] Prevent stale output display on update
4
+ * [enhancement] Coerce hash type configurations consistently
5
+ * [enhancement] Force short flags to prevent change
6
+
7
+ # v1.1.16
2
8
  * [fix] Duplicate template when dereferencing within planner
3
9
 
4
- ## v1.1.14
10
+ # v1.1.14
5
11
  * [fix] Use correct name part for building callback name
6
12
 
7
- ## v1.1.12
13
+ # v1.1.12
8
14
  * [enhancement] Include updated time information on stack list
9
15
  * [enhancement] Support pseudo-parameters in update planning
10
16
  * AWS only as it is currently the only implementation
11
17
 
12
- ## v1.1.10
18
+ # v1.1.10
13
19
  * [enhancement] Better configuration related errors
14
20
  * [fix] Planning display on stack removal (#75)
15
21
  * [fix] Remove stack properties on update request (#76)
16
22
  * [enhancement] Add `retries` config alias for `retry` (#77)
17
23
 
18
- ## v1.1.8
24
+ # v1.1.8
19
25
  * [fix] Disable knife config mashing to get expected values (#72)
20
26
  * [feature] Add new `conf` command (#72)
21
27
  * [feature] Add planning support for stack updates (#69)
22
28
 
23
- ## v1.1.6
29
+ # v1.1.6
24
30
  * [fix] set proper parameter hash on apply stack (#67)
25
31
 
26
- ## v1.1.4
32
+ # v1.1.4
27
33
  * [feature] Add new `diff` command
28
34
 
29
- ## v1.1.2
35
+ # v1.1.2
30
36
  * [fix] stack update when extracting compile time state
31
37
  * [fix] remove use of `root_path` method when shallow nesting is in use
32
38
 
33
- ## v1.1.0
39
+ # v1.1.0
34
40
  * Add support for compile time parameters
35
41
  * Fix valid stack type check on child stack connections
36
42
  * Provide output context for template location when prompting parameters
37
43
  * Use full stack path naming for bucket file names when storing
38
44
 
39
- ## v1.0.4
45
+ # v1.0.4
40
46
  * [fix] Set template prior to apply on update to find new parameters
41
47
  * Disable parameter validation warning on deep nesting
42
48
  * Update parameter detection on updates when using deep nesting
43
49
 
44
- ## v1.0.2
50
+ # v1.0.2
45
51
  * [fix] Properly detect local pack directory if available
46
52
  * Add `print` command for printing generated templates
47
53
  * Add support for custom stack resource types
48
54
 
49
- ## v1.0.0
55
+ # v1.0.0
50
56
 
51
57
  _NOTE: This release contains breaking changes! Please review the
52
58
  changes in this release and test your configuration and
@@ -66,28 +72,28 @@ _NOTE: This release contains breaking changes! Please review the
66
72
  * Add support for AWS stack policies via optional callback
67
73
  * And lots of internal refactors!
68
74
 
69
- ## v0.4.12
75
+ # v0.4.12
70
76
  * Fix transient uninitialized constant error for update command
71
77
 
72
- ## v0.4.10
78
+ # v0.4.10
73
79
  * Fix error when no options are provided within config (#18)
74
80
  * Fix error when parameters originate from config only (#20)
75
81
 
76
- ## v0.4.8
82
+ # v0.4.8
77
83
  * Disable delimiter on `:multiple` options (must specify multiple flags)
78
84
  * Update types allowed by inspect for instance failure option
79
85
  * Parameter hash is now always fully set based on template parameters
80
86
 
81
- ## v0.4.6
87
+ # v0.4.6
82
88
  * Fix parameter generation from CLI
83
89
 
84
- ## v0.4.4
90
+ # v0.4.4
85
91
  * Add a few more config fixes to properly validate
86
92
 
87
- ## v0.4.2
93
+ # v0.4.2
88
94
  * Fix config types defined
89
95
 
90
- ## v0.4.0
96
+ # v0.4.0
91
97
  * Fix parameters passed on CLI (#11)
92
98
  * Fix credential overrides from the CLI (#14)
93
99
  * Properly process CLI options through custom config classes
@@ -98,18 +104,18 @@ _NOTE: This release contains breaking changes! Please review the
98
104
  consistent now and into the future. Please refer to the help
99
105
  output for a given command to view short flags.
100
106
 
101
- ## v0.3.8
107
+ # v0.3.8
102
108
  * Fix result output from `update` command (#9)
103
109
  * Fix `inspect` command to properly support multiple attribute flags
104
110
  * Only output JSON when using `--print-only` flag with `create` command (#10)
105
111
 
106
- ## v0.3.6
112
+ # v0.3.6
107
113
  * Set options correctly on `sfn` executable (#7)
108
114
  * Update cli library dependency to provide better error messages (#6)
109
115
  * Update cloud library dependencies to support new options (:on_failure and :tags)
110
116
  * Cloud library update also adds support for aws credentials file
111
117
 
112
- ## v0.3.4
118
+ # v0.3.4
113
119
  * Default column widths when no output is available
114
120
  * Display stack tags on `describe` command
115
121
  * Fix apply stack reference to access via hash
@@ -117,115 +123,115 @@ _NOTE: This release contains breaking changes! Please review the
117
123
  * Fix path prompting (#5 thanks @JonathanSerafini)
118
124
  * Update minimum CLI lib dependency to provide correct configuration merging (#4)
119
125
 
120
- ## v0.3.2
126
+ # v0.3.2
121
127
  * Validate stack name prior to discovery on apply
122
128
  * Update configuration usage to allow runtime modification
123
129
  * Allow `create` command to print-only without requiring API credentials
124
130
 
125
- ## v0.3.0
131
+ # v0.3.0
126
132
  * Conversion from `knife-cloudformation` to `sfn`
127
133
  * Add knife subcommand alias `sparkleformation`
128
134
  * Remove implementation dependency on Chef tooling
129
135
 
130
- ## v0.2.20
136
+ # v0.2.20
131
137
  * Add automatic support for outputs in nested stacks to `--apply-stack`
132
138
 
133
- ## v0.2.18
139
+ # v0.2.18
134
140
  * Fix nested stack URL generation
135
141
 
136
- ## v0.2.16
142
+ # v0.2.16
137
143
  * Fix broken validation command (#12 thanks @JonathanSerafini)
138
144
  * Pad stack name indexes when unpacked
139
145
 
140
- ## v0.2.14
146
+ # v0.2.14
141
147
  * Pass command configuration through when unpacking
142
148
  * Force stack list reload prior to polling to prevent lookup errors
143
149
  * Add glob support on name arguments provided for `destroy`
144
150
  * Add unpacked stack support to `--apply-stack` flag
145
151
  * Retry events polling when started from different command
146
152
 
147
- ## v0.2.12
153
+ # v0.2.12
148
154
  * Use template to provide logical parameter ordering on stack update
149
155
  * Only set parameters when not the default template value
150
156
  * Do not save nested stacks to remote bucket when in print-only mode
151
157
  * Add initial support for un-nested stack create and update
152
158
  * Fix nested stack flagging usage
153
159
 
154
- ## v0.2.10
160
+ # v0.2.10
155
161
  * Add initial nested stack support
156
162
 
157
- ## v0.2.8
163
+ # v0.2.8
158
164
  * Update stack lookup implementation to make faster from CLI
159
165
  * Prevent constant error on exception when Redis is not in use
160
166
  * Provide better error messages on request failures
161
167
 
162
- ## v0.2.6
168
+ # v0.2.6
163
169
  * Update to parameter re-defaults to use correct hash instance
164
170
 
165
- ## v0.2.4
171
+ # v0.2.4
166
172
  * Fix apply stack parameter processing
167
173
 
168
- ## v0.2.2
174
+ # v0.2.2
169
175
  * Fix redis-objects loading in cache helper
170
176
 
171
- ## v0.2.0
177
+ # v0.2.0
172
178
  * This release should be considered "breaking"
173
179
  * Underlying cloud API has been changed from fog to miasma
174
180
  * The `inspect` command has been fully reworked to support `--attribute`
175
181
  * Lots and lots of other changes. See commit log.
176
182
 
177
- ## v0.1.22
183
+ # v0.1.22
178
184
  * Prevent full stack list loading in knife commands
179
185
  * Default logger to INFO level and allow DEBUG level via `ENV['DEBUG']`
180
186
  * Fix assumption of type when accessing cached data (cannot assume availability)
181
187
 
182
- ## v0.1.20
188
+ # v0.1.20
183
189
  * Update some caching behavior
184
190
  * Add more logging especially around remote calls
185
191
  * Add support for request throttling
186
192
  * Disable local caching when stack is in `in_progress` state
187
193
 
188
- ## v0.1.18
194
+ # v0.1.18
189
195
  * Replace constant with inline value to prevent warnings
190
196
  * Explicitly load file to ensure proper load ordering
191
197
 
192
- ## v0.1.16
198
+ # v0.1.16
193
199
  * Fix exit code on stack destroy
194
200
  * Update stack loading for single stack requests
195
201
  * Add import and export functionality
196
202
 
197
- ## v0.1.14
203
+ # v0.1.14
198
204
  * Extract template building tools
199
205
  * Add support for custom CF locations and prompting
200
206
  * Updates in fetching and caching behavior
201
207
 
202
- ## v0.1.12
208
+ # v0.1.12
203
209
  * Use the split value when re-joining parameters
204
210
 
205
- ## v0.1.10
211
+ # v0.1.10
206
212
  * Fix parameter passing via the CLI (data loss issue when value contained ':')
207
213
 
208
- ## v0.1.8
214
+ # v0.1.8
209
215
  * Update event cache handling
210
216
  * Allow multiple users for node connect attempts
211
217
 
212
- ## v0.1.6
218
+ # v0.1.6
213
219
  * Adds inspect action
214
220
  * Updates to commons
215
221
  * Allow multiple stack destroys at once
216
222
  * Updates to options to make consistent
217
223
 
218
- ## v0.1.4
224
+ # v0.1.4
219
225
  * Support outputs on stack creation
220
226
  * Poll on destroy by default
221
227
  * Add inspection helper for failed node inspection
222
228
  * Refactor AWS interactions to common library
223
229
 
224
- ## v0.1.2
230
+ # v0.1.2
225
231
  * Update dependency restriction to get later version
226
232
 
227
- ## v0.1.0
233
+ # v0.1.0
228
234
  * Stable-ish release
229
235
 
230
- ## v0.0.1
236
+ # v0.0.1
231
237
  * Initial release
@@ -73,6 +73,14 @@ $ knife sparkleformation --help
73
73
  | | Valid | `String`
74
74
  | | Default | none
75
75
  |----------------------------|---------------|---------------------------------------------------------------
76
+ | `sparkle_pack` | Description | SparklePacks to load
77
+ | | Valid | `Array<String>`
78
+ | | Default | none
79
+ |----------------------------|---------------|---------------------------------------------------------------
80
+ | `parameters` | Description | Stack runtime parameters
81
+ | | Valid | `Hash`
82
+ | | Default | none
83
+ |----------------------------|---------------|---------------------------------------------------------------
76
84
  | `credentials` | Description | API credentials for target orchestration API
77
85
  | | Valid | `Hash`
78
86
  | | Default | none
@@ -122,6 +122,7 @@ module Sfn
122
122
  poll_stack(stack.name)
123
123
  if(stack.reload.state == :update_complete)
124
124
  ui.info "Stack update complete: #{ui.color('SUCCESS', :green)}"
125
+ stack.resources.reload
125
126
  namespace.const_get(:Describe).new({:outputs => true}, [name]).execute!
126
127
  else
127
128
  ui.fatal "Update of stack #{ui.color(name, :bold)}: #{ui.color('FAILED', :red, :bold)}"
@@ -167,7 +168,7 @@ module Sfn
167
168
  said_any_things = false
168
169
  unless(info[:stacks].empty?)
169
170
  info[:stacks].each do |s_name, s_info|
170
- said_things = print_plan_result(s_info, [*names, s_name].compact)
171
+ said_any_things ||= print_plan_result(s_info, [*names, s_name].compact)
171
172
  end
172
173
  end
173
174
  unless(names.flatten.compact.empty?)
@@ -213,6 +214,7 @@ module Sfn
213
214
  unless(said_things)
214
215
  ui.puts " #{ui.color('No resource lifecycle changes detected!', :green)}"
215
216
  ui.puts
217
+ said_any_things = true
216
218
  end
217
219
  end
218
220
  said_any_things
@@ -80,8 +80,19 @@ module Sfn
80
80
  # @return [Array<SparkleFormation::SparklePack>]
81
81
  def sparkle_packs
82
82
  memoize(:sparkle_packs) do
83
- config.fetch(:sparkle_pack, []).map do |sparkle_name|
84
- SparkleFormation::Sparkle.new(:name => sparkle_name)
83
+ [config.fetch(:sparkle_pack, [])].flatten.compact.map do |sparkle_name|
84
+ begin
85
+ require sparkle_name
86
+ rescue LoadError
87
+ ui.fatal "Failed to locate sparkle pack `#{sparkle_name}` for loading!"
88
+ raise
89
+ end
90
+ begin
91
+ SparkleFormation::Sparkle.new(:name => sparkle_name)
92
+ rescue ArgumentError
93
+ ui.fatal "Failed to properly setup sparkle pack `#{sparkle_pack}`. Check implementation."
94
+ raise
95
+ end
85
96
  end
86
97
  end
87
98
  end
data/lib/sfn/config.rb CHANGED
@@ -6,6 +6,33 @@ module Sfn
6
6
  # Top level configuration
7
7
  class Config < Bogo::Config
8
8
 
9
+ # Override attribute helper to detect Hash types and automatically
10
+ # add type conversion for CLI provided values + description update
11
+ #
12
+ # @param name [String, Symbol] name of attribute
13
+ # @param type [Class, Array<Class>] valid types
14
+ # @param info [Hash] attribute information
15
+ # @return [Hash]
16
+ def self.attribute(name, type, info=Smash.new)
17
+ if([type].flatten.any?{|t| t.ancestors.include?(Hash)})
18
+ unless(info[:coerce])
19
+ info[:coerce] = lambda do |v|
20
+ case v
21
+ when String
22
+ Smash[v.split(',').map{|x| v.split(/[=:]/, 2)}]
23
+ when Hash
24
+ v.to_smash
25
+ else
26
+ v
27
+ end
28
+ end
29
+ info[:description] ||= ''
30
+ info[:description] << ' (Key:Value[,Key:Value,...])'
31
+ end
32
+ end
33
+ super(name, type, info)
34
+ end
35
+
9
36
  # Only values allowed designating bool type
10
37
  BOOLEAN_VALUES = [TrueClass, FalseClass]
11
38
 
@@ -27,45 +54,42 @@ module Sfn
27
54
 
28
55
  attribute(
29
56
  :config, String,
30
- :description => 'Configuration file path'
57
+ :description => 'Configuration file path',
58
+ :short_flag => 'c'
31
59
  )
32
60
 
33
61
  attribute(
34
62
  :credentials, Smash,
35
- :coerce => proc{|v|
36
- case v
37
- when String
38
- Smash[v.split(',').map{|x| v.split(/[=:]/, 2)}]
39
- when Hash
40
- v.to_smash
41
- else
42
- v
43
- end
44
- },
45
- :description => 'Provider credentials'
63
+ :description => 'Provider credentials',
64
+ :short_flag => 'C'
46
65
  )
47
66
  attribute(
48
67
  :ignore_parameters, String,
49
68
  :multiple => true,
50
- :description => 'Parameters to ignore during modifications'
69
+ :description => 'Parameters to ignore during modifications',
70
+ :short_flag => 'i'
51
71
  )
52
72
  attribute(
53
73
  :interactive_parameters, [TrueClass, FalseClass],
54
74
  :default => true,
55
- :description => 'Prompt for template parameters'
75
+ :description => 'Prompt for template parameters',
76
+ :short_flag => 'I'
56
77
  )
57
78
  attribute(
58
79
  :poll, [TrueClass, FalseClass],
59
80
  :default => true,
60
- :description => 'Poll stack events on modification actions'
81
+ :description => 'Poll stack events on modification actions',
82
+ :short_flag => 'p'
61
83
  )
62
84
  attribute(
63
85
  :defaults, [TrueClass, FalseClass],
64
- :description => 'Automatically accept default values'
86
+ :description => 'Automatically accept default values',
87
+ :short_flag => 'd'
65
88
  )
66
89
  attribute(
67
90
  :yes, [TrueClass, FalseClass],
68
- :description => 'Automatically accept any requests for confirmation'
91
+ :description => 'Automatically accept any requests for confirmation',
92
+ :short_flag => 'y'
69
93
  )
70
94
 
71
95
  attribute :conf, Conf, :coerce => proc{|v| Conf.new(v)}
@@ -103,8 +127,9 @@ module Sfn
103
127
  end
104
128
  end.compact.reverse.inject(Smash.new){|m, n| m.deep_merge(n)}.map do |name, info|
105
129
  next unless info[:description]
106
- short = name.chars.zip(name.chars.map(&:upcase)).flatten.detect do |c|
107
- !shorts.include?(c)
130
+ short = info[:short_flag]
131
+ if(!short.to_s.empty? && shorts.include?(short))
132
+ raise ArgumentError.new "Short flag already in use! (`#{short}` not available for `#{klass}`)"
108
133
  end
109
134
  shorts << short
110
135
  info[:short] = short
@@ -7,7 +7,8 @@ module Sfn
7
7
 
8
8
  attribute(
9
9
  :generate, [TrueClass, FalseClass],
10
- :description => 'Generate a basic configuration file'
10
+ :description => 'Generate a basic configuration file',
11
+ :short_flag => 'g'
11
12
  )
12
13
 
13
14
  end
@@ -8,29 +8,30 @@ module Sfn
8
8
  attribute(
9
9
  :timeout, Integer,
10
10
  :coerce => proc{|v| v.to_i},
11
- :description => 'Seconds to wait for stack to complete'
11
+ :description => 'Seconds to wait for stack to complete',
12
+ :short_flag => 'M'
12
13
  )
13
14
  attribute(
14
15
  :rollback, [TrueClass, FalseClass],
15
- :description => 'Rollback stack on failure'
16
+ :description => 'Rollback stack on failure',
17
+ :short_flag => 'O'
16
18
  )
17
19
  attribute(
18
20
  :capabilities, String,
19
21
  :multiple => true,
20
- :description => 'Capabilities to allow the stack'
22
+ :description => 'Capabilities to allow the stack',
23
+ :short_flag => 'B'
21
24
  )
22
25
  attribute(
23
26
  :options, Smash,
24
- :description => 'Extra options to apply to the API call'
27
+ :description => 'Extra options to apply to the API call',
28
+ :short_flag => 'S'
25
29
  )
26
30
  attribute(
27
- :notifications, String,
31
+ :notification_topics, String,
28
32
  :multiple => true,
29
- :description => 'Notification endpoints for stack events'
30
- )
31
- attribute(
32
- :plan, FalseClass,
33
- :default => false
33
+ :description => 'Notification endpoints for stack events',
34
+ :short_flag => 'z'
34
35
  )
35
36
 
36
37
  end
@@ -6,17 +6,20 @@ module Sfn
6
6
 
7
7
  attribute(
8
8
  :resources, [TrueClass, FalseClass],
9
- :description => 'Display stack resource list'
9
+ :description => 'Display stack resource list',
10
+ :short_flag => 'r'
10
11
  )
11
12
 
12
13
  attribute(
13
14
  :outputs, [TrueClass, FalseClass],
14
- :description => 'Display stack outputs'
15
+ :description => 'Display stack outputs',
16
+ :short_flag => 'o'
15
17
  )
16
18
 
17
19
  attribute(
18
20
  :tags, [TrueClass, FalseClass],
19
- :description => 'Display stack tags'
21
+ :description => 'Display stack tags',
22
+ :short_flag => 't'
20
23
  )
21
24
 
22
25
  end
@@ -7,7 +7,8 @@ module Sfn
7
7
  attribute(
8
8
  :raw_diff, [TrueClass, FalseClass],
9
9
  :default => false,
10
- :description => 'Display raw diff information'
10
+ :description => 'Display raw diff information',
11
+ :short_flag => 'w'
11
12
  )
12
13
  end
13
14
  end
@@ -8,17 +8,20 @@ module Sfn
8
8
  attribute(
9
9
  :attribute, String,
10
10
  :multiple => true,
11
- :description => 'Event attribute to display'
11
+ :description => 'Event attribute to display',
12
+ :short_flag => 'a'
12
13
  )
13
14
  attribute(
14
15
  :poll_delay, Integer,
15
16
  :default => 20,
16
17
  :description => 'Seconds to pause between each event poll',
17
- :coerce => lambda{|v| v.to_i}
18
+ :coerce => lambda{|v| v.to_i},
19
+ :short_flag => 'P'
18
20
  )
19
21
  attribute(
20
22
  :all_attributes, [TrueClass, FalseClass],
21
- :description => 'Display all event attributes'
23
+ :description => 'Display all event attributes',
24
+ :short_flag => 'A'
22
25
  )
23
26
 
24
27
  end
@@ -8,28 +8,34 @@ module Sfn
8
8
  attribute(
9
9
  :attribute, String,
10
10
  :multiple => true,
11
- :description => 'Dot delimited attribute to view'
11
+ :description => 'Dot delimited attribute to view',
12
+ :short_flag => 'a'
12
13
  )
13
14
  attribute(
14
15
  :nodes, [TrueClass, FalseClass],
15
- :description => 'Locate all instances and display addresses'
16
+ :description => 'Locate all instances and display addresses',
17
+ :short_flag => 'n'
16
18
  )
17
19
  attribute(
18
20
  :instance_failure, [TrueClass, FalseClass],
19
21
  :description => 'Display log file error from failed not if possible',
22
+ :short_flag => 'N'
20
23
  )
21
24
  attribute(
22
25
  :failure_log_path, String,
23
26
  :description => 'Path to remote log file for display on failure',
24
- :default => '/var/log/chef/client.log'
27
+ :default => '/var/log/chef/client.log',
28
+ :short_flag => 'f'
25
29
  )
26
30
  attribute(
27
31
  :identity_file, String,
28
- :description => 'SSH identity file for authentication'
32
+ :description => 'SSH identity file for authentication',
33
+ :short_flag => 'D'
29
34
  )
30
35
  attribute(
31
36
  :ssh_user, String,
32
- :description => 'SSH username for inspection connect'
37
+ :description => 'SSH username for inspection connect',
38
+ :short_flag => 's'
33
39
  )
34
40
 
35
41
  end
@@ -8,16 +8,19 @@ module Sfn
8
8
  attribute(
9
9
  :attribute, String,
10
10
  :multiple => true,
11
- :description => 'Attribute of stack to print'
11
+ :description => 'Attribute of stack to print',
12
+ :short_flag => 'a'
12
13
  )
13
14
  attribute(
14
15
  :all_attributes, [TrueClass, FalseClass],
15
- :description => 'Print all available attributes'
16
+ :description => 'Print all available attributes',
17
+ :short_flag => 'A'
16
18
  )
17
19
  attribute(
18
20
  :status, String,
19
21
  :multiple => true,
20
- :description => 'Match stacks with given status. Use "none" to disable.'
22
+ :description => 'Match stacks with given status. Use "none" to disable.',
23
+ :short_flag => 's'
21
24
  )
22
25
 
23
26
  end
@@ -8,20 +8,42 @@ module Sfn
8
8
  attribute(
9
9
  :apply_stack, String,
10
10
  :multiple => true,
11
- :description => 'Apply outputs from stack to input parameters'
11
+ :description => 'Apply outputs from stack to input parameters',
12
+ :short_flag => 'A'
12
13
  )
13
14
  attribute(
14
15
  :parameter, Smash,
15
16
  :multiple => true,
16
- :description => 'Pass template parameters directly (ParamName:ParamValue)',
17
- :coerce => lambda{|v|
18
- v.is_a?(String) ? Smash[*v.split(/[=:]/, 2)] : v
19
- }
17
+ :description => '[DEPRECATED - use `parameters`] Pass template parameters directly (ParamName:ParamValue)',
18
+ :coerce => lambda{|v, inst|
19
+ result = inst.data[:parameter] || Array.new
20
+ case v
21
+ when String
22
+ v.split(',').each do |item|
23
+ result.push(Smash[*item.split(/[=:]/, 2)])
24
+ end
25
+ else
26
+ result.push(v.to_smash)
27
+ end
28
+ {:bogo_multiple => result}
29
+ },
30
+ :short_flag => 'R'
31
+ )
32
+ attribute(
33
+ :parameters, Smash,
34
+ :description => 'Pass template parameters directly',
35
+ :short_flag => 'm'
20
36
  )
21
37
  attribute(
22
38
  :plan, [TrueClass, FalseClass],
23
39
  :default => true,
24
- :description => 'Provide planning information prior to update'
40
+ :description => 'Provide planning information prior to update',
41
+ :short_flag => 'l'
42
+ )
43
+ attribute(
44
+ :compile_parameters, Smash,
45
+ :description => 'Pass template compile time parameters directly',
46
+ :short_flag => 'o'
25
47
  )
26
48
 
27
49
  end
@@ -8,53 +8,64 @@ module Sfn
8
8
  attribute(
9
9
  :processing, [TrueClass, FalseClass],
10
10
  :description => 'Call the unicorns and explode the glitter bombs',
11
- :default => true
11
+ :default => true,
12
+ :short_flag => 'P'
12
13
  )
13
14
  attribute(
14
15
  :file, String,
15
16
  :description => 'Path to template file',
16
- :default => nil
17
+ :default => nil,
18
+ :short_flag => 'f'
17
19
  )
18
20
  attribute(
19
21
  :file_path_prompt, [TrueClass, FalseClass],
20
22
  :default => true,
21
- :description => 'Enable interactive prompt for template path discovery'
23
+ :description => 'Enable interactive prompt for template path discovery',
24
+ :short_flag => 'F'
22
25
  )
23
26
  attribute(
24
27
  :base_directory, String,
25
- :description => 'Path to root of of templates directory'
28
+ :description => 'Path to root of of templates directory',
29
+ :short_flag => 'b'
26
30
  )
27
31
  attribute(
28
32
  :no_base_directory, [TrueClass, FalseClass],
29
- :description => 'Unset any value used for the template root directory path'
33
+ :description => 'Unset any value used for the template root directory path',
34
+ :short_flag => 'n'
30
35
  )
31
36
  attribute(
32
37
  :translate, String,
33
- :description => 'Translate generated template to given prodiver'
38
+ :description => 'Translate generated template to given provider',
39
+ :short_flag => 't'
34
40
  )
35
41
  attribute(
36
42
  :translate_chunk, Integer,
37
43
  :description => 'Chunk length for serialization',
38
- :coerce => lambda{|v| v.to_i}
44
+ :coerce => lambda{|v| v.to_i},
45
+ :short_flag => 'T'
39
46
  )
40
47
  attribute(
41
48
  :apply_nesting, [String, Symbol],
42
49
  :default => 'deep',
43
- :description => 'Apply stack nesting'
50
+ :description => 'Apply stack nesting',
51
+ :short_flag => 'a'
44
52
  )
45
53
  attribute(
46
54
  :nesting_bucket, String,
47
- :description => 'Bucket to use for storing nested stack templates'
55
+ :description => 'Bucket to use for storing nested stack templates',
56
+ :short_flag => 'N'
48
57
  )
49
58
  attribute(
50
59
  :print_only, [TrueClass, FalseClass],
51
- :description => 'Print the resulting stack template'
60
+ :description => 'Print the resulting stack template',
61
+ :short_flag => 'r'
52
62
  )
53
63
  attribute(
54
64
  :sparkle_pack, String,
55
65
  :multiple => true,
56
66
  :description => 'Load SparklePack gem',
57
- :coerce => lambda{|s| require s; s}
67
+ :coerce => lambda{|s| s.to_s},
68
+ :short_flag => 's'
58
69
  )
59
70
 
60
71
  end
@@ -240,10 +240,12 @@ module Sfn
240
240
  translator = translator_for(t_key)
241
241
 
242
242
  new_parameters = new_parameters.dup
243
- stack.parameters.each do |k,v|
244
- if(new_parameters[k].is_a?(Hash))
245
- val = translator.dereference(new_parameters[k])
246
- new_parameters[k] = val == new_parameters[k] ? v : val
243
+ if(stack.parameters)
244
+ stack.parameters.each do |k,v|
245
+ if(new_parameters[k].is_a?(Hash))
246
+ val = translator.dereference(new_parameters[k])
247
+ new_parameters[k] = val == new_parameters[k] ? v : val
248
+ end
247
249
  end
248
250
  end
249
251
 
@@ -251,10 +253,10 @@ module Sfn
251
253
 
252
254
  new_template_hash = new_template.to_smash
253
255
 
254
- o_nested_stacks = origin_template['Resources'].find_all do |s_name, s_val|
256
+ o_nested_stacks = origin_template.fetch('Resources', {}).find_all do |s_name, s_val|
255
257
  is_stack?(s_val['Type'])
256
258
  end.map(&:first)
257
- n_nested_stacks = new_template_hash['Resources'].find_all do |s_name, s_val|
259
+ n_nested_stacks = new_template_hash.fetch('Resources', {}).find_all do |s_name, s_val|
258
260
  is_stack?(s_val['Type'])
259
261
  end.map(&:first)
260
262
  [o_nested_stacks + n_nested_stacks].flatten.compact.uniq.each do |n_name|
@@ -334,7 +336,7 @@ module Sfn
334
336
  property_name = p_path[3].sub(/\[\d+\]$/, '')
335
337
  type = templates[:origin]['Resources'][resource_name]['Type']
336
338
  info = SfnAws.registry[type]
337
- effect = info[:full_properties].fetch(property_name, {}).fetch(:update_causes, :unknown)
339
+ effect = info[:full_properties].fetch(property_name, {}).fetch(:update_causes, :unknown).to_sym
338
340
  resource = Smash.new(
339
341
  :name => resource_name,
340
342
  :type => type,
@@ -367,7 +369,13 @@ module Sfn
367
369
  end
368
370
  end
369
371
  elsif(path.start_with?('Outputs'))
370
- set_resource(:outputs, results, path.split('.')[1], {:properties => []})
372
+ o_resource_name = path.split('.')[1]
373
+ if(o_resource_name)
374
+ set_resource(
375
+ :outputs, results, o_resource_name,
376
+ :properties => []
377
+ )
378
+ end
371
379
  end
372
380
  end
373
381
 
@@ -403,11 +411,21 @@ module Sfn
403
411
  end
404
412
  template.keys.each do |t_key|
405
413
  next if ['Outputs', 'Resources'].include?(t_key)
406
- template[t_key] = translator.dereference_processor(template[t_key], ['Ref', 'Fn', 'DEREF', 'Fn::FindInMap'])
414
+ template[t_key] = translator.dereference_processor(
415
+ template[t_key], ['Ref', 'Fn', 'DEREF', 'Fn::FindInMap']
416
+ )
407
417
  end
408
418
  translator.original.replace(template)
409
- template['Resources'] = translator.dereference_processor(template['Resources'], ['Ref', 'Fn', 'DEREF', 'Fn::FindInMap'])
410
- template['Outputs'] = translator.dereference_processor(template['Outputs'], ['Ref', 'Fn', 'DEREF', 'Fn::FindInMap'])
419
+ if(template['Resources'])
420
+ template['Resources'] = translator.dereference_processor(
421
+ template['Resources'], ['Ref', 'Fn', 'DEREF', 'Fn::FindInMap']
422
+ )
423
+ end
424
+ if(template['Outputs'])
425
+ template['Outputs'] = translator.dereference_processor(
426
+ template['Outputs'], ['Ref', 'Fn', 'DEREF', 'Fn::FindInMap']
427
+ )
428
+ end
411
429
  translator.original.replace({})
412
430
  template
413
431
  end
data/lib/sfn/version.rb CHANGED
@@ -1,4 +1,4 @@
1
1
  module Sfn
2
2
  # Current library version
3
- VERSION = Gem::Version.new('1.1.16')
3
+ VERSION = Gem::Version.new('1.2.0')
4
4
  end
data/sfn.gemspec CHANGED
@@ -16,6 +16,9 @@ Gem::Specification.new do |s|
16
16
  s.add_dependency 'net-ssh'
17
17
  s.add_dependency 'sparkle_formation', '~> 1.1'
18
18
  s.add_dependency 'hashdiff', '~> 0.2.2'
19
+ s.add_development_dependency 'rake'
20
+ s.add_development_dependency 'minitest'
21
+ s.add_development_dependency 'mocha'
19
22
  s.executables << 'sfn'
20
23
  s.files = Dir['{lib,bin,docs}/**/*'] + %w(sfn.gemspec README.md CHANGELOG.md LICENSE)
21
24
  s.post_install_message = <<-EOF
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sfn
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.16
4
+ version: 1.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Chris Roberts
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-12-11 00:00:00.000000000 Z
11
+ date: 2016-01-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bogo-cli
@@ -94,6 +94,48 @@ dependencies:
94
94
  - - "~>"
95
95
  - !ruby/object:Gem::Version
96
96
  version: 0.2.2
97
+ - !ruby/object:Gem::Dependency
98
+ name: rake
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: minitest
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: mocha
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
97
139
  description: SparkleFormation CLI
98
140
  email: code@chrisroberts.org
99
141
  executables: