sfn 1.1.8 → 1.1.10

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: 698f214f1cdff652dc16b36120697090de470f87
4
- data.tar.gz: 7efbb32522675152516584455f8f317b9816e6f8
3
+ metadata.gz: 8ee7d09945927cfc75821041ef90090dba2ef9c0
4
+ data.tar.gz: fad23bceb0be9ba52eab93f31e51d508c5109de1
5
5
  SHA512:
6
- metadata.gz: 0f2de1bf189064aa4213a6211730d7a0d0760ff613ce5974db6e8957ee7a5301574fcaa15411be1235ca7c7f9f251bd34c9274288d809f1683f540ffa85c7a71
7
- data.tar.gz: c268b90db20e18cb7534ef63b19883026d73e47e62d3cffcfae0d894cb7ad41d58032c715d172d0005f772212250803595c62b06eb9253b92d210ae75940b141
6
+ metadata.gz: adac24b09b2ab1681f88fc4c60d41fb21ca9026e4246527ff63a337c1300de2a8186cfab28b88df7599a2ae092206493ea29e053cd3d1e1dccd3b117844ae827
7
+ data.tar.gz: 55e2b6bdc3cbd30512c8818c2551f2c8253dfc2f5058b03b557816c2cdc8afe48e01c52f2ba2daa057e61b71e70a4791ddac17374b2a8c78bf084dbf7d021bc6
@@ -1,3 +1,9 @@
1
+ ## v1.1.10
2
+ * [enhancement] Better configuration related errors
3
+ * [fix] Planning display on stack removal (#75)
4
+ * [fix] Remove stack properties on update request (#76)
5
+ * [enhancement] Add `retries` config alias for `retry` (#77)
6
+
1
7
  ## v1.1.8
2
8
  * [fix] Disable knife config mashing to get expected values (#72)
3
9
  * [feature] Add new `conf` command (#72)
data/README.md CHANGED
@@ -76,82 +76,6 @@ Configuration.new do
76
76
  end
77
77
  ```
78
78
 
79
- ### Configuration Options
80
-
81
- * `processing` - Enable SparkleFormation processing
82
- * Valid: Boolean
83
- * Default: `true`
84
-
85
- * `apply_nesting` - Style of nested stack processing
86
- * Valid: `"shallow"`, `"deep"`
87
- * Default: `"deep"`
88
-
89
- * `options` - API options for target orchestration API (see miasma)
90
- * Valid: `Hash`
91
- * Default: none
92
-
93
- * `ssh_attempt_users` - List of users to attempt SSH connection on node failure
94
- * Valid: `Array<String>`
95
- * Default: none
96
-
97
- * `identity_file` - Custom SSH identity file to use for connection on node failure
98
- * Valid: `String`
99
- * Default: none
100
-
101
- * `nesting_bucket` - Name of bucket to store nested stack templates
102
- * Valid: `String`
103
- * Default: none
104
-
105
- * `credentials` - API credentials for target orchestration API (see [miasma](https://github.com/miasma-rb/miasma))
106
- * Valid: `Hash`
107
- * Default: none
108
-
109
- * `callbacks` - Callbacks to execute around API calls
110
- * Valid: `Hash`
111
- * Default: none
112
- * `before` - Callbacks to execute before _any_ API call
113
- * Valid: `Array<String>`
114
- * Default: none
115
- * `after` - Callbacks to execute after _any_ API call
116
- * Valid: `Array<String>`
117
- * Default: none
118
- * `before_COMMAND` - Callbacks to execute before specific `COMMAND` API call
119
- * Valid: `Array<String>`
120
- * Default: none
121
- * `after_COMMAND` - Callbacks to execute after specific `COMMAND` API call
122
- * Valid: `Array<String>`
123
- * Default: none
124
- * `template` - Callbacks to execute on template
125
- * Valid: `Array<String>`
126
- * Default: none
127
- * `default` - Callbacks to always execute
128
- * Valid: `Array<String>`
129
- * Default: none
130
- * `require` - List of custom libraries to load
131
- * Valid: `Array<String>`
132
- * Default: none
133
-
134
- * `retry` - Configuration of API request retries
135
- * Valid: `Hash`
136
- * Default: none
137
- * `type` - Type of retry
138
- * Valid: `"flat"`, `"linear"`, `"exponential"`
139
- * Default: `"exponential"`
140
- * `interval` - Base wait interval for retry
141
- * Valid: `Numeric`
142
- * Default: 5
143
- * `max_attempts` - Maximum number of attempts allowed
144
- * Valid: `Numeric`
145
- * Default: 20
146
- * _NOTE_: Set to `nil` for infinite retry
147
-
148
- * `stack_types` - Valid stack resource types
149
- * Valid: `Array<String>`
150
- * Default: `[DEFAULT_PROVIDER_TYPE]`
151
-
152
- * `locations` - API credentials for named locations
153
- * Valid: `Hash`
154
- * Default: none
155
79
 
156
80
  ## Commands
157
81
 
@@ -179,57 +103,6 @@ Validates template with API
179
103
 
180
104
  Creates a new stack with the provided name (`NAME`).
181
105
 
182
- #### Apply Stacks
183
-
184
- The `--apply-stack` option allows providing the name of an existing
185
- stack when creating or updating. Applying stacks is simply fetching
186
- the outputs from the applied stacks and automatically defaulting the
187
- set parameter of the new or updated stack. Outputs are matched
188
- by name to the parameters of the target stack. This allows an easy
189
- way to use values from existing stacks when building new stacks.
190
-
191
- Example:
192
-
193
- StackA:
194
-
195
- ```json
196
- ...
197
- "Outputs": {
198
- "LoadBalancerAddress": {
199
- "Description": "Address of Load Balancer",
200
- "Value": {
201
- "Fn::GetAtt": [
202
- "LoadBalancerResource",
203
- "DNSName"
204
- ]
205
- }
206
- }
207
- }
208
- ...
209
- ```
210
-
211
- StackB:
212
-
213
- ```json
214
- ...
215
- "Parameters": {
216
- "LoadBalancerAddress": {
217
- "Type": "String",
218
- "Default": "unset"
219
- }
220
- }
221
- ...
222
- ```
223
-
224
- When creating StackB, if we use the `--apply-stack` option:
225
-
226
- ```
227
- $ sfn create StackB --apply-stack StackA
228
- ```
229
-
230
- when prompted for the stack parameters, we will find the parameter
231
- value for `LoadBalancerAddress` to be filled in with the output
232
- provided from StackA.
233
106
 
234
107
  #### Processing
235
108
 
@@ -0,0 +1,343 @@
1
+ ---
2
+ title: "Commands"
3
+ weight: 4
4
+ anchors:
5
+ - title: "Lifecycle commands"
6
+ url: "#lifecycle-commands"
7
+ - title: "Inspection and Information commands"
8
+ url: "#inspection-and-information-commands"
9
+ - title: "Configuration commands"
10
+ url: "#configuration-commands"
11
+ ---
12
+
13
+ ## SparkleFormation CLI commands
14
+
15
+ The `sfn` command provides a collection of subcommands to handle stack
16
+ lifecycles as well as subcommands to aid in inspection of existing
17
+ stacks.
18
+
19
+ ### Lifecycle commands
20
+
21
+ #### Stack create
22
+
23
+ Stacks can be created via `sfn` using SparkleFormation templates or raw JSON
24
+ templates.
25
+
26
+ ~~~
27
+ $ sfn create my-stack
28
+ ~~~
29
+
30
+ `sfn` will prompt for selection of a template to build for this new stack. To
31
+ disable this prompting behavior, you can provide the path or name of the desired
32
+ template:
33
+
34
+ ~~~
35
+ $ sfn create my-stack --file my_template
36
+ ~~~
37
+
38
+ By default `sfn` will process and build SparkleFormation templates. To build a JSON
39
+ template, disable processing in the configuration file, or via flag:
40
+
41
+ ~~~
42
+ $ sfn create my-stack --file ./my_template.json --no-processing
43
+ ~~~
44
+
45
+ The `create` command is only responsible for initiating the stack creation with the
46
+ remote provider API. This does not report back the success or failure of the actual
47
+ stack creation. To provide this behavior, the `create` command will automatically poll
48
+ the stack's resource events. Once the stack as reached a completed state, the `create`
49
+ command can properly notify of a _success_ or _failed_ state and exit with the proper
50
+ status code. The automatic polling behavior can be disabled:
51
+
52
+ ~~~
53
+ $ sfn create my-stack --file my_template --no-poll
54
+ ~~~
55
+
56
+ The `--apply-stack` option allows providing the name of an existing
57
+ stack when creating or updating. Applying stacks is simply fetching
58
+ the outputs from the applied stacks and automatically defaulting the
59
+ set parameter of the new or updated stack. Outputs are matched
60
+ by name to the parameters of the target stack. This allows an easy
61
+ way to use values from existing stacks when building new stacks.
62
+
63
+ Example:
64
+
65
+ StackA:
66
+
67
+ ~~~json
68
+ ...
69
+ "Outputs": {
70
+ "LoadBalancerAddress": {
71
+ "Description": "Address of Load Balancer",
72
+ "Value": {
73
+ "Fn::GetAtt": [
74
+ "LoadBalancerResource",
75
+ "DNSName"
76
+ ]
77
+ }
78
+ }
79
+ }
80
+ ...
81
+ ~~~
82
+
83
+ StackB:
84
+
85
+ ~~~json
86
+ ...
87
+ "Parameters": {
88
+ "LoadBalancerAddress": {
89
+ "Type": "String",
90
+ "Default": "unset"
91
+ }
92
+ }
93
+ ...
94
+ ~~~
95
+
96
+ When creating StackB, if we use the `--apply-stack` option:
97
+
98
+ ~~~
99
+ $ sfn create StackB --apply-stack StackA
100
+ ~~~
101
+
102
+ when prompted for the stack parameters, we will find the parameter
103
+ value for `LoadBalancerAddress` to be filled in with the output
104
+ provided from StackA.
105
+
106
+ Example of stack creation:
107
+
108
+ ![stack create](./images/d_create.png)
109
+
110
+ #### Stack update
111
+
112
+ Existing stacks can be updated via `sfn`:
113
+
114
+ ~~~
115
+ $ sfn update my-stack
116
+ ~~~
117
+
118
+ This will start an "in place" update. Only the parameters of the stack are updated. To
119
+ update the template of the stack as well:
120
+
121
+ ~~~
122
+ $ sfn update my-stack --file my_template
123
+ ~~~
124
+
125
+ The `update` command behaves like the `create` command. It is only responsible for initiating
126
+ the request with the remote provider API. It will poll the stack events to detect final stack
127
+ state. The polling can be disabled:
128
+
129
+ ~~~
130
+ $ sfn update my-stack --file my_template --no-poll
131
+ ~~~
132
+
133
+ Example of stack update:
134
+
135
+ ![stack update](./images/d_update.png)
136
+
137
+ #### Stack destroy
138
+
139
+ Existing stacks can be destroyed via `sfn`:
140
+
141
+ ~~~
142
+ $ sfn destroy my-stack
143
+ ~~~
144
+
145
+ By default a confirmation prompt will be provided prior to destroying an existing stack.
146
+ This can be disabled by automatically confirming:
147
+
148
+ ~~~
149
+ $ sfn destroy my-stack --yes
150
+ ~~~
151
+
152
+ The `destroy` command will poll the stack resource events until the stack has been successfully
153
+ deleted, or has reached a "complete" state (which would indicate a failure to destroy). The polling
154
+ can be disabled:
155
+
156
+ ~~~
157
+ $ sfn destroy my-stack --yes --no-poll
158
+ ~~~
159
+
160
+ The `destroy` command also provides glob support when specifying stack names. This can make cleanup
161
+ very easy when multiple testing stacks may exist:
162
+
163
+ ~~~
164
+ $ sfn destroy my-stack-*
165
+ ~~~
166
+
167
+ This will destroy all stacks whose name start with `my-stack-`. The command will prompt for confirmation
168
+ and provide a list of all matching stacks prior to destruction.
169
+
170
+ Example of stack destroy:
171
+
172
+ ![stack destroy](./images/d_destroy.png)
173
+
174
+ ### Inspection and Information commands
175
+
176
+ #### Stack list
177
+
178
+ To list existing stacks:
179
+
180
+ ~~~
181
+ $ sfn list
182
+ ~~~
183
+
184
+ Example of a stack list:
185
+
186
+ ![stack list](./images/d_list.png)
187
+
188
+ #### Stack describe
189
+
190
+ A description of an existing stack will display resources allocated to the stack and any outputs
191
+ that were defined within the stack's template:
192
+
193
+ ~~~
194
+ $ sfn describe my-stack
195
+ ~~~
196
+
197
+ If the stack contains nested stacks, it will display the resources and outputs for those stacks
198
+ as well.
199
+
200
+ To describe only resources:
201
+
202
+ ~~~
203
+ $ sfn describe my-stack --resources
204
+ ~~~
205
+
206
+ To describe only outputs:
207
+
208
+ ~~~
209
+ $ sfn describe my-stack --outputs
210
+ ~~~
211
+
212
+ Example of a stack describe:
213
+
214
+ ![stack describe](./images/d_describe.png)
215
+
216
+ #### Stack events
217
+
218
+ List the events genereted by the resources allocated to an existing stack:
219
+
220
+ ~~~
221
+ $ sfn events my-stack
222
+ ~~~
223
+
224
+ If the resources within the stack are currently being modified (via a `create`, `update`, or `destroy`)
225
+ command, the events can be polled until the stack reaches a completed state:
226
+
227
+ ~~~
228
+ $ sfn events my-stack --poll
229
+ ~~~
230
+
231
+ Example of stack events:
232
+
233
+ ![stack events](./images/d_events.png)
234
+
235
+ #### Stack inspection
236
+
237
+ Existing stacks can have their resources inspected via `sfn` using the miasma model API. The `inspect`
238
+ command provides the ability to directly access resource information where the miasma library has
239
+ modeling support enabled.
240
+
241
+ One builtin helper for the `inspect` command is listing all compute resources available within a stack.
242
+ This includes standalone compute instances as well as compute instances attached to auto-scaling groups
243
+ defined within the stack.
244
+
245
+ ~~~
246
+ $ sfn inspect my-stack --nodes
247
+ ~~~
248
+
249
+ Example of stack node inspection:
250
+
251
+ ![stack inspect nodes](./images/d_inspect-nodes.png)
252
+
253
+ When run with no options, the `inspect` command will output the data model information of the stack:
254
+
255
+ ~~~
256
+ $ sfn inspect my-stack
257
+ ~~~
258
+
259
+ Individual items can be displayed using the attribute flag:
260
+
261
+ ~~~
262
+ $ sfn inspect my-stack --attribute template
263
+ ~~~
264
+
265
+ The attribute flag is gets applied to the miasma data model and will output the result of request. For
266
+ example, if the stack consisted of one resource, and that resource was a compute instance, we could view
267
+ the resource information from the orchestration API point of view:
268
+
269
+ ~~~
270
+ $ sfn inspect my-stack --attribute "resources.all.first"
271
+ ~~~
272
+
273
+ The information here will be sparse because the orchestration API only keeps a reference to the actual
274
+ resource within its own system. Because the miasma library has compute modeling defined, we can utilize
275
+ the library to automatically load the compute instance:
276
+
277
+ ~~~
278
+ $ sfn inspect my-stack --attribute "resources.all.first.expand"
279
+ ~~~
280
+
281
+ If only the addresses allocated to the compute instance were desired, that can be requested:
282
+
283
+ ~~~
284
+ $ sfn inspect my-stack --attribute "resources.all.first.expand.addresses"
285
+ ~~~
286
+
287
+ Example of stack attribute inspection
288
+
289
+ ![stack inspect attribute](./images/d_inspect-attribute.png)
290
+
291
+ #### Template print
292
+
293
+ To display a generated template:
294
+
295
+ ~~~
296
+ $ sfn print --file my_template
297
+ ~~~
298
+
299
+ #### Template validation
300
+
301
+ Templates can be validated with the remote provide API prior to creation:
302
+
303
+ ~~~
304
+ $ sfn validate --file my_template
305
+ ~~~
306
+
307
+ If the template is a JSON style template, disable processing:
308
+
309
+ ~~~
310
+ $ sfn validate --file my_template --no-processing
311
+ ~~~
312
+
313
+ Example of stack validate:
314
+
315
+ ![stack validate](./images/d_validate.png)
316
+
317
+ #### Template diff
318
+
319
+ Template updates can be diff'ed against an existing stack's template to display information about
320
+ what resource modifications will be introduced by the new template:
321
+
322
+ ~~~
323
+ $ sfn diff my-stack --file my_template
324
+ ~~~
325
+
326
+ Example of stack diff:
327
+
328
+ ![stack diff](./images/d_diff.png)
329
+
330
+ ### Configuration commands
331
+
332
+ To aid setup and configuration, `sfn` provides a configuration helper:
333
+
334
+ ~~~
335
+ $ sfn conf
336
+ ~~~
337
+
338
+ This will display the current configuration. If no configuration file is present, the user can have
339
+ one automatically generated for them:
340
+
341
+ ~~~
342
+ $ sfn conf --generate
343
+ ~~~
@@ -6,6 +6,8 @@ anchors:
6
6
  url: "#sfn-based"
7
7
  - title: "knife-based"
8
8
  url: "#knife-based"
9
+ - title: "configuration-options"
10
+ url: "#configuration-options"
9
11
  ---
10
12
 
11
13
 
@@ -43,4 +45,93 @@ can be accessed via:
43
45
  $ knife sparkleformation --help
44
46
  ~~~
45
47
 
48
+ ### Configuration Options
49
+
50
+ | Option | Attribute | Value
51
+ |----------------------------|---------------|---------------------------------------------------------------
52
+ | `processing` | Description | Enable SparkleFormation processing
53
+ | | Valid | `TrueClass`, `FalseClass`
54
+ | | Default | `true`
55
+ |----------------------------|---------------|---------------------------------------------------------------
56
+ | `apply_nesting` | Description | Style of nested stack processing
57
+ | | Valid | `"shallow"`, `"deep"`
58
+ | | Default | `"deep"`
59
+ |----------------------------|---------------|---------------------------------------------------------------
60
+ | `options` | Description | API options for target API (see miasma)
61
+ | | Valid | `Hash`
62
+ | | Default | none
63
+ |----------------------------|---------------|---------------------------------------------------------------
64
+ | `ssh_attempt_users` | Description | List of users to attempt SSH connection on node failure
65
+ | | Valid | `Array<String>`
66
+ | | Default | none
67
+ |----------------------------|---------------|---------------------------------------------------------------
68
+ | `identity_file` | Description | Custom SSH identity file for node failure connection
69
+ | | Valid | `String`
70
+ | | Default | none
71
+ |----------------------------|---------------|---------------------------------------------------------------
72
+ | `nesting_bucket` | Description | Name of bucket to store nested stack templates
73
+ | | Valid | `String`
74
+ | | Default | none
75
+ |----------------------------|---------------|---------------------------------------------------------------
76
+ | `credentials` | Description | API credentials for target orchestration API
77
+ | | Valid | `Hash`
78
+ | | Default | none
79
+ |----------------------------|---------------|---------------------------------------------------------------
80
+ | `callbacks` | Description | Callbacks to execute around API calls
81
+ | | Valid | `Hash`
82
+ | | Default | none
83
+ |----------------------------|---------------|---------------------------------------------------------------
84
+ | `callbacks.before` | Description | Callbacks to execute before _any_ API call
85
+ | | Valid | `Array<String>`
86
+ | | Default | none
87
+ |----------------------------|---------------|---------------------------------------------------------------
88
+ | `callbacks.after` | Description | Callbacks to execute after _any_ API call
89
+ | | Valid | `Array<String>`
90
+ | | Default | none
91
+ |----------------------------|---------------|---------------------------------------------------------------
92
+ | `callbacks.before_COMMAND` | Description | Callbacks to execute before specific `COMMAND` API call
93
+ | | Valid | `Array<String>`
94
+ | | Default | none
95
+ |----------------------------|---------------|---------------------------------------------------------------
96
+ | `callbacks.after_COMMAND` | Description | Callbacks to execute after specific `COMMAND` API call
97
+ | | Valid | `Array<String>`
98
+ | | Default | none
99
+ |----------------------------|---------------|---------------------------------------------------------------
100
+ | `callbacks.template` | Description | Callbacks to execute on template
101
+ | | Valid | `Array<String>`
102
+ | | Default | none
103
+ |----------------------------|---------------|---------------------------------------------------------------
104
+ | `callbacks.default` | Description | Callbacks to always execute
105
+ | | Valid | `Array<String>`
106
+ | | Default | none
107
+ |----------------------------|---------------|---------------------------------------------------------------
108
+ | `callbacks.require` | Description | List of custom libraries to load
109
+ | | Valid | `Array<String>`
110
+ | | Default | none
111
+ |----------------------------|---------------|---------------------------------------------------------------
112
+ | `retries` | Description | Configuration of API request retries
113
+ | | Valid | `Hash`
114
+ | | Default | none
115
+ |----------------------------|---------------|---------------------------------------------------------------
116
+ | `retries.type` | Description | Retry implementation
117
+ | | Valid | `"flat"`, `"linear"`, `"exponential"`
118
+ | | Default | `"exponential"`
119
+ |----------------------------|---------------|---------------------------------------------------------------
120
+ | `retries.interval` | Description | Base wait interval for retry
121
+ | | Valid | `Numeric`
122
+ | | Default | `5`
123
+ |----------------------------|---------------|---------------------------------------------------------------
124
+ | `retries.max_attempts` | Description | Maximum number of attempts allowed (`nil` for infinite retry)
125
+ | | Valid | `Numeric`, `NilClass`
126
+ | | Default | `20`
127
+ |----------------------------|---------------|---------------------------------------------------------------
128
+ | `stack_types` | Description | Define customized stack resource types
129
+ | | Valid | `Array<String>`
130
+ | | Default | `[DEFAULT_PROVIDER_TYPE]`
131
+ |----------------------------|---------------|---------------------------------------------------------------
132
+ | `locations` | Description | API credentials for named locations (JackalStack resources)
133
+ | | Valid | `Hash`
134
+ | | Default | none
135
+ |----------------------------|---------------|---------------------------------------------------------------
136
+
46
137
  [knife]: https://docs.chef.io/knife.html
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
@@ -14,6 +14,25 @@ module Sfn
14
14
  format_value(config[k], ' ')
15
15
  end
16
16
  end
17
+ if(config[:generate])
18
+ ui.puts
19
+ ui.info 'Generating .sfn configuration file..'
20
+ generate_config!
21
+ ui.info "Generation of .sfn configuration file #{ui.color('complete!', :green, :bold)}"
22
+ end
23
+ end
24
+
25
+ def generate_config!
26
+ if(File.exists?('.sfn'))
27
+ ui.warn 'Existing .sfn configuration file detected!'
28
+ ui.confirm 'Overwrite current .sfn configuration file?'
29
+ end
30
+ run_action 'Writing .sfn file' do
31
+ File.open('.sfn', 'w') do |file|
32
+ file.write SFN_CONFIG_CONTENTS
33
+ end
34
+ nil
35
+ end
17
36
  end
18
37
 
19
38
  def format_value(value, indent='')
@@ -34,6 +53,35 @@ module Sfn
34
53
  end
35
54
  end
36
55
 
56
+ SFN_CONFIG_CONTENTS = <<-EOF
57
+ # This is an auto-generated configuration file for
58
+ # the sfn CLI. To view all available configuration
59
+ # options, please see:
60
+ # http://www.sparkleformation.io/docs/sfn/configuration.html
61
+ Configuration.new do
62
+ apply_nesting 'deep'
63
+ processing true
64
+ options do
65
+ on_failure 'nothing'
66
+ notification_topics []
67
+ capabilities ['CAPABILITY_IAM']
68
+ tags do
69
+ creator ENV['USER']
70
+ end
71
+ end
72
+ # nesting_bucket 'BUCKET_NAME'
73
+ credentials do
74
+ provider :aws
75
+ aws_access_key_id ENV['AWS_ACCESS_KEY_ID']
76
+ aws_secret_access_key ENV['AWS_SECRET_ACCESS_KEY']
77
+ aws_region ENV['AWS_REGION']
78
+ aws_bucket_region ENV['AWS_REGION']
79
+ # aws_sts_role_arn ENV['AWS_STS_ROLE_ARN']
80
+ end
81
+ end
82
+ EOF
83
+
84
+
37
85
  end
38
86
  end
39
87
  end
@@ -97,7 +97,7 @@ module Sfn
97
97
  end
98
98
 
99
99
  stack.parameters = config_root_parameters
100
- stack.template = Sfn::Utils::StackParameterScrubber.scrub!(update_template)
100
+ stack.template = scrub_template(update_template)
101
101
  else
102
102
  apply_stacks!(stack)
103
103
 
@@ -240,6 +240,20 @@ module Sfn
240
240
  end
241
241
  end
242
242
 
243
+ # Scrub sparkle/sfn customizations from the stack resource data
244
+ #
245
+ # @param template [Hash]
246
+ # @return [Hash]
247
+ def scrub_template(template)
248
+ template = Sfn::Utils::StackParameterScrubber.scrub!(template)
249
+ (template['Resources'] || {}).each do |r_name, r_content|
250
+ if(valid_stack_types.include?(r_content['Type']))
251
+ (r_content['Properties'] || {}).delete('Stack')
252
+ end
253
+ end
254
+ template
255
+ end
256
+
243
257
  end
244
258
  end
245
259
  end
@@ -8,6 +8,11 @@ module Sfn
8
8
  # Instance methods for cloudformation command classes
9
9
  module InstanceMethods
10
10
 
11
+ # @return [Array<String>]
12
+ def valid_stack_types
13
+ provider.connection.data[:stack_types]
14
+ end
15
+
11
16
  # @return [Array<String>]
12
17
  def custom_stack_types
13
18
  [config.fetch(:stack_types, [])].flatten.compact
@@ -15,25 +20,33 @@ module Sfn
15
20
 
16
21
  # @return [KnifeCloudformation::Provider]
17
22
  def provider
18
- memoize(:provider, :direct) do
19
- result = Sfn::Provider.new(
20
- :miasma => config[:credentials],
21
- :async => false,
22
- :fetch => false
23
- )
24
- result.connection.data[:stack_types] = (
25
- [
26
- result.connection.class.const_get(:RESOURCE_MAPPING).detect do |klass, info|
27
- info[:api] == :orchestration
28
- end.first
29
- ] + custom_stack_types
30
- ).compact.uniq
31
- result.connection.data[:retry_ui] = ui
32
- result.connection.data[:locations] = config.fetch(:locations, {})
33
- result.connection.data[:retry_type] = config.fetch(:retry, :type, :exponential)
34
- result.connection.data[:retry_interval] = config.fetch(:retry, :interval, 5)
35
- result.connection.data[:retry_max] = config.fetch(:retry, :max_attempts, 20)
36
- result
23
+ begin
24
+ memoize(:provider, :direct) do
25
+ result = Sfn::Provider.new(
26
+ :miasma => config[:credentials],
27
+ :async => false,
28
+ :fetch => false
29
+ )
30
+ result.connection.data[:stack_types] = (
31
+ [
32
+ result.connection.class.const_get(:RESOURCE_MAPPING).detect do |klass, info|
33
+ info[:api] == :orchestration
34
+ end.first
35
+ ] + custom_stack_types
36
+ ).compact.uniq
37
+ retry_config = config.fetch(:retry,
38
+ config.fetch(:retries, {})
39
+ )
40
+ result.connection.data[:retry_ui] = ui
41
+ result.connection.data[:locations] = config.fetch(:locations, {})
42
+ result.connection.data[:retry_type] = retry_config.fetch(:type, :exponential)
43
+ result.connection.data[:retry_interval] = retry_config.fetch(:interval, 5)
44
+ result.connection.data[:retry_max] = retry_config.fetch(:max_attempts, 20)
45
+ result
46
+ end
47
+ rescue
48
+ ui.error 'Failed to create remote API connection. Please validate configuration!'
49
+ raise
37
50
  end
38
51
  end
39
52
 
@@ -4,6 +4,12 @@ module Sfn
4
4
  class Config
5
5
  # Config command configuration (subclass create to get all the configs)
6
6
  class Conf < Create
7
+
8
+ attribute(
9
+ :generate, [TrueClass, FalseClass],
10
+ :description => 'Generate a basic configuration file'
11
+ )
12
+
7
13
  end
8
14
  end
9
15
  end
@@ -7,7 +7,8 @@ module Sfn
7
7
 
8
8
  attribute(
9
9
  :processing, [TrueClass, FalseClass],
10
- :description => 'Call the unicorns and explode the glitter bombs'
10
+ :description => 'Call the unicorns and explode the glitter bombs',
11
+ :default => true
11
12
  )
12
13
  attribute(
13
14
  :file, String,
@@ -243,9 +243,8 @@ module Sfn
243
243
  n_exists = is_stack?(update_template['Resources'].fetch(n_name, {})['Type'])
244
244
  n_template = update_template['Resources'].fetch(n_name, {}).fetch('Properties', {})['Stack']
245
245
  n_parameters = update_template['Resources'].fetch(n_name, {}).fetch('Properties', {})['Parameters']
246
- n_type = update_template['Resources'].fetch(n_name, {}).fetch('Type',
246
+ n_type = update_template['Resources'].fetch(n_name, {})['Type'] ||
247
247
  origin_template['Resources'][n_name]['Type']
248
- )
249
248
  resource = Smash.new(
250
249
  :name => n_name,
251
250
  :type => n_type,
@@ -41,7 +41,7 @@ module Sfn
41
41
  def initialize(args={})
42
42
  args = args.to_smash
43
43
  unless(args.get(:miasma, :provider))
44
- best_guess = args.fetch(:miasma, {}).keys.group_by do |key|
44
+ best_guess = (args[:miasma] || {}).keys.group_by do |key|
45
45
  key.to_s.split('_').first
46
46
  end.sort do |x, y|
47
47
  y.size <=> x.size
@@ -1,4 +1,4 @@
1
1
  module Sfn
2
2
  # Current library version
3
- VERSION = Gem::Version.new('1.1.8')
3
+ VERSION = Gem::Version.new('1.1.10')
4
4
  end
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.8
4
+ version: 1.1.10
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-11-04 00:00:00.000000000 Z
11
+ date: 2015-11-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bogo-cli
@@ -108,7 +108,19 @@ files:
108
108
  - bin/sfn
109
109
  - docs/README.md
110
110
  - docs/callbacks.md
111
+ - docs/commands.md
111
112
  - docs/configuration.md
113
+ - docs/images/d_create.png
114
+ - docs/images/d_create_prompt.png
115
+ - docs/images/d_describe.png
116
+ - docs/images/d_destroy.png
117
+ - docs/images/d_diff.png
118
+ - docs/images/d_events.png
119
+ - docs/images/d_inspect-attribute.png
120
+ - docs/images/d_inspect-nodes.png
121
+ - docs/images/d_list.png
122
+ - docs/images/d_update.png
123
+ - docs/images/d_validate.png
112
124
  - docs/overview.md
113
125
  - docs/usage.md
114
126
  - docs/v/0.3.2/marked.js
@@ -209,3 +221,4 @@ signing_key:
209
221
  specification_version: 4
210
222
  summary: SparkleFormation CLI
211
223
  test_files: []
224
+ has_rdoc: