sfn 0.4.16 → 0.5.0

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: 2e01bd41a7a02da35f2e1853b96a453167575d3f
4
- data.tar.gz: 4294048c2a9b5c6e6d5d1f9e418bcd9a7583b3fc
3
+ metadata.gz: 3673b71af607d02ac346e2419e0f3ee10d29e7fb
4
+ data.tar.gz: 43fd1549a7deed286de8a4c59b9c1b3148700d3e
5
5
  SHA512:
6
- metadata.gz: e808235ef5cd02355b6e09375ba07d380f69b18278dce72b234e5444c04e7e54976e2be5e3bd81e2fbc9ddf0c9228af3e30d06c83311598cf6cdbb3daacdddc8
7
- data.tar.gz: 89a2fff39baa4eb5158d964486f948f3491bd3148796fd2935e656ec732fe909d1e4d6ab6ef0277a981866f16acda7904f8ed829b85e15ea16c20fe63813d7b9
6
+ metadata.gz: 3e47a279dc5d53e18674281d2371f0cd72539dd797d2a0e0276813125acc8118ee5087e96278b2bdf960f42147fda969bf1ab855c4b1b5b5f7532a6d85e62e46
7
+ data.tar.gz: 28ab80f21ef727f319a7c5c3ac685ced8f33c7fadcc5e680b444812957734c49cf13e30d27e18d0944004d91d5065e79b71c9135dbb6df58d6f7f075fa8bc090
@@ -1,3 +1,6 @@
1
+ ## v0.5.0
2
+ * Add support for compile time parameters
3
+
1
4
  ## v0.4.16
2
5
  * Fix apply stack on update command when template provides new parameters
3
6
 
@@ -18,8 +18,34 @@ module Sfn
18
18
  end
19
19
 
20
20
  stack_info = "#{ui.color('Name:', :bold)} #{name}"
21
+ stack = provider.connection.stacks.get(name)
22
+
23
+ config[:compile_parameters] ||= Smash.new
21
24
 
22
25
  if(config[:file])
26
+ s_name = [name]
27
+ c_setter = lambda do |c_stack|
28
+ compile_params = c_stack.outputs.detect do |output|
29
+ output.key == 'CompileState'
30
+ end
31
+ if(compile_params)
32
+ compile_params = MultiJson.load(compile_params.value)
33
+ c_current = config[:compile_parameters].fetch(s_name.join('_'), Smash.new)
34
+ config[:compile_parameters][s_name.join('_')] = compile_params.merge(c_current)
35
+ end
36
+ end
37
+
38
+ if(stack)
39
+ c_setter.call(stack)
40
+ stack.resources.all.each do |s_resource|
41
+ if(s_resource.type == 'AWS::CloudFormation::Stack')
42
+ s_name.push(s_resource.logical_id)
43
+ c_setter.call(s_resource.expand)
44
+ s_name.pop
45
+ end
46
+ end
47
+ end
48
+
23
49
  file = load_template_file
24
50
  stack_info << " #{ui.color('Path:', :bold)} #{config[:file]}"
25
51
  nested_stacks = file.delete('sfn_nested_stack')
@@ -61,7 +87,7 @@ module Sfn
61
87
  begin
62
88
  stack.save
63
89
  rescue Miasma::Error::ApiError::RequestError => e
64
- if(e.message.downcase.include?('no updates')) # :'(
90
+ if(e.message.downcase.include?('no updates'))
65
91
  ui.warn "No updates detected for stack (#{stack.name})"
66
92
  else
67
93
  raise
@@ -10,9 +10,73 @@ module Sfn
10
10
 
11
11
  # cloudformation directories that should be ignored
12
12
  TEMPLATE_IGNORE_DIRECTORIES = %w(components dynamics registry)
13
+ # maximum number of attempts to get valid parameter value
14
+ MAX_PARAMETER_ATTEMPTS = 5
13
15
 
14
16
  module InstanceMethods
15
17
 
18
+ # Request compile time parameter value
19
+ #
20
+ # @param p_name [String, Symbol] name of parameter
21
+ # @param p_config [Hash] parameter meta information
22
+ # @param cur_val [Object, NilClass] current value assigned to parameter
23
+ # @param nested [TrueClass, FalseClass] template is nested
24
+ # @option p_config [String, Symbol] :type
25
+ # @option p_config [String, Symbol] :default
26
+ # @option p_config [String, Symbol] :description
27
+ # @option p_config [String, Symbol] :multiple
28
+ # @return [Object]
29
+ def request_compile_parameter(p_name, p_config, cur_val, nested=false)
30
+ result = nil
31
+ attempts = 0
32
+ unless(cur_val || p_config[:default].nil?)
33
+ cur_val = p_config[:default]
34
+ end
35
+ if(cur_val.is_a?(Array))
36
+ cur_val = cur_val.map(&:to_s).join(',')
37
+ end
38
+ until(result && (!result.respond_to?(:empty?) || !result.empty?))
39
+ attempts += 1
40
+ if(config[:interactive_parameters] && (!nested || !p_config.key?(:prompt_when_nested) || p_config[:prompt_when_nested] == true))
41
+ result = ui.ask_question(
42
+ p_name.to_s.split('_').map(&:capitalize).join,
43
+ :default => cur_val.to_s.empty? ? nil : cur_val.to_s
44
+ )
45
+ else
46
+ result = cur_val.to_s
47
+ end
48
+ case p_config.fetch(:type, 'string').to_s.downcase.to_sym
49
+ when :string
50
+ if(p_config[:multiple])
51
+ result = result.split(',').map(&:strip)
52
+ end
53
+ when :number
54
+ if(p_config[:multiple])
55
+ result = result.split(',').map(&:strip)
56
+ new_result = result.map do |item|
57
+ new_item = item.to_i
58
+ new_item if new_item.to_s == item
59
+ end
60
+ result = new_result.size == result.size ? new_result : []
61
+ else
62
+ new_result = result.to_i
63
+ result = new_result.to_s == result ? new_result : nil
64
+ end
65
+ else
66
+ raise ArgumentError.new "Unknown compile time parameter type provided: `#{p_config[:type].inspect}` (Parameter: #{p_name})"
67
+ end
68
+ if(result.nil? || (result.respond_to?(:empty?) && result.empty?))
69
+ if(attempts > MAX_PARAMETER_ATTEMPTS)
70
+ ui.fatal 'Failed to receive allowed parameter!'
71
+ exit 1
72
+ else
73
+ ui.error "Invalid value provided for parameter. Must be type: `#{p_config[:type].to_s.capitalize}`"
74
+ end
75
+ end
76
+ end
77
+ result
78
+ end
79
+
16
80
  # Load the template file
17
81
  #
18
82
  # @param args [Symbol] options (:allow_missing)
@@ -31,18 +95,41 @@ module Sfn
31
95
  config[:template]
32
96
  elsif(config[:file])
33
97
  if(config[:processing])
98
+ compile_state = config.fetch(:compile_parameters, Smash.new)
34
99
  sf = SparkleFormation.compile(config[:file], :sparkle)
100
+ if(name_args.first)
101
+ sf.name = name_args.first
102
+ end
103
+ sf.compile_time_parameter_setter do |formation|
104
+ f_name = []
105
+ f_form = formation
106
+ while(f_form)
107
+ f_name.push f_form.name
108
+ f_form = f_form.parent
109
+ end
110
+ f_name = f_name.reverse.map(&:to_s).join('_')
111
+ current_state = compile_state.fetch(f_name, Smash.new)
112
+ if(formation.compile_state)
113
+ current_state = current_state.merge(formation.compile_state)
114
+ end
115
+ ui.info "#{ui.color('Compile time parameters:', :bold)} - template: #{ui.color(formation.name, :green, :bold)}"
116
+ formation.parameters.each do |k,v|
117
+ current_state[k] = request_compile_parameter(k, v, current_state[k], !!formation.parent)
118
+ end
119
+ formation.compile_state = current_state
120
+ end
35
121
  if(sf.nested? && !sf.isolated_nests?)
36
122
  raise TypeError.new('Template does not contain isolated stack nesting! Cannot process in existing state.')
37
123
  end
38
124
  if(sf.nested? && config[:apply_nesting])
39
125
  sf.apply_nesting do |stack_name, stack_definition|
40
- bucket = provider.connection.api_for(:storage).buckets.get(
41
- config[:nesting_bucket]
42
- )
43
126
  if(config[:print_only])
44
- "http://example.com/bucket/#{name_args.first}_#{stack_name}.json"
127
+ # "http://example.com/bucket/#{name_args.first}_#{stack_name}.json"
128
+ stack_definition
45
129
  else
130
+ bucket = provider.connection.api_for(:storage).buckets.get(
131
+ config[:nesting_bucket]
132
+ )
46
133
  unless(bucket)
47
134
  raise "Failed to locate configured bucket for stack template storage (#{bucket})!"
48
135
  end
@@ -1,4 +1,4 @@
1
1
  module Sfn
2
2
  # Current library version
3
- VERSION = Gem::Version.new('0.4.16')
3
+ VERSION = Gem::Version.new('0.5.0')
4
4
  end
@@ -14,7 +14,7 @@ Gem::Specification.new do |s|
14
14
  s.add_dependency 'miasma', '~> 0.2.20'
15
15
  s.add_dependency 'miasma-aws', '~> 0.1.16'
16
16
  s.add_dependency 'net-ssh'
17
- s.add_dependency 'sparkle_formation', '>= 0.2.8', '< 1.0'
17
+ s.add_dependency 'sparkle_formation', '>= 0.4.0', '< 1.0'
18
18
  s.executables << 'sfn'
19
19
  s.files = Dir['{lib,bin}/**/*'] + %w(sfn.gemspec README.md CHANGELOG.md LICENSE)
20
20
  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: 0.4.16
4
+ version: 0.5.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-09-30 00:00:00.000000000 Z
11
+ date: 2015-10-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bogo-cli
@@ -72,7 +72,7 @@ dependencies:
72
72
  requirements:
73
73
  - - ">="
74
74
  - !ruby/object:Gem::Version
75
- version: 0.2.8
75
+ version: 0.4.0
76
76
  - - "<"
77
77
  - !ruby/object:Gem::Version
78
78
  version: '1.0'
@@ -82,7 +82,7 @@ dependencies:
82
82
  requirements:
83
83
  - - ">="
84
84
  - !ruby/object:Gem::Version
85
- version: 0.2.8
85
+ version: 0.4.0
86
86
  - - "<"
87
87
  - !ruby/object:Gem::Version
88
88
  version: '1.0'
@@ -174,9 +174,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
174
174
  version: '0'
175
175
  requirements: []
176
176
  rubyforge_project:
177
- rubygems_version: 2.2.2
177
+ rubygems_version: 2.4.8
178
178
  signing_key:
179
179
  specification_version: 4
180
180
  summary: SparkleFormation CLI
181
181
  test_files: []
182
- has_rdoc: