sfn 1.1.16 → 1.2.0

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 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: