sfn 1.2.0 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +9 -0
- data/bin/sfn +4 -0
- data/docs/configuration.md +20 -0
- data/lib/sfn.rb +1 -0
- data/lib/sfn/command/conf.rb +40 -0
- data/lib/sfn/command/create.rb +5 -1
- data/lib/sfn/command/events.rb +3 -1
- data/lib/sfn/command/list.rb +4 -1
- data/lib/sfn/command/update.rb +6 -6
- data/lib/sfn/command_module/base.rb +2 -2
- data/lib/sfn/command_module/stack.rb +8 -2
- data/lib/sfn/command_module/template.rb +65 -18
- data/lib/sfn/config/validate.rb +5 -0
- data/lib/sfn/monkey_patch/stack.rb +2 -2
- data/lib/sfn/version.rb +1 -1
- data/sfn.gemspec +7 -18
- metadata +21 -16
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1d4a0525d2165a404b2a131f9b1edb470fd2b5b3
|
4
|
+
data.tar.gz: c6640282596fb6f2770b05a3dd8e7a60f6e26312
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3e30c1d2a4470fe271c4bcd6a8dc6affe57fd9d101b68bb19a27ce604f8b54c5515879a1b231c3e8504da639a347504b0c46ba5faa6f23624233840d86ae547e
|
7
|
+
data.tar.gz: 95995a16cc8cb71cae4dc732a9b13833d1c9e16b7d0a55a78e2c2fd660c7668de86c7ecdd1366f961e497e138d2371abae75c0a827fa4d89584fdae33d30a70f
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,12 @@
|
|
1
|
+
# v2.0.0
|
2
|
+
* [enhancement] Move to SparkleFormation 2.0
|
3
|
+
* [enhancement] Add more credential content to configuration file generator
|
4
|
+
* [feature] Run Bundler.require if Bundler is detected (#97)
|
5
|
+
* [enhancement] Extract provider specific details for abstracts (#98)
|
6
|
+
* [enhancement] Add `nesting_prefix` to customize nested template storage path (#99)
|
7
|
+
* [fix] Properly display substack planning information
|
8
|
+
* [fix] Force minimum width on list columns to prevent bunching on no content
|
9
|
+
|
1
10
|
# v1.2.0
|
2
11
|
* [fix] Always require packs when loading
|
3
12
|
* [fix] Prevent stale output display on update
|
data/bin/sfn
CHANGED
data/docs/configuration.md
CHANGED
@@ -6,6 +6,8 @@ anchors:
|
|
6
6
|
url: "#sfn-based"
|
7
7
|
- title: "knife-based"
|
8
8
|
url: "#knife-based"
|
9
|
+
- title: "Generate sfn configuration"
|
10
|
+
url: "#generate-sfn-configuration"
|
9
11
|
- title: "configuration-options"
|
10
12
|
url: "#configuration-options"
|
11
13
|
---
|
@@ -34,6 +36,20 @@ Supported formats:
|
|
34
36
|
The configuration is contained within a file named
|
35
37
|
`.sfn`.
|
36
38
|
|
39
|
+
#### Generate sfn configuration
|
40
|
+
|
41
|
+
The `sfn` command provides a `conf` subcommand. By
|
42
|
+
default this command will display current local
|
43
|
+
configuration values. It can also be used to generate
|
44
|
+
an initial configuration file which can then be
|
45
|
+
customized:
|
46
|
+
|
47
|
+
~~~
|
48
|
+
$ sfn conf --generate
|
49
|
+
~~~
|
50
|
+
|
51
|
+
This will create a new `.sfn` file in the working directory.
|
52
|
+
|
37
53
|
### `knife`-based
|
38
54
|
|
39
55
|
The `sfn` application includes a plugin for the
|
@@ -73,6 +89,10 @@ $ knife sparkleformation --help
|
|
73
89
|
| | Valid | `String`
|
74
90
|
| | Default | none
|
75
91
|
|----------------------------|---------------|---------------------------------------------------------------
|
92
|
+
| `nesting_prefix` | Description | Prefix to prepend to template file name within object store
|
93
|
+
| | Valid | `String`
|
94
|
+
| | Default | none
|
95
|
+
|----------------------------|---------------|---------------------------------------------------------------
|
76
96
|
| `sparkle_pack` | Description | SparklePacks to load
|
77
97
|
| | Valid | `Array<String>`
|
78
98
|
| | Default | none
|
data/lib/sfn.rb
CHANGED
data/lib/sfn/command/conf.rb
CHANGED
@@ -59,8 +59,12 @@ module Sfn
|
|
59
59
|
# options, please see:
|
60
60
|
# http://www.sparkleformation.io/docs/sfn/configuration.html
|
61
61
|
Configuration.new do
|
62
|
+
# Set style of stack nesting
|
62
63
|
apply_nesting 'deep'
|
64
|
+
# Enable processing of SparkleFormation templates
|
63
65
|
processing true
|
66
|
+
# Provider specific options used when creating
|
67
|
+
# new stacks. Options defined here are AWS specific.
|
64
68
|
options do
|
65
69
|
on_failure 'nothing'
|
66
70
|
notification_topics []
|
@@ -69,14 +73,50 @@ Configuration.new do
|
|
69
73
|
creator ENV['USER']
|
70
74
|
end
|
71
75
|
end
|
76
|
+
# Name of bucket in object store to hold nested
|
77
|
+
# stack templates
|
72
78
|
# nesting_bucket 'BUCKET_NAME'
|
79
|
+
# Prefix used on generated template path prior to storage
|
80
|
+
# in the object store
|
81
|
+
# nesting_prefix 'nested-templates'
|
82
|
+
# Remote provider credentials
|
73
83
|
credentials do
|
84
|
+
# Remote provider name (:aws, :azure, :open_stack, :rackspace)
|
74
85
|
provider :aws
|
86
|
+
# AWS credentials information
|
75
87
|
aws_access_key_id ENV['AWS_ACCESS_KEY_ID']
|
76
88
|
aws_secret_access_key ENV['AWS_SECRET_ACCESS_KEY']
|
77
89
|
aws_region ENV['AWS_REGION']
|
78
90
|
aws_bucket_region ENV['AWS_REGION']
|
79
91
|
# aws_sts_role_arn ENV['AWS_STS_ROLE_ARN']
|
92
|
+
# Eucalyptus related additions
|
93
|
+
# api_endpoint ENV['EUCA_ENDPOINT']
|
94
|
+
# euca_compat 'path'
|
95
|
+
# ssl_enabled false
|
96
|
+
# Azure credentials information
|
97
|
+
azure_tenant_id ENV['AZURE_TENANT_ID']
|
98
|
+
azure_client_id ENV['AZURE_CLIENT_ID']
|
99
|
+
azure_subscription_id ENV['AZURE_SUBSCRIPTION_ID']
|
100
|
+
azure_client_secret ENV['AZURE_CLIENT_ID']
|
101
|
+
azure_region ENV['AZURE_REGION']
|
102
|
+
azure_blob_account_name ENV['AZURE_BLOB_ACCOUNT_NAME']
|
103
|
+
azure_blob_secret_key ENV['AZURE_BLOB_SECRET_KEY']
|
104
|
+
# Defaults to "miasma-orchestration-templates"
|
105
|
+
azure_root_orchestration_container ENV['AZURE_ROOT_ORCHESTRATION_CONTAINER']
|
106
|
+
# OpenStack credentials information
|
107
|
+
open_stack_identity_url ENV['OPENSTACK_IDENTITY_URL']
|
108
|
+
open_stack_username ENV['OPENSTACK_USERNAME']
|
109
|
+
open_stack_user_id ENV['OPENSTACK_USER_ID']
|
110
|
+
open_stack_password ENV['OPENSTACK_PASSWORD']
|
111
|
+
open_stack_token ENV['OPENSTACK_TOKEN']
|
112
|
+
open_stack_region ENV['OPENSTACK_REGION']
|
113
|
+
open_stack_tenant_name ENV['OPENSTACK_TENANT_NAME']
|
114
|
+
open_stack_domain ENV['OPENSTACK_DOMAIN']
|
115
|
+
open_stack_project ENV['OPENSTACK_PROJECT']
|
116
|
+
# Rackspace credentials information
|
117
|
+
rackspace_api_key ENV['RACKSPACE_API_KEY']
|
118
|
+
rackspace_username ENV['RACKSPACE_USERNAME']
|
119
|
+
rackspace_region ENV['RACKSPACE_REGION']
|
80
120
|
end
|
81
121
|
end
|
82
122
|
EOF
|
data/lib/sfn/command/create.rb
CHANGED
@@ -14,6 +14,10 @@ module Sfn
|
|
14
14
|
def execute!
|
15
15
|
name_required!
|
16
16
|
name = name_args.first
|
17
|
+
|
18
|
+
# NOTE: Always disable plans on create
|
19
|
+
config[:plan] = false
|
20
|
+
|
17
21
|
if(config[:template])
|
18
22
|
file = config[:template]
|
19
23
|
else
|
@@ -78,7 +82,7 @@ module Sfn
|
|
78
82
|
namespace.const_get(:Describe).new({:outputs => true}, [name]).execute!
|
79
83
|
else
|
80
84
|
ui.fatal "Create of new stack #{ui.color(name, :bold)}: #{ui.color('FAILED', :red, :bold)}"
|
81
|
-
raise
|
85
|
+
raise 'Stack did not reach a successful completion state.'
|
82
86
|
end
|
83
87
|
else
|
84
88
|
ui.warn 'Stack state polling has been disabled.'
|
data/lib/sfn/command/events.rb
CHANGED
@@ -26,7 +26,9 @@ module Sfn
|
|
26
26
|
events = get_events
|
27
27
|
row(:header => true) do
|
28
28
|
allowed_attributes.each do |attr|
|
29
|
-
|
29
|
+
width_val = events.map{|e| e[attr].to_s.length}.push(attr.length).max + 2
|
30
|
+
width_val = width_val > 70 ? 70 : width_val < 20 ? 20 : width_val
|
31
|
+
column attr.split('_').map(&:capitalize).join(' '), :width => width_val
|
30
32
|
end
|
31
33
|
end
|
32
34
|
events.each do |event|
|
data/lib/sfn/command/list.rb
CHANGED
@@ -13,8 +13,11 @@ module Sfn
|
|
13
13
|
table(:border => false) do
|
14
14
|
stacks = get_stacks
|
15
15
|
row(:header => true) do
|
16
|
+
|
16
17
|
allowed_attributes.each do |attr|
|
17
|
-
|
18
|
+
width_val = stacks.map{|e| e[attr].to_s.length}.push(attr.length).max + 2
|
19
|
+
width_val = width_val > 70 ? 70 : width_val < 20 ? 20 : width_val
|
20
|
+
column attr.split('_').map(&:capitalize).join(' '), :width => width_val
|
18
21
|
end
|
19
22
|
end
|
20
23
|
get_stacks.each do |stack|
|
data/lib/sfn/command/update.rb
CHANGED
@@ -106,7 +106,7 @@ module Sfn
|
|
106
106
|
|
107
107
|
if(config[:plan])
|
108
108
|
stack.parameters = original_parameters
|
109
|
-
plan =
|
109
|
+
plan = build_planner(stack)
|
110
110
|
if(plan)
|
111
111
|
result = plan.generate_plan(stack.template, config_root_parameters)
|
112
112
|
display_plan_information(result)
|
@@ -126,7 +126,7 @@ module Sfn
|
|
126
126
|
namespace.const_get(:Describe).new({:outputs => true}, [name]).execute!
|
127
127
|
else
|
128
128
|
ui.fatal "Update of stack #{ui.color(name, :bold)}: #{ui.color('FAILED', :red, :bold)}"
|
129
|
-
raise
|
129
|
+
raise 'Stack did not reach a successful update completion state.'
|
130
130
|
end
|
131
131
|
else
|
132
132
|
ui.warn 'Stack state polling has been disabled.'
|
@@ -146,9 +146,8 @@ module Sfn
|
|
146
146
|
|
147
147
|
def build_planner(stack)
|
148
148
|
klass_name = stack.api.class.to_s.split('::').last
|
149
|
-
|
150
|
-
|
151
|
-
klass.new(ui, config, arguments, stack)
|
149
|
+
if(Planner.const_defined?(klass_name))
|
150
|
+
Planner.const_get(klass_name).new(ui, config, arguments, stack)
|
152
151
|
else
|
153
152
|
warn "Failed to build planner for current provider. No provider implemented. (`#{klass_name}`)"
|
154
153
|
nil
|
@@ -168,7 +167,8 @@ module Sfn
|
|
168
167
|
said_any_things = false
|
169
168
|
unless(info[:stacks].empty?)
|
170
169
|
info[:stacks].each do |s_name, s_info|
|
171
|
-
|
170
|
+
result = print_plan_result(s_info, [*names, s_name].compact)
|
171
|
+
said_any_things ||= result
|
172
172
|
end
|
173
173
|
end
|
174
174
|
unless(names.flatten.compact.empty?)
|
@@ -29,9 +29,9 @@ module Sfn
|
|
29
29
|
)
|
30
30
|
result.connection.data[:stack_types] = (
|
31
31
|
[
|
32
|
-
result.connection.class.const_get(:RESOURCE_MAPPING).detect do |klass, info|
|
32
|
+
(result.connection.class.const_get(:RESOURCE_MAPPING).detect do |klass, info|
|
33
33
|
info[:api] == :orchestration
|
34
|
-
end.first
|
34
|
+
end || []).first
|
35
35
|
] + custom_stack_types
|
36
36
|
).compact.uniq
|
37
37
|
retry_config = config.fetch(:retry,
|
@@ -12,6 +12,10 @@ module Sfn
|
|
12
12
|
UNPACK_NAME_JOINER = '-sfn-'
|
13
13
|
# maximum number of attempts to get valid parameter value
|
14
14
|
MAX_PARAMETER_ATTEMPTS = 5
|
15
|
+
# Template parameter locations
|
16
|
+
TEMPLATE_PARAMETER_LOCATIONS = ['Parameters', 'parameters']
|
17
|
+
# Template parameter default value locations
|
18
|
+
TEMPLATE_PARAMETER_DEFAULTS = ['Default', 'defaultValue', 'default']
|
15
19
|
|
16
20
|
# Apply any defined remote stacks
|
17
21
|
#
|
@@ -120,7 +124,9 @@ module Sfn
|
|
120
124
|
stack_parameters = stack_parameters.nil? ? Smash.new : stack_parameters._dump
|
121
125
|
else
|
122
126
|
parameter_prefix = []
|
123
|
-
stack_parameters =
|
127
|
+
stack_parameters = TEMPLATE_PARAMETER_LOCATIONS.map do |loc_key|
|
128
|
+
sparkle[loc_key]
|
129
|
+
end.compact.first || Smash.new
|
124
130
|
end
|
125
131
|
unless(stack_parameters.empty?)
|
126
132
|
if(config.get(:parameter).is_a?(Array))
|
@@ -175,7 +181,7 @@ module Sfn
|
|
175
181
|
attempt += 1
|
176
182
|
default = config[:parameters].fetch(
|
177
183
|
ns_k, current_parameters.fetch(
|
178
|
-
k, v[
|
184
|
+
k, TEMPLATE_PARAMETER_DEFAULTS.map{|loc_key| v[loc_key]}.compact.first
|
179
185
|
)
|
180
186
|
)
|
181
187
|
if(config[:interactive_parameters])
|
@@ -90,7 +90,7 @@ module Sfn
|
|
90
90
|
begin
|
91
91
|
SparkleFormation::Sparkle.new(:name => sparkle_name)
|
92
92
|
rescue ArgumentError
|
93
|
-
ui.fatal "Failed to properly setup sparkle pack `#{
|
93
|
+
ui.fatal "Failed to properly setup sparkle pack `#{sparkle_name}`. Check implementation."
|
94
94
|
raise
|
95
95
|
end
|
96
96
|
end
|
@@ -236,34 +236,41 @@ module Sfn
|
|
236
236
|
def process_nested_stack_deep(sf, c_stack=nil)
|
237
237
|
sf.apply_nesting(:deep) do |stack_name, stack, resource|
|
238
238
|
run_callbacks_for(:template, :stack_name => stack_name, :sparkle_stack => stack)
|
239
|
-
|
239
|
+
|
240
240
|
stack_resource = resource._dump
|
241
241
|
|
242
242
|
if(stack.parent)
|
243
|
-
current_parameters = stack.parent.compile.
|
243
|
+
current_parameters = stack.parent.compile.resources.set!(stack_name).properties.parameters
|
244
|
+
current_parameters = current_parameters.nil? ? Smash.new : current_parameters._dump
|
244
245
|
else
|
245
246
|
current_parameters = Smash.new
|
246
247
|
end
|
247
248
|
current_stack = c_stack ? c_stack.nested_stacks.detect{|s| s.data[:logical_id] == stack_name} : nil
|
248
249
|
if(current_stack && current_stack.data[:parent_stack])
|
249
|
-
current_parameters.merge!(
|
250
|
+
current_parameters.merge!(
|
251
|
+
current_stack.data[:parent_stack].template.fetch(
|
252
|
+
'Resources', stack_name, 'Properties', 'Parameters', current_stack.data[:parent_stack].template.fetch(
|
253
|
+
'resources', stack_name, 'properties', 'parameters', Smash.new
|
254
|
+
)
|
255
|
+
)
|
256
|
+
)
|
250
257
|
end
|
251
|
-
full_stack_name =
|
258
|
+
full_stack_name = [
|
259
|
+
config[:nesting_prefix],
|
260
|
+
stack.root_path.map(&:name).map(&:to_s).join('_')
|
261
|
+
].compact.join('/')
|
252
262
|
unless(config[:print_only])
|
253
263
|
result = Smash.new(
|
254
|
-
|
264
|
+
:parameters => populate_parameters!(stack,
|
255
265
|
:stack => current_stack,
|
256
266
|
:current_parameters => current_parameters
|
257
267
|
)
|
258
268
|
)
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
info['Properties'].delete('Stack')
|
265
|
-
end
|
266
|
-
end
|
269
|
+
hold_stack = resource.properties.delete!(:stack)
|
270
|
+
stack_definition = stack.compile.dump!
|
271
|
+
|
272
|
+
if(config[:plan])
|
273
|
+
resource.properties.stack hold_stack
|
267
274
|
end
|
268
275
|
bucket = provider.connection.api_for(:storage).buckets.get(
|
269
276
|
config[:nesting_bucket]
|
@@ -276,21 +283,61 @@ module Sfn
|
|
276
283
|
file.content_type = 'text/json'
|
277
284
|
file.body = MultiJson.dump(Sfn::Utils::StackParameterScrubber.scrub!(stack_definition))
|
278
285
|
file.save
|
279
|
-
url = URI.parse(file.url)
|
280
286
|
result.merge!(
|
281
|
-
|
287
|
+
:url => file.url
|
282
288
|
)
|
283
289
|
else
|
284
290
|
result = Smash.new(
|
285
|
-
|
291
|
+
:url => "http://example.com/bucket/#{full_stack_name}.json"
|
286
292
|
)
|
287
293
|
end
|
288
|
-
result.each do |k,v|
|
294
|
+
format_nested_stack_results(resource._self.provider, result).each do |k,v|
|
289
295
|
resource.properties.set!(k, v)
|
290
296
|
end
|
291
297
|
end
|
292
298
|
end
|
293
299
|
|
300
|
+
# Update the nested stack information for specific provider
|
301
|
+
#
|
302
|
+
# @param provider [Symbol]
|
303
|
+
# @param results [Hash]
|
304
|
+
# @return [Hash]
|
305
|
+
def format_nested_stack_results(provider, results)
|
306
|
+
case provider
|
307
|
+
when :aws
|
308
|
+
if(results[:parameters])
|
309
|
+
results['Parameters'] = results.delete(:parameters)
|
310
|
+
end
|
311
|
+
if(results[:url])
|
312
|
+
url = URI.parse(results.delete(:url))
|
313
|
+
results['TemplateURL'] = "#{url.scheme}://#{url.host}#{url.path}"
|
314
|
+
end
|
315
|
+
results
|
316
|
+
when :heat, :rackspace
|
317
|
+
results[:template] = results.delete(:url)
|
318
|
+
results
|
319
|
+
when :azure
|
320
|
+
if(results[:parameters])
|
321
|
+
results[:parameters] = Smash[
|
322
|
+
results[:parameters].map do |key, value|
|
323
|
+
[key,
|
324
|
+
value.is_a?(Hash) ? value : Smash.new(:value => value)]
|
325
|
+
end
|
326
|
+
]
|
327
|
+
end
|
328
|
+
if(results[:url])
|
329
|
+
results[:templateLink] = Smash.new(
|
330
|
+
:uri => results.delete(:url),
|
331
|
+
:contentVersion => '1.0.0.0'
|
332
|
+
)
|
333
|
+
end
|
334
|
+
results[:mode] = 'Incremental'
|
335
|
+
results
|
336
|
+
else
|
337
|
+
raise "Unknown stack provider value given! `#{provider}`"
|
338
|
+
end
|
339
|
+
end
|
340
|
+
|
294
341
|
# Apply template translation
|
295
342
|
#
|
296
343
|
# @param template [Hash]
|
data/lib/sfn/config/validate.rb
CHANGED
@@ -55,6 +55,11 @@ module Sfn
|
|
55
55
|
:description => 'Bucket to use for storing nested stack templates',
|
56
56
|
:short_flag => 'N'
|
57
57
|
)
|
58
|
+
attribute(
|
59
|
+
:nesting_prefix, String,
|
60
|
+
:description => 'File name prefix for storing template in bucket',
|
61
|
+
:short_flag => 'Y'
|
62
|
+
)
|
58
63
|
attribute(
|
59
64
|
:print_only, [TrueClass, FalseClass],
|
60
65
|
:description => 'Print the resulting stack template',
|
@@ -18,7 +18,7 @@ module Sfn
|
|
18
18
|
def status_ends_with?(*args)
|
19
19
|
stat = status.to_s.downcase
|
20
20
|
!!args.map(&:to_s).map(&:downcase).detect do |suffix|
|
21
|
-
stat.end_with?(suffix)
|
21
|
+
stat.end_with?(suffix) || state.to_s.end_with?(suffix)
|
22
22
|
end
|
23
23
|
end
|
24
24
|
|
@@ -29,7 +29,7 @@ module Sfn
|
|
29
29
|
def status_starts_with?(*args)
|
30
30
|
stat = status.to_s.downcase
|
31
31
|
!!args.map(&:to_s).map(&:downcase).detect do |prefix|
|
32
|
-
stat.start_with?(prefix)
|
32
|
+
stat.start_with?(prefix) || state.to_s.start_with?(prefix)
|
33
33
|
end
|
34
34
|
end
|
35
35
|
|
data/lib/sfn/version.rb
CHANGED
data/sfn.gemspec
CHANGED
@@ -10,27 +10,16 @@ Gem::Specification.new do |s|
|
|
10
10
|
s.description = 'SparkleFormation CLI'
|
11
11
|
s.license = 'Apache-2.0'
|
12
12
|
s.require_path = 'lib'
|
13
|
-
s.
|
14
|
-
s.
|
15
|
-
s.
|
16
|
-
s.
|
17
|
-
s.
|
18
|
-
s.
|
13
|
+
s.add_runtime_dependency 'bogo-cli', '~> 0.1.21'
|
14
|
+
s.add_runtime_dependency 'miasma', '~> 0.2.27'
|
15
|
+
s.add_runtime_dependency 'miasma-aws', '~> 0.2.0'
|
16
|
+
s.add_runtime_dependency 'miasma-azure', '~> 0.1.0'
|
17
|
+
s.add_runtime_dependency 'net-ssh'
|
18
|
+
s.add_runtime_dependency 'sparkle_formation', '~> 2.0'
|
19
|
+
s.add_runtime_dependency 'hashdiff', '~> 0.2.2'
|
19
20
|
s.add_development_dependency 'rake'
|
20
21
|
s.add_development_dependency 'minitest'
|
21
22
|
s.add_development_dependency 'mocha'
|
22
23
|
s.executables << 'sfn'
|
23
24
|
s.files = Dir['{lib,bin,docs}/**/*'] + %w(sfn.gemspec README.md CHANGELOG.md LICENSE)
|
24
|
-
s.post_install_message = <<-EOF
|
25
|
-
|
26
|
-
This is an install of the sfn gem from the 1.0 release tree. If you
|
27
|
-
are upgrading from a pre-1.0 version, please review the CHANGELOG and
|
28
|
-
test your environment _before_ continuing on!
|
29
|
-
|
30
|
-
* https://github.com/sparkleformation/sfn/blob/master/CHANGELOG.md
|
31
|
-
|
32
|
-
Happy stacking!
|
33
|
-
|
34
|
-
EOF
|
35
|
-
|
36
25
|
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:
|
4
|
+
version: 2.0.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: 2016-01-
|
11
|
+
date: 2016-01-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bogo-cli
|
@@ -44,14 +44,28 @@ dependencies:
|
|
44
44
|
requirements:
|
45
45
|
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: 0.
|
47
|
+
version: 0.2.0
|
48
48
|
type: :runtime
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: 0.
|
54
|
+
version: 0.2.0
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: miasma-azure
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 0.1.0
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: 0.1.0
|
55
69
|
- !ruby/object:Gem::Dependency
|
56
70
|
name: net-ssh
|
57
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -72,14 +86,14 @@ dependencies:
|
|
72
86
|
requirements:
|
73
87
|
- - "~>"
|
74
88
|
- !ruby/object:Gem::Version
|
75
|
-
version: '
|
89
|
+
version: '2.0'
|
76
90
|
type: :runtime
|
77
91
|
prerelease: false
|
78
92
|
version_requirements: !ruby/object:Gem::Requirement
|
79
93
|
requirements:
|
80
94
|
- - "~>"
|
81
95
|
- !ruby/object:Gem::Version
|
82
|
-
version: '
|
96
|
+
version: '2.0'
|
83
97
|
- !ruby/object:Gem::Dependency
|
84
98
|
name: hashdiff
|
85
99
|
requirement: !ruby/object:Gem::Requirement
|
@@ -233,16 +247,7 @@ homepage: http://github.com/sparkleformation/sfn
|
|
233
247
|
licenses:
|
234
248
|
- Apache-2.0
|
235
249
|
metadata: {}
|
236
|
-
post_install_message:
|
237
|
-
|
238
|
-
This is an install of the sfn gem from the 1.0 release tree. If you
|
239
|
-
are upgrading from a pre-1.0 version, please review the CHANGELOG and
|
240
|
-
test your environment _before_ continuing on!
|
241
|
-
|
242
|
-
* https://github.com/sparkleformation/sfn/blob/master/CHANGELOG.md
|
243
|
-
|
244
|
-
Happy stacking!
|
245
|
-
|
250
|
+
post_install_message:
|
246
251
|
rdoc_options: []
|
247
252
|
require_paths:
|
248
253
|
- lib
|