sfn-parameters 0.2.4 → 0.2.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/CHANGELOG.md +4 -0
- data/README.md +8 -1
- data/lib/sfn-parameters/command.rb +54 -65
- data/lib/sfn-parameters/infrastructure.rb +19 -19
- data/lib/sfn-parameters/stacks.rb +6 -7
- data/lib/sfn-parameters/version.rb +1 -1
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 6402872602c46b70bbb1ce840268256a6a8c7a1e097093478603e5926a907c48
|
4
|
+
data.tar.gz: e49e01025280eedd43e763a4f0069c4df68b468ebfb75a540a672917aa6befba
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 885f6c47c742135a80f27f81d761def19675ecf12411b58f490fb627f2ee4378be903ef04c95ddb9e59ae2accc3283bc915ce98de0636c063d100526093d4675
|
7
|
+
data.tar.gz: 3b341192e654d45aeac09a8221096ece01b76db70e02e7ae342f0ebc5e4adaa9780341c835f713cfc6ac4023b68908487e1cd3a42283d5c52a0f75eee1f95178
|
data/CHANGELOG.md
CHANGED
data/README.md
CHANGED
@@ -174,7 +174,8 @@ library. This allows defining the file in a serialization format
|
|
174
174
|
### Encryption
|
175
175
|
|
176
176
|
This callback also supports encrypting stack parameter information for storage. The callback
|
177
|
-
adds a `parameters` command for handling encryption/decryption.
|
177
|
+
adds a `parameters` command for handling encryption/decryption. Encryption is currently only
|
178
|
+
supported when using JSON format parameter files.
|
178
179
|
|
179
180
|
#### Configuration
|
180
181
|
|
@@ -235,6 +236,12 @@ $ sfn parameters lock my-test-stack
|
|
235
236
|
$ sfn parameters unlock my-test-stack
|
236
237
|
~~~
|
237
238
|
|
239
|
+
##### Show existing values (as JSON)
|
240
|
+
|
241
|
+
~~~
|
242
|
+
$ sfn parameters show my-test-stack
|
243
|
+
~~~
|
244
|
+
|
238
245
|
_NOTE: Full paths can also be used when defining parameters file._
|
239
246
|
|
240
247
|
# Info
|
@@ -1,10 +1,9 @@
|
|
1
|
-
require
|
1
|
+
require "sfn-parameters"
|
2
2
|
|
3
3
|
module Sfn
|
4
4
|
class Command
|
5
5
|
# Parameters command
|
6
6
|
class Parameters < Command
|
7
|
-
|
8
7
|
include SfnParameters::Utils
|
9
8
|
include Sfn::CommandModule::Base
|
10
9
|
|
@@ -13,21 +12,21 @@ module Sfn
|
|
13
12
|
:parameters => {},
|
14
13
|
:compile_parameters => {},
|
15
14
|
:apply_stacks => [],
|
16
|
-
:stacks => {}
|
15
|
+
:stacks => {},
|
17
16
|
)
|
18
17
|
|
19
18
|
# Execute parameters action request
|
20
19
|
def execute!
|
21
20
|
action, item = arguments[0].to_s, arguments[1].to_s
|
22
21
|
ui.info "Running parameters action #{ui.color(action.to_s, :bold)}"
|
23
|
-
if
|
22
|
+
if respond_to?("run_action_#{action}")
|
24
23
|
send("run_action_#{action}", item)
|
25
24
|
else
|
26
25
|
allowed_actions = public_methods.grep(/^run_action/).sort.map do |item|
|
27
|
-
item.to_s.sub(
|
26
|
+
item.to_s.sub("run_action_", "")
|
28
27
|
end
|
29
28
|
raise ArgumentError.new "Unsupported action received `#{action}`. " \
|
30
|
-
|
29
|
+
"Allowed: #{allowed_actions.join(", ")}"
|
31
30
|
end
|
32
31
|
end
|
33
32
|
|
@@ -38,14 +37,14 @@ module Sfn
|
|
38
37
|
item = validate_item(item)
|
39
38
|
ui.print " Locking #{ui.color(item, :bold)}... "
|
40
39
|
content = load_json(File.read(item)).to_smash
|
41
|
-
if
|
42
|
-
ui.puts ui.color(
|
40
|
+
if content[:sfn_parameters_lock]
|
41
|
+
ui.puts ui.color("no-op", :yellow)
|
43
42
|
ui.warn "Item is already locked! (#{item})"
|
44
43
|
else
|
45
44
|
thing = lock_content(content)
|
46
45
|
val = format_json(thing)
|
47
46
|
File.write(item, val)
|
48
|
-
ui.puts ui.color(
|
47
|
+
ui.puts ui.color("locked", :blue)
|
49
48
|
end
|
50
49
|
end
|
51
50
|
|
@@ -56,13 +55,13 @@ module Sfn
|
|
56
55
|
item = validate_item(item)
|
57
56
|
ui.print " Unlocking #{ui.color(item, :bold)}... "
|
58
57
|
content = load_json(File.read(item)).to_smash
|
59
|
-
if
|
58
|
+
if content[:sfn_parameters_lock]
|
60
59
|
content = unlock_content(content)
|
61
60
|
content.delete(:sfn_lock_enabled)
|
62
61
|
File.write(item, format_json(content))
|
63
|
-
ui.puts ui.color(
|
62
|
+
ui.puts ui.color("unlocked", :green)
|
64
63
|
else
|
65
|
-
ui.puts ui.color(
|
64
|
+
ui.puts ui.color("no-op", :yellow)
|
66
65
|
ui.warn "Item is already unlocked! (#{item})"
|
67
66
|
end
|
68
67
|
end
|
@@ -72,13 +71,13 @@ module Sfn
|
|
72
71
|
# @param item [String] item to lock
|
73
72
|
def run_action_show(item)
|
74
73
|
item = validate_item(item)
|
75
|
-
content =
|
76
|
-
if
|
77
|
-
ui.print ui.color(
|
74
|
+
content = Bogo::Config.new(item).data
|
75
|
+
if content[:sfn_parameters_lock]
|
76
|
+
ui.print ui.color(" *", :bold)
|
78
77
|
ui.print " Unlocking #{ui.color(item, :bold)} for display... "
|
79
78
|
content = unlock_content(content)
|
80
79
|
content.delete(:sfn_lock_enabled)
|
81
|
-
ui.puts ui.color(
|
80
|
+
ui.puts ui.color("unlocked", :green)
|
82
81
|
end
|
83
82
|
ui.puts format_json(content)
|
84
83
|
end
|
@@ -87,8 +86,8 @@ module Sfn
|
|
87
86
|
#
|
88
87
|
# @param item [String] item to lock
|
89
88
|
def run_action_create(item)
|
90
|
-
unless
|
91
|
-
raise ArgumentError.new
|
89
|
+
unless ENV["EDITOR"]
|
90
|
+
raise ArgumentError.new "$EDITOR must be set for create/edit commands!"
|
92
91
|
end
|
93
92
|
begin
|
94
93
|
item = validate_item(item)
|
@@ -97,26 +96,26 @@ module Sfn
|
|
97
96
|
item = new_item(item)
|
98
97
|
end
|
99
98
|
FileUtils.mkdir_p(File.dirname(item))
|
100
|
-
tmp = Bogo::EphemeralFile.new([
|
99
|
+
tmp = Bogo::EphemeralFile.new(["sfn-parameters", ".json"])
|
101
100
|
content = new_item ? NEW_ITEM_DEFAULT : load_json(File.read(item)).to_smash
|
102
|
-
if
|
103
|
-
ui.print ui.color(
|
101
|
+
if content[:sfn_parameters_lock]
|
102
|
+
ui.print ui.color(" *", :bold)
|
104
103
|
ui.print " Unlocking #{ui.color(item, :bold)} for edit... "
|
105
104
|
content = unlock_content(content)
|
106
|
-
ui.puts ui.color(
|
105
|
+
ui.puts ui.color("unlocked", :green)
|
107
106
|
end
|
108
107
|
lock_enabled = content.delete(:sfn_lock_enabled) || new_item
|
109
108
|
tmp.write(format_json(content))
|
110
109
|
tmp.flush
|
111
|
-
system("#{ENV[
|
110
|
+
system("#{ENV["EDITOR"]} #{tmp.path}")
|
112
111
|
content = load_json(File.read(tmp.path)).to_smash
|
113
|
-
ui.print ui.color(
|
114
|
-
if
|
112
|
+
ui.print ui.color(" *", :bold)
|
113
|
+
if lock_enabled
|
115
114
|
ui.print " Locking #{ui.color(item, :bold)} for storage... "
|
116
115
|
content = lock_content(content)
|
117
|
-
ui.puts ui.color(
|
116
|
+
ui.puts ui.color("locked", :blue)
|
118
117
|
else
|
119
|
-
ui.puts " Storing #{ui.color(item, :bold)} for storage... #{ui.color(
|
118
|
+
ui.puts " Storing #{ui.color(item, :bold)} for storage... #{ui.color("unlocked", :yellow)}"
|
120
119
|
end
|
121
120
|
File.write(item, format_json(content))
|
122
121
|
tmp.close
|
@@ -135,21 +134,21 @@ module Sfn
|
|
135
134
|
# @param item [String]
|
136
135
|
# @return [String]
|
137
136
|
def new_item(item)
|
138
|
-
unless
|
137
|
+
unless item.include?(File::SEPARATOR)
|
139
138
|
prefixes = [
|
140
139
|
config.get(:sfn_parameters, :directory),
|
141
|
-
|
142
|
-
|
140
|
+
"infrastructure",
|
141
|
+
"stacks",
|
143
142
|
].compact
|
144
143
|
prefix = prefixes.find_all do |dir|
|
145
144
|
File.directory?(dir)
|
146
145
|
end
|
147
|
-
if
|
146
|
+
if prefix.size > 1
|
148
147
|
raise ArgumentError.new "Unable to auto-determine directory for item! Multiple directories found. " \
|
149
|
-
|
150
|
-
elsif
|
148
|
+
"(detected: #{prefix.join(", ")})"
|
149
|
+
elsif prefix.empty?
|
151
150
|
raise ArgumentError.new "No existing parameter directories found. Please create required directory. " \
|
152
|
-
|
151
|
+
"(checked: #{prefixes.join(", ")})"
|
153
152
|
end
|
154
153
|
File.join(prefix.first, "#{item}.json")
|
155
154
|
end
|
@@ -161,49 +160,39 @@ module Sfn
|
|
161
160
|
# @param item [String]
|
162
161
|
# @return [String]
|
163
162
|
def validate_item(item)
|
164
|
-
if
|
165
|
-
raise NameError.new
|
163
|
+
if item.to_s.empty?
|
164
|
+
raise NameError.new "Item name is required. No item name provided."
|
166
165
|
end
|
167
|
-
items = [
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
File.join(
|
176
|
-
config.fetch(
|
177
|
-
:sfn_parameters, :directory, 'stacks'
|
166
|
+
items = [item]
|
167
|
+
["", ".json", ".rb", ".xml", ".yaml", ".yml"].each do |extension|
|
168
|
+
items += [
|
169
|
+
File.join(
|
170
|
+
config.fetch(
|
171
|
+
:sfn_parameters, :directory, "stacks"
|
172
|
+
),
|
173
|
+
"#{item}#{extension}"
|
178
174
|
),
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
175
|
+
File.join(
|
176
|
+
config.fetch(
|
177
|
+
:sfn_parameters, :directory, "infrastructure"
|
178
|
+
),
|
179
|
+
"#{item}#{extension}"
|
184
180
|
),
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
config.fetch(
|
189
|
-
:sfn_parameters, :directory, 'infrastructure'
|
190
|
-
),
|
191
|
-
"#{item}.json"
|
192
|
-
)
|
193
|
-
].map{|item| File.expand_path(item) }.uniq
|
181
|
+
]
|
182
|
+
end
|
183
|
+
items = items.map { |item| File.expand_path(item) }.uniq
|
194
184
|
valid = items.find_all do |file|
|
195
185
|
File.exist?(file)
|
196
186
|
end
|
197
|
-
if
|
187
|
+
if valid.empty?
|
198
188
|
raise ArgumentError.new "Failed to locate item `#{item}`!"
|
199
|
-
elsif
|
189
|
+
elsif valid.size > 1
|
200
190
|
raise ArgumentError.new "Multiple matches detected for item `#{item}`. " \
|
201
|
-
|
191
|
+
"(Matches: #{valid.join(", ")})"
|
202
192
|
else
|
203
193
|
valid.first
|
204
194
|
end
|
205
195
|
end
|
206
|
-
|
207
196
|
end
|
208
197
|
end
|
209
198
|
end
|
@@ -1,15 +1,14 @@
|
|
1
|
-
require
|
1
|
+
require "sfn-parameters"
|
2
2
|
|
3
3
|
module Sfn
|
4
4
|
class Callback
|
5
5
|
# Auto load stack parameters for infrastructure pattern
|
6
6
|
class ParametersInfrastructure < Callback
|
7
|
-
|
8
7
|
include Sfn::Utils::JSON
|
9
8
|
include SfnParameters::Utils
|
10
9
|
|
11
10
|
# Valid file extensions for configuration file
|
12
|
-
VALID_EXTENSIONS = [
|
11
|
+
VALID_EXTENSIONS = [".rb", ".xml", ".json", ".yaml", ".yml"]
|
13
12
|
|
14
13
|
# Update configuration after configuration is loaded
|
15
14
|
#
|
@@ -24,7 +23,8 @@ module Sfn
|
|
24
23
|
process_information_hash(content, [])
|
25
24
|
nil
|
26
25
|
end
|
27
|
-
|
26
|
+
|
27
|
+
alias_method :after_config, :after_config_update
|
28
28
|
|
29
29
|
protected
|
30
30
|
|
@@ -33,14 +33,14 @@ module Sfn
|
|
33
33
|
# @param stack_name [String]
|
34
34
|
# @return [Smash]
|
35
35
|
def load_file_for(stack_name)
|
36
|
-
root_path = config.fetch(:sfn_parameters, :directory,
|
37
|
-
isolation_name = config.fetch(
|
38
|
-
|
39
|
-
|
40
|
-
paths = Dir.glob(File.join(root_path, "#{isolation_name}{#{VALID_EXTENSIONS.join(
|
41
|
-
if
|
42
|
-
raise ArgumentError.new "Multiple parameter file matches encountered! (#{paths.join(
|
43
|
-
elsif
|
36
|
+
root_path = config.fetch(:sfn_parameters, :directory, "infrastructure")
|
37
|
+
isolation_name = config.fetch(
|
38
|
+
:sfn_parameters, :destination,
|
39
|
+
ENV.fetch("SFN_PARAMETERS_DESTINATION", "default"))
|
40
|
+
paths = Dir.glob(File.join(root_path, "#{isolation_name}{#{VALID_EXTENSIONS.join(",")}}")).map(&:to_s)
|
41
|
+
if paths.size > 1
|
42
|
+
raise ArgumentError.new "Multiple parameter file matches encountered! (#{paths.join(", ")})"
|
43
|
+
elsif paths.empty?
|
44
44
|
Smash.new
|
45
45
|
else
|
46
46
|
unlock_content(Bogo::Config.new(paths.first).data)
|
@@ -52,21 +52,21 @@ module Sfn
|
|
52
52
|
# @param hash [Hash]
|
53
53
|
# @param path [Array<String>] stack name hierarchy
|
54
54
|
# @return [TrueClass]
|
55
|
-
def process_information_hash(hash, path=[])
|
56
|
-
if
|
55
|
+
def process_information_hash(hash, path = [])
|
56
|
+
if path.empty? && hash[:template]
|
57
57
|
config[:file] = hash[:template]
|
58
58
|
end
|
59
59
|
hash.fetch(:parameters, {}).each do |key, value|
|
60
|
-
key = [*path, key].compact.map(&:to_s).join(
|
61
|
-
if
|
60
|
+
key = [*path, key].compact.map(&:to_s).join("__")
|
61
|
+
if current_value = config[:parameters][key]
|
62
62
|
ui.debug "Not setting template parameter `#{key}`. Already set within config. (`#{current_value}`)"
|
63
63
|
else
|
64
64
|
config[:parameters][key] = value
|
65
65
|
end
|
66
66
|
end
|
67
67
|
hash.fetch(:compile_parameters, {}).each do |key, value|
|
68
|
-
key = [*path, key].compact.map(&:to_s).join(
|
69
|
-
if
|
68
|
+
key = [*path, key].compact.map(&:to_s).join("__")
|
69
|
+
if current_value = config[:compile_parameters][key]
|
70
70
|
ui.debug "Not setting compile time parameter `#{key}`. Already set within config. (`#{current_value}`)"
|
71
71
|
else
|
72
72
|
config[:compile_parameters][key] = value
|
@@ -76,7 +76,7 @@ module Sfn
|
|
76
76
|
process_information_hash(value, [*path, key].compact)
|
77
77
|
end
|
78
78
|
hash.fetch(:mappings, {}).each do |key, value|
|
79
|
-
value = [*path, Bogo::Utility.camel(value)].compact.map(&:to_s).join(
|
79
|
+
value = [*path, Bogo::Utility.camel(value)].compact.map(&:to_s).join("__")
|
80
80
|
config[:apply_mapping][key] = value
|
81
81
|
end
|
82
82
|
hash.fetch(:apply_stacks, []).each do |s_name|
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require
|
1
|
+
require "sfn-parameters"
|
2
2
|
|
3
3
|
module Sfn
|
4
4
|
class Callback
|
@@ -10,17 +10,16 @@ module Sfn
|
|
10
10
|
# @param stack_name [String]
|
11
11
|
# @return [Smash]
|
12
12
|
def load_file_for(stack_name)
|
13
|
-
root_path = config.fetch(:sfn_parameters, :directory,
|
14
|
-
paths = Dir.glob(File.join(root_path, "#{stack_name}{#{VALID_EXTENSIONS.join(
|
15
|
-
if
|
16
|
-
raise ArgumentError.new "Multiple parameter file matches encountered! (#{paths.join(
|
17
|
-
elsif(paths.empty?)
|
13
|
+
root_path = config.fetch(:sfn_parameters, :directory, "stacks")
|
14
|
+
paths = Dir.glob(File.join(root_path, "#{stack_name}{#{VALID_EXTENSIONS.join(",")}}")).map(&:to_s)
|
15
|
+
if paths.size > 1
|
16
|
+
raise ArgumentError.new "Multiple parameter file matches encountered! (#{paths.join(", ")})"
|
17
|
+
elsif (paths.empty?)
|
18
18
|
Smash.new
|
19
19
|
else
|
20
20
|
unlock_content(Bogo::Config.new(paths.first).data)
|
21
21
|
end
|
22
22
|
end
|
23
|
-
|
24
23
|
end
|
25
24
|
end
|
26
25
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sfn-parameters
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Chris Roberts
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2018-07-22 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: sfn
|
@@ -69,7 +69,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
69
69
|
version: '0'
|
70
70
|
requirements: []
|
71
71
|
rubyforge_project:
|
72
|
-
rubygems_version: 2.
|
72
|
+
rubygems_version: 2.7.6
|
73
73
|
signing_key:
|
74
74
|
specification_version: 4
|
75
75
|
summary: SparkleFormation Parameters Callback
|