sfn 1.2.0 → 2.0.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: eb52f9ec870e82eaf0e32aaba64f4c4ea05badf8
4
- data.tar.gz: 54939ef76128913964444beb09d72d8c4c4b1447
3
+ metadata.gz: 1d4a0525d2165a404b2a131f9b1edb470fd2b5b3
4
+ data.tar.gz: c6640282596fb6f2770b05a3dd8e7a60f6e26312
5
5
  SHA512:
6
- metadata.gz: 6727eeb62882084fab9f4207f2ccea58160155a16410c6051ff1970e35a70702af087020c972c1c5d40941a5c5917a4fe0b3f5e8351f11aa70574b85ba1d830e
7
- data.tar.gz: c7390a1b826f92b231e0b2d6df9f97258a9381824d5e6826d58496ee5044b7c5e9d322f77da7f8c0e878c98ffcfb72c888ef73186826453ad8419628823832ca
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
@@ -3,6 +3,10 @@
3
3
  require 'bogo-cli'
4
4
  require 'sfn'
5
5
 
6
+ if(defined?(Bundler))
7
+ Bundler.require
8
+ end
9
+
6
10
  Bogo::Cli::Setup.define do
7
11
 
8
12
  on :v, :version, 'Print version ' do
@@ -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
@@ -1,6 +1,7 @@
1
1
  require 'sfn/version'
2
2
  require 'miasma'
3
3
  require 'bogo'
4
+ require 'sparkle_formation'
4
5
 
5
6
  module Sfn
6
7
 
@@ -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
@@ -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.'
@@ -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
- column attr.split('_').map(&:capitalize).join(' '), :width => ((val = events.map{|e| e[attr].to_s.length}.push(attr.length).max + 2) > 70 ? 70 : val)
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|
@@ -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
- column attr.split('_').map(&:capitalize).join(' '), :width => (stacks.map{|s| s[attr].to_s.length}.max || 20) + 2
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|
@@ -106,7 +106,7 @@ module Sfn
106
106
 
107
107
  if(config[:plan])
108
108
  stack.parameters = original_parameters
109
- plan = Planner::Aws.new(ui, config, arguments, stack)
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
- klass = Planner.const_get(klass_name)
150
- if(klass)
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
- said_any_things ||= print_plan_result(s_info, [*names, s_name].compact)
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 = sparkle.fetch('Parameters', Smash.new)
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['Default']
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 `#{sparkle_pack}`. Check implementation."
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
- stack_definition = stack.compile.dump!
239
+
240
240
  stack_resource = resource._dump
241
241
 
242
242
  if(stack.parent)
243
- current_parameters = stack.parent.compile.dump!.to_smash.fetch('Resources', stack_name, 'Properties', 'Parameters', Smash.new)
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!(current_stack.data[:parent_stack].template.fetch('Resources', stack_name, 'Properties', 'Parameters', Smash.new))
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 = stack.root_path.map(&:name).map(&:to_s).join('_')
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
- 'Parameters' => populate_parameters!(stack,
264
+ :parameters => populate_parameters!(stack,
255
265
  :stack => current_stack,
256
266
  :current_parameters => current_parameters
257
267
  )
258
268
  )
259
- unless(config[:plan])
260
- resource.properties.delete!(:stack)
261
- else
262
- (stack_definition['Resources'] || {}).each do |_, info|
263
- if(valid_stack_types.include?(info['Type']))
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
- 'TemplateURL' => "#{url.scheme}://#{url.host}#{url.path}"
287
+ :url => file.url
282
288
  )
283
289
  else
284
290
  result = Smash.new(
285
- 'TemplateURL' => "http://example.com/bucket/#{full_stack_name}.json"
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]
@@ -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
@@ -1,4 +1,4 @@
1
1
  module Sfn
2
2
  # Current library version
3
- VERSION = Gem::Version.new('1.2.0')
3
+ VERSION = Gem::Version.new('2.0.0')
4
4
  end
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.add_dependency 'bogo-cli', '~> 0.1.21'
14
- s.add_dependency 'miasma', '~> 0.2.27'
15
- s.add_dependency 'miasma-aws', '~> 0.1.16'
16
- s.add_dependency 'net-ssh'
17
- s.add_dependency 'sparkle_formation', '~> 1.1'
18
- s.add_dependency 'hashdiff', '~> 0.2.2'
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: 1.2.0
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-05 00:00:00.000000000 Z
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.1.16
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.1.16
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: '1.1'
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: '1.1'
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: |2+
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