sfn-parameters 0.2.4 → 0.2.6
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 +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
|