sfn 2.0.0 → 2.0.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 1d4a0525d2165a404b2a131f9b1edb470fd2b5b3
4
- data.tar.gz: c6640282596fb6f2770b05a3dd8e7a60f6e26312
3
+ metadata.gz: 9a4ad3f22ad49a059e19e7573ead7e8009934564
4
+ data.tar.gz: d144714e3d5428c9d2955a1a87a7268055435768
5
5
  SHA512:
6
- metadata.gz: 3e30c1d2a4470fe271c4bcd6a8dc6affe57fd9d101b68bb19a27ce604f8b54c5515879a1b231c3e8504da639a347504b0c46ba5faa6f23624233840d86ae547e
7
- data.tar.gz: 95995a16cc8cb71cae4dc732a9b13833d1c9e16b7d0a55a78e2c2fd660c7668de86c7ecdd1366f961e497e138d2371abae75c0a827fa4d89584fdae33d30a70f
6
+ metadata.gz: ac2e1b2f887e4608cb4e137c5f61f203b5cd2fff885284a7efd97b8d5a2929e8d19f28259a41f1691080033c378b5891b792957725ecce4b540b36d0e7fe36f9
7
+ data.tar.gz: c3c7c73efd1e4e65a8671abacb4fd1b1be0d38661b1bd28dc990c1954702b4d4864a233e59b24a4be63941278b5ecb61615e8e157e18137595e637e62a282a1d
data/CHANGELOG.md CHANGED
@@ -1,3 +1,10 @@
1
+ # v2.0.2
2
+ * [task] Remove deprecated capabilities flag (#106)
3
+ * [feature] Add `init` command for project initialization (#107)
4
+ * [enhancement] Add `debug` config option to enable UI debug output (#108)
5
+ * [fix] Fix hash type coerce of strings provided via CLI (#109)
6
+ * [enhancement] Support template parameter processing for supported providers (#110)
7
+
1
8
  # v2.0.0
2
9
  * [enhancement] Move to SparkleFormation 2.0
3
10
  * [enhancement] Add more credential content to configuration file generator
data/bin/sfn CHANGED
@@ -4,7 +4,11 @@ require 'bogo-cli'
4
4
  require 'sfn'
5
5
 
6
6
  if(defined?(Bundler))
7
- Bundler.require
7
+ begin
8
+ Bundler.require
9
+ rescue Bundler::GemfileNotFound
10
+ # ignore load error
11
+ end
8
12
  end
9
13
 
10
14
  Bogo::Cli::Setup.define do
data/lib/sfn/command.rb CHANGED
@@ -14,6 +14,7 @@ module Sfn
14
14
  autoload :Events, 'sfn/command/events'
15
15
  autoload :Export, 'sfn/command/export'
16
16
  autoload :Import, 'sfn/command/import'
17
+ autoload :Init, 'sfn/command/init'
17
18
  autoload :Inspect, 'sfn/command/inspect'
18
19
  autoload :List, 'sfn/command/list'
19
20
  autoload :Print, 'sfn/command/print'
@@ -0,0 +1,57 @@
1
+ require 'sfn'
2
+ require 'fileutils'
3
+
4
+ module Sfn
5
+ class Command
6
+ # Init command
7
+ class Init < Command
8
+
9
+ include Sfn::CommandModule::Base
10
+
11
+ INIT_DIRECTORIES = [
12
+ 'sparkleformation/dynamics',
13
+ 'sparkleformation/components',
14
+ 'sparkleformation/registry'
15
+ ]
16
+
17
+ # Run the init command to initialize new project
18
+ def execute!
19
+ unless(name_args.size == 1)
20
+ raise ArgumentError.new 'Please provide path argument only for project initialization'
21
+ else
22
+ path = name_args.first
23
+ end
24
+ if(File.file?(path))
25
+ raise "Cannot create project directory. Given path is a file. (`#{path}`)"
26
+ end
27
+ if(File.directory?(path))
28
+ ui.warn "Project directory already exists at given path. (`#{path}`)"
29
+ ui.confirm 'Overwrite existing files?'
30
+ end
31
+ run_action 'Creating base project directories' do
32
+ INIT_DIRECTORIES.each do |new_dir|
33
+ FileUtils.mkdir_p(File.join(path, new_dir))
34
+ end
35
+ nil
36
+ end
37
+ run_action 'Creating project bundle' do
38
+ File.open(File.join(path, 'Gemfile'), 'w') do |file|
39
+ file.puts "source 'https://rubygems.org'\n\ngem 'sfn'"
40
+ end
41
+ nil
42
+ end
43
+ ui.info 'Generating .sfn configuration file'
44
+ Dir.chdir(path) do
45
+ Conf.new({:generate => true}, []).execute!
46
+ end
47
+ ui.info 'Installing project bundle'
48
+ Dir.chdir(path) do
49
+ Bundler.clean_system('bundle install')
50
+ end
51
+ ui.info 'Project initialization complete!'
52
+ ui.puts " Project path -> #{File.expand_path(path)}"
53
+ end
54
+
55
+ end
56
+ end
57
+ end
@@ -55,9 +55,9 @@ module Sfn
55
55
  # @param e [Exception]
56
56
  # @param args [String] extra strings to output
57
57
  def _debug(e, *args)
58
- if(config[:verbose])
58
+ if(config[:verbose] || config[:debug])
59
59
  ui.fatal "Exception information: #{e.class}: #{e.message}"
60
- if(ENV['DEBUG'])
60
+ if(ENV['DEBUG'] || config[:debug])
61
61
  puts "#{e.backtrace.join("\n")}\n"
62
62
  if(e.is_a?(Miasma::Error::ApiError))
63
63
  ui.fatal "Response body: #{e.response.body.to_s.inspect}"
@@ -276,7 +276,7 @@ module Sfn
276
276
  config[:nesting_bucket]
277
277
  )
278
278
  unless(bucket)
279
- raise "Failed to locate configured bucket for stack template storage (#{bucket})!"
279
+ raise "Failed to locate configured bucket for stack template storage (#{config[:nesting_bucket]})!"
280
280
  end
281
281
  file = bucket.files.build
282
282
  file.name = "#{full_stack_name}.json"
data/lib/sfn/config.rb CHANGED
@@ -19,7 +19,11 @@ module Sfn
19
19
  info[:coerce] = lambda do |v|
20
20
  case v
21
21
  when String
22
- Smash[v.split(',').map{|x| v.split(/[=:]/, 2)}]
22
+ Smash[
23
+ v.split(',').map do |item_pair|
24
+ item_pair.split(/[=:]/, 2)
25
+ end
26
+ ]
23
27
  when Hash
24
28
  v.to_smash
25
29
  else
@@ -45,6 +49,7 @@ module Sfn
45
49
  autoload :Events, 'sfn/config/events'
46
50
  autoload :Export, 'sfn/config/export'
47
51
  autoload :Import, 'sfn/config/import'
52
+ autoload :Init, 'sfn/config/init'
48
53
  autoload :Inspect, 'sfn/config/inspect'
49
54
  autoload :List, 'sfn/config/list'
50
55
  autoload :Print, 'sfn/config/print'
@@ -91,6 +96,11 @@ module Sfn
91
96
  :description => 'Automatically accept any requests for confirmation',
92
97
  :short_flag => 'y'
93
98
  )
99
+ attribute(
100
+ :debug, [TrueClass, FalseClass],
101
+ :description => 'Enable debug output',
102
+ :short_flag => 'u'
103
+ )
94
104
 
95
105
  attribute :conf, Conf, :coerce => proc{|v| Conf.new(v)}
96
106
  attribute :create, Create, :coerce => proc{|v| Create.new(v)}
@@ -16,12 +16,6 @@ module Sfn
16
16
  :description => 'Rollback stack on failure',
17
17
  :short_flag => 'O'
18
18
  )
19
- attribute(
20
- :capabilities, String,
21
- :multiple => true,
22
- :description => 'Capabilities to allow the stack',
23
- :short_flag => 'B'
24
- )
25
19
  attribute(
26
20
  :options, Smash,
27
21
  :description => 'Extra options to apply to the API call',
@@ -0,0 +1,10 @@
1
+ require 'sfn'
2
+
3
+ module Sfn
4
+ class Config
5
+ # Init command configuration
6
+ class Init < Config
7
+
8
+ end
9
+ end
10
+ end
@@ -10,7 +10,9 @@ module Sfn
10
10
  #
11
11
  # @param msg [String]
12
12
  def debug(msg)
13
- puts "<SparkleFormation>: #{msg}" if ENV['DEBUG']
13
+ if(ENV['DEBUG'] || (respond_to?(:config) && config[:debug]))
14
+ puts "<sfn - debug>: #{msg}"
15
+ end
14
16
  end
15
17
  end
16
18
 
@@ -9,6 +9,31 @@ module Sfn
9
9
 
10
10
  include Bogo::AnimalStrings
11
11
 
12
+ # HOT parameter mapping
13
+ HEAT_CONSTRAINT_MAP = {
14
+ 'MaxLength' => [:length, :max],
15
+ 'MinLength' => [:length, :min],
16
+ 'MaxValue' => [:range, :max],
17
+ 'MinValue' => [:range, :min],
18
+ 'AllowedValues' => [:allowed_values],
19
+ 'AllowedPattern' => [:allowed_pattern]
20
+ }
21
+
22
+ # Parameter mapping identifier and content
23
+ PARAMETER_DEFINITION_MAP = {
24
+ 'constraints' => HEAT_CONSTRAINT_MAP
25
+ }
26
+
27
+ # Supported parameter validations
28
+ PARAMETER_VALIDATIONS = [
29
+ 'allowed_values',
30
+ 'allowed_pattern',
31
+ 'max_length',
32
+ 'min_length',
33
+ 'max_value',
34
+ 'min_value'
35
+ ]
36
+
12
37
  # Validate a parameters
13
38
  #
14
39
  # @param value [Object] value for parameter
@@ -22,10 +47,14 @@ module Sfn
22
47
  # @return [TrueClass, Array<String>] true if valid. array of string errors if invalid
23
48
  def validate(value, parameter_definition)
24
49
  return [[:blank, 'Value cannot be blank']] if value.to_s.strip.empty?
25
- result = %w(AllowedValues AllowedPattern MaxLength MinLength MaxValue MinValue).map do |key|
26
- if(parameter_definition[key])
27
- res = self.send(snake(key), value, parameter_definition)
28
- res == true ? true : [snake(key), res]
50
+ parameter_definition = reformat_definition(parameter_definition)
51
+ result = PARAMETER_VALIDATIONS.map do |validator_key|
52
+ valid_key = parameter_definition.keys.detect do |pdef_key|
53
+ pdef_key.downcase.gsub('_', '') == validator_key.downcase.gsub('_', '')
54
+ end
55
+ if(valid_key)
56
+ res = self.send(validator_key, value, parameter_definition[valid_key])
57
+ res == true ? true : [validator_key, res]
29
58
  else
30
59
  true
31
60
  end
@@ -34,6 +63,27 @@ module Sfn
34
63
  result.empty? ? true : result
35
64
  end
36
65
 
66
+ # Reformat parameter definition with proper keys to allow
67
+ # validation for templates different parameter definition
68
+ # layout
69
+ #
70
+ # @param pdef [Hash]
71
+ # @return [Hash]
72
+ def reformat_definition(pdef)
73
+ new_def = pdef
74
+ PARAMETER_DEFINITION_MAP.each do |ident, mapping|
75
+ if(pdef[ident])
76
+ new_def = Smash.new
77
+ mapping.each do |new_key, current_path|
78
+ if(pdef.get(*current_path))
79
+ new_def[new_key] = pdef.get(*current_path)
80
+ end
81
+ end
82
+ end
83
+ end
84
+ new_def
85
+ end
86
+
37
87
  # Parameter is within allowed values
38
88
  #
39
89
  # @param value [String]
@@ -41,10 +91,10 @@ module Sfn
41
91
  # @option pdef [Array<String>] 'AllowedValues'
42
92
  # @return [TrueClass, String]
43
93
  def allowed_values(value, pdef)
44
- if(pdef['AllowedValues'].include?(value))
94
+ if(pdef.include?(value))
45
95
  true
46
96
  else
47
- "Not an allowed value: #{pdef['AllowedValues'].join(', ')}"
97
+ "Not an allowed value: #{pdef.join(', ')}"
48
98
  end
49
99
  end
50
100
 
@@ -55,10 +105,10 @@ module Sfn
55
105
  # @option pdef [String] 'AllowedPattern'
56
106
  # @return [TrueClass, String]
57
107
  def allowed_pattern(value, pdef)
58
- if(value.match(/#{pdef['AllowedPattern']}/))
108
+ if(value.match(/#{pdef}/))
59
109
  true
60
110
  else
61
- "Not a valid pattern. Must match: #{pdef['AllowedPattern']}"
111
+ "Not a valid pattern. Must match: #{pdef}"
62
112
  end
63
113
  end
64
114
 
@@ -69,10 +119,10 @@ module Sfn
69
119
  # @option pdef [String] 'MaxLength'
70
120
  # @return [TrueClass, String]
71
121
  def max_length(value, pdef)
72
- if(value.length <= pdef['MaxLength'].to_i)
122
+ if(value.length <= pdef.to_i)
73
123
  true
74
124
  else
75
- "Value must not exceed #{pdef['MaxLength']} characters"
125
+ "Value must not exceed #{pdef} characters"
76
126
  end
77
127
  end
78
128
 
@@ -83,10 +133,10 @@ module Sfn
83
133
  # @option pdef [String] 'MinLength'
84
134
  # @return [TrueClass, String]
85
135
  def min_length(value, pdef)
86
- if(value.length >= pdef['MinLength'].to_i)
136
+ if(value.length >= pdef.to_i)
87
137
  true
88
138
  else
89
- "Value must be at least #{pdef['MinLength']} characters"
139
+ "Value must be at least #{pdef} characters"
90
140
  end
91
141
  end
92
142
 
@@ -97,10 +147,10 @@ module Sfn
97
147
  # @option pdef [String] 'MaxValue'
98
148
  # @return [TrueClass, String]
99
149
  def max_value(value, pdef)
100
- if(value.to_i <= pdef['MaxValue'].to_i)
150
+ if(value.to_i <= pdef.to_i)
101
151
  true
102
152
  else
103
- "Value must not be greater than #{pdef['MaxValue']}"
153
+ "Value must not be greater than #{pdef}"
104
154
  end
105
155
  end
106
156
 
@@ -111,10 +161,10 @@ module Sfn
111
161
  # @option pdef [String] 'MinValue'
112
162
  # @return [TrueClass, String]
113
163
  def min_value(value, pdef)
114
- if(value.to_i >= pdef['MinValue'].to_i)
164
+ if(value.to_i >= pdef.to_i)
115
165
  true
116
166
  else
117
- "Value must not be less than #{pdef['MinValue']}"
167
+ "Value must not be less than #{pdef}"
118
168
  end
119
169
  end
120
170
 
data/lib/sfn/version.rb CHANGED
@@ -1,4 +1,4 @@
1
1
  module Sfn
2
2
  # Current library version
3
- VERSION = Gem::Version.new('2.0.0')
3
+ VERSION = Gem::Version.new('2.0.2')
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: 2.0.0
4
+ version: 2.0.2
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-21 00:00:00.000000000 Z
11
+ date: 2016-01-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bogo-cli
@@ -200,6 +200,7 @@ files:
200
200
  - lib/sfn/command/events.rb
201
201
  - lib/sfn/command/export.rb
202
202
  - lib/sfn/command/import.rb
203
+ - lib/sfn/command/init.rb
203
204
  - lib/sfn/command/inspect.rb
204
205
  - lib/sfn/command/list.rb
205
206
  - lib/sfn/command/print.rb
@@ -220,6 +221,7 @@ files:
220
221
  - lib/sfn/config/events.rb
221
222
  - lib/sfn/config/export.rb
222
223
  - lib/sfn/config/import.rb
224
+ - lib/sfn/config/init.rb
223
225
  - lib/sfn/config/inspect.rb
224
226
  - lib/sfn/config/list.rb
225
227
  - lib/sfn/config/print.rb