chambermaid 0.0.1 → 0.3.2
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 +4 -4
- data/Gemfile +0 -3
- data/Gemfile.lock +2 -2
- data/README.md +24 -3
- data/chambermaid.gemspec +2 -0
- data/lib/chambermaid.rb +3 -1
- data/lib/chambermaid/base.rb +113 -0
- data/lib/chambermaid/environment.rb +68 -0
- data/lib/chambermaid/namespace.rb +42 -0
- data/lib/chambermaid/parameter_store.rb +67 -0
- data/lib/chambermaid/version.rb +1 -1
- metadata +34 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fbcb610044b8dd8ff4487cb6729889f18dde9a32bd09b25620b53b6c6336a9e9
|
4
|
+
data.tar.gz: 80abde8476c848335de1f9557f49557322a1463f36419fe8c986a53ee18cb816
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: beb4b9d61c45e48bd48497e2cf27fec7cd5055447aac237324b298ba343b3d4bed49a46151aff364a90049ac31ae78b2c9dcf51b42cfa3cf000c3adde06a9552
|
7
|
+
data.tar.gz: 4228d741b603f187e69d3c900efae0241808eccabd4e3227b745cfd4e75e9c570949071c5d46c079d3ecd34992704c0390cea0f6b174c8560c2ce8ba3fe361f9
|
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
chambermaid (0.
|
4
|
+
chambermaid (0.3.2)
|
5
5
|
aws-sdk-ssm (~> 1.85)
|
6
6
|
|
7
7
|
GEM
|
8
8
|
remote: https://rubygems.org/
|
9
9
|
specs:
|
10
10
|
aws-eventstream (1.1.0)
|
11
|
-
aws-partitions (1.
|
11
|
+
aws-partitions (1.349.0)
|
12
12
|
aws-sdk-core (3.104.3)
|
13
13
|
aws-eventstream (~> 1, >= 1.0.2)
|
14
14
|
aws-partitions (~> 1, >= 1.239.0)
|
data/README.md
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Chambermaid
|
1
|
+
# Chambermaid [](https://badge.fury.io/rb/chambermaid) [](https://travis-ci.com/mileszim/chambermaid)
|
2
2
|
|
3
3
|
Companion RubyGem for [chamber](https://github.com/segmentio/chamber).
|
4
4
|
|
@@ -22,18 +22,39 @@ Or install it yourself as:
|
|
22
22
|
|
23
23
|
## Usage
|
24
24
|
|
25
|
+
**Standalone**
|
26
|
+
|
27
|
+
```ruby
|
28
|
+
Chambermaid.add_namespace("/my/param/namespace")
|
29
|
+
Chambermaid.add_service("my-chamber-service")
|
30
|
+
```
|
31
|
+
|
32
|
+
**Configuration Block**
|
33
|
+
|
25
34
|
```ruby
|
26
35
|
# config/initializers/chambermaid.rb
|
27
36
|
|
28
37
|
Chambermaid.configure do |config|
|
29
38
|
config.add_namespace("/my/param/namespace")
|
39
|
+
config.add_service("my-chamber-service")
|
30
40
|
|
31
|
-
# Set `
|
41
|
+
# Set `overload: true` to choose these params over existing
|
32
42
|
# ones in ENV when they are merged together
|
33
|
-
config.add_namespace("/my/important/namespace",
|
43
|
+
config.add_namespace("/my/important/namespace", overload: true)
|
34
44
|
end
|
35
45
|
```
|
36
46
|
|
47
|
+
**Reload SSM into ENV**
|
48
|
+
```ruby
|
49
|
+
Chambermaid.reload!
|
50
|
+
```
|
51
|
+
|
52
|
+
**Restore ENV to original state**
|
53
|
+
```ruby
|
54
|
+
Chambermaid.restore!
|
55
|
+
Chambermaid.reset! # alias of .restore!
|
56
|
+
```
|
57
|
+
|
37
58
|
## Development
|
38
59
|
|
39
60
|
After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
data/chambermaid.gemspec
CHANGED
data/lib/chambermaid.rb
CHANGED
@@ -0,0 +1,113 @@
|
|
1
|
+
require "chambermaid/environment"
|
2
|
+
require "chambermaid/namespace"
|
3
|
+
require "chambermaid/parameter_store"
|
4
|
+
|
5
|
+
module Chambermaid
|
6
|
+
module Base
|
7
|
+
def self.extended(base)
|
8
|
+
# Make a copy of ENV before we mess it all up
|
9
|
+
@@_original_env = ENV.to_h.dup.freeze
|
10
|
+
end
|
11
|
+
|
12
|
+
extend self
|
13
|
+
|
14
|
+
def configure
|
15
|
+
yield self
|
16
|
+
load!
|
17
|
+
end
|
18
|
+
|
19
|
+
# @todo
|
20
|
+
def configuration
|
21
|
+
raise "Namespaces must be defined" unless @namespaces
|
22
|
+
end
|
23
|
+
|
24
|
+
# Load SSM into ENV
|
25
|
+
def load!
|
26
|
+
@namespaces.each(&:load!)
|
27
|
+
end
|
28
|
+
|
29
|
+
# @todo
|
30
|
+
def reload!
|
31
|
+
@namespaces.each(&:reload!)
|
32
|
+
end
|
33
|
+
|
34
|
+
def unload!
|
35
|
+
@namespaces.each(&:unload!)
|
36
|
+
end
|
37
|
+
|
38
|
+
# Restore ENV to its original state
|
39
|
+
def restore!
|
40
|
+
ENV.replace(@@_original_env)
|
41
|
+
end
|
42
|
+
alias :reset! :restore!
|
43
|
+
|
44
|
+
# Add an AWS SSM parameter namespace to ENV
|
45
|
+
#
|
46
|
+
# @param [String] path
|
47
|
+
# @param [Boolean] overload
|
48
|
+
# true - replace any duplicate ENV keys with new params
|
49
|
+
# false - keep any existing duplicate ENV key values
|
50
|
+
#
|
51
|
+
# @raise [ArgumentError]
|
52
|
+
# when `path` is not a string
|
53
|
+
#
|
54
|
+
# @example
|
55
|
+
# Chambermaid.add_namespace("/my/param/namespace")
|
56
|
+
#
|
57
|
+
# @example overload duplicate ENV vars
|
58
|
+
# Chambermaid.add_namespace("/my/param/namespace", overload: true)
|
59
|
+
def add_namespace(path, overload: false)
|
60
|
+
raise ArgumentError.new("`path` must be a string") unless path.is_a?(String)
|
61
|
+
raise ArgumentError.new("`overload` must be a boolean") unless [true, false].include?(overload)
|
62
|
+
|
63
|
+
namespaces << Namespace.new(path: path, overload: overload)
|
64
|
+
end
|
65
|
+
|
66
|
+
# Immediately load an AWS SSM parameter namespace to ENV
|
67
|
+
#
|
68
|
+
# @param [String] path
|
69
|
+
# @param [Boolean] overload
|
70
|
+
# true - replace any duplicate ENV keys with new params
|
71
|
+
# false - keep any existing duplicate ENV key values
|
72
|
+
#
|
73
|
+
# @raise [ArgumentError]
|
74
|
+
# when `path` is not a string
|
75
|
+
#
|
76
|
+
# @example
|
77
|
+
# Chambermaid.add_namespace!("/my/param/namespace")
|
78
|
+
#
|
79
|
+
# @example overload duplicate ENV vars
|
80
|
+
# Chambermaid.add_namespace("/my/param/namespace", overload: true)
|
81
|
+
def add_namespace!(path, overload: false)
|
82
|
+
raise ArgumentError.new("`path` must be a string") unless path.is_a?(String)
|
83
|
+
raise ArgumentError.new("`overload` must be a boolean") unless [true, false].include?(overload)
|
84
|
+
|
85
|
+
namespaces << Namespace.load!(path: path, overload: overload)
|
86
|
+
end
|
87
|
+
|
88
|
+
# Add all secrets from Chamber service to ENV
|
89
|
+
#
|
90
|
+
# @param [String] service
|
91
|
+
# @param [Boolean] overload
|
92
|
+
# true - replace any duplicate ENV keys with new params
|
93
|
+
# false - keep any existing duplicate ENV key values
|
94
|
+
#
|
95
|
+
# @example
|
96
|
+
# Chambermaid.add_service("my-chamber-service")
|
97
|
+
#
|
98
|
+
# @example overload duplicate ENV vars
|
99
|
+
# Chambermaid.add_service("my-chamber-service", overload: true)
|
100
|
+
#
|
101
|
+
# @see {Chambermaid::Base.add_namespace}
|
102
|
+
def add_service(service, overload: false)
|
103
|
+
service = "/#{service}" unless service[0] == "/"
|
104
|
+
add_namespace(service)
|
105
|
+
end
|
106
|
+
|
107
|
+
private
|
108
|
+
|
109
|
+
def namespaces
|
110
|
+
@namespaces ||= []
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
@@ -0,0 +1,68 @@
|
|
1
|
+
module Chambermaid
|
2
|
+
class Environment < Hash
|
3
|
+
attr_reader :params
|
4
|
+
|
5
|
+
# Create new Chambermaid::Environment
|
6
|
+
#
|
7
|
+
# @param [Hash] params
|
8
|
+
#
|
9
|
+
# @raise [ArgumentError]
|
10
|
+
# if params is not type Hash
|
11
|
+
#
|
12
|
+
# @return [Chambermaid::Environment]
|
13
|
+
def initialize(params)
|
14
|
+
validate_params!(params)
|
15
|
+
stash_current_env!
|
16
|
+
update(format_env(params))
|
17
|
+
end
|
18
|
+
|
19
|
+
# Generate a dotenv (.env) compatible string
|
20
|
+
#
|
21
|
+
# @return [String] dotenv compatible string
|
22
|
+
def to_dotenv
|
23
|
+
to_h.inject("") do |env_str, param|
|
24
|
+
env_str + "#{param[0]}=#{param[1]}\n"
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
# Write a .env file
|
29
|
+
#
|
30
|
+
# @param [String] file_path
|
31
|
+
def to_file!(file_path)
|
32
|
+
File.open(file_path, "wb") do |f|
|
33
|
+
f.write(to_dotenv)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
# Inject into ENV without overwriting duplicates
|
38
|
+
def load!
|
39
|
+
each { |k, v| ENV[k] ||= v }
|
40
|
+
end
|
41
|
+
|
42
|
+
# Inject into ENV and overwrite duplicates
|
43
|
+
def overload!
|
44
|
+
each { |k, v| ENV[k] = v }
|
45
|
+
end
|
46
|
+
|
47
|
+
# Restore to original ENV
|
48
|
+
def unload!
|
49
|
+
ENV.replace(@_original_env)
|
50
|
+
end
|
51
|
+
|
52
|
+
private
|
53
|
+
|
54
|
+
def stash_current_env!
|
55
|
+
@_original_env ||= ENV.to_h.dup.freeze
|
56
|
+
end
|
57
|
+
|
58
|
+
def format_env(params)
|
59
|
+
params.map{|k,v| [k.upcase, v]}.to_h
|
60
|
+
end
|
61
|
+
|
62
|
+
def validate_params!(params)
|
63
|
+
unless params.is_a?(Hash)
|
64
|
+
raise ArgumentError.new("`params` must be a hash")
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
module Chambermaid
|
2
|
+
class Namespace
|
3
|
+
# @param [String] path
|
4
|
+
# @param [Boolean] overload
|
5
|
+
def initialize(path:, overload: false)
|
6
|
+
@path = path
|
7
|
+
@overload = overload
|
8
|
+
|
9
|
+
@store = ParameterStore.new(path: path)
|
10
|
+
@env = Environment.new({})
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.load!(path:, overload: false)
|
14
|
+
namespace = new(path: path, overload: overload)
|
15
|
+
namespace.load!
|
16
|
+
namespace
|
17
|
+
end
|
18
|
+
|
19
|
+
def load!
|
20
|
+
@store.load!
|
21
|
+
load_env!
|
22
|
+
end
|
23
|
+
|
24
|
+
def reload!
|
25
|
+
@env.unload!
|
26
|
+
@store.reload!
|
27
|
+
load_env!
|
28
|
+
end
|
29
|
+
|
30
|
+
def unload!
|
31
|
+
@env.unload!
|
32
|
+
end
|
33
|
+
|
34
|
+
private
|
35
|
+
|
36
|
+
# Inject into ENV
|
37
|
+
def load_env!
|
38
|
+
@env.replace(@store.params)
|
39
|
+
@overload ? @env.overload! : @env.load!
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,67 @@
|
|
1
|
+
require "aws-sdk-ssm"
|
2
|
+
|
3
|
+
module Chambermaid
|
4
|
+
class ParameterStore
|
5
|
+
def initialize(path:)
|
6
|
+
@path = path
|
7
|
+
end
|
8
|
+
|
9
|
+
def load!
|
10
|
+
fetch_ssm_params!
|
11
|
+
end
|
12
|
+
|
13
|
+
def reload!
|
14
|
+
clear_params!
|
15
|
+
fetch_ssm_params!
|
16
|
+
end
|
17
|
+
|
18
|
+
def loaded?
|
19
|
+
!@params_list.empty?
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.load!(path:)
|
23
|
+
store = new(path: path)
|
24
|
+
store.load!
|
25
|
+
store
|
26
|
+
end
|
27
|
+
|
28
|
+
def params
|
29
|
+
@params ||= @param_list.map { |p|
|
30
|
+
[p.name.split("/").last.upcase, p.value]
|
31
|
+
}.to_h
|
32
|
+
end
|
33
|
+
|
34
|
+
alias :to_h :params
|
35
|
+
|
36
|
+
private
|
37
|
+
|
38
|
+
def client
|
39
|
+
@client ||= Aws::SSM::Client.new
|
40
|
+
end
|
41
|
+
|
42
|
+
def fetch_ssm_params!
|
43
|
+
@param_list = []
|
44
|
+
response = nil
|
45
|
+
loop do
|
46
|
+
response = fetch_ssm_param_batch!(response&.next_token)
|
47
|
+
@param_list.concat(response.parameters)
|
48
|
+
|
49
|
+
break unless response.next_token
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def fetch_ssm_param_batch!(next_token = nil)
|
54
|
+
client.get_parameters_by_path(
|
55
|
+
path: @path,
|
56
|
+
with_decryption: true,
|
57
|
+
recursive: true,
|
58
|
+
next_token: next_token
|
59
|
+
)
|
60
|
+
end
|
61
|
+
|
62
|
+
def clear_params!
|
63
|
+
@params = nil
|
64
|
+
@params_list = []
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
data/lib/chambermaid/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: chambermaid
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Miles Zimmerman
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-08-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: aws-sdk-ssm
|
@@ -24,6 +24,34 @@ dependencies:
|
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '1.85'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rspec
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '3.0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '3.0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rake
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '12.0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '12.0'
|
27
55
|
description:
|
28
56
|
email:
|
29
57
|
- miles@asktrim.com
|
@@ -44,6 +72,10 @@ files:
|
|
44
72
|
- bin/setup
|
45
73
|
- chambermaid.gemspec
|
46
74
|
- lib/chambermaid.rb
|
75
|
+
- lib/chambermaid/base.rb
|
76
|
+
- lib/chambermaid/environment.rb
|
77
|
+
- lib/chambermaid/namespace.rb
|
78
|
+
- lib/chambermaid/parameter_store.rb
|
47
79
|
- lib/chambermaid/version.rb
|
48
80
|
homepage: https://github.com/mileszim/chambermaid
|
49
81
|
licenses:
|