Skip to content

Commit 8dc507d

Browse files
authored
Merge pull request #3 from GetDutchie/feature/eng-6332/transition-envs-from-env-to-secrets-store
feat: add testing and provide new override method functionality - eng-6332
2 parents 1925790 + 0c261dc commit 8dc507d

5 files changed

Lines changed: 469 additions & 22 deletions

File tree

Gemfile.lock

Lines changed: 31 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,27 +2,43 @@ PATH
22
remote: .
33
specs:
44
secrets-manager (1.1.0)
5+
activesupport (~> 5.0, >= 5.0.0.1)
56
aws-sdk-secretsmanager (>= 1.31.0)
67
concurrent-ruby (>= 1.0)
78

89
GEM
910
remote: https://rubygems.org/
1011
specs:
11-
aws-eventstream (1.0.3)
12-
aws-partitions (1.276.0)
13-
aws-sdk-core (3.90.1)
14-
aws-eventstream (~> 1.0, >= 1.0.2)
12+
activesupport (5.2.6)
13+
concurrent-ruby (~> 1.0, >= 1.0.2)
14+
i18n (>= 0.7, < 2)
15+
minitest (~> 5.1)
16+
tzinfo (~> 1.1)
17+
aws-eventstream (1.1.1)
18+
aws-partitions (1.492.0)
19+
aws-sdk-core (3.119.1)
20+
aws-eventstream (~> 1, >= 1.0.2)
1521
aws-partitions (~> 1, >= 1.239.0)
1622
aws-sigv4 (~> 1.1)
1723
jmespath (~> 1.0)
18-
aws-sdk-secretsmanager (1.33.0)
19-
aws-sdk-core (~> 3, >= 3.71.0)
24+
aws-sdk-secretsmanager (1.48.0)
25+
aws-sdk-core (~> 3, >= 3.119.0)
2026
aws-sigv4 (~> 1.1)
21-
aws-sigv4 (1.1.0)
22-
aws-eventstream (~> 1.0, >= 1.0.2)
27+
aws-sigv4 (1.2.4)
28+
aws-eventstream (~> 1, >= 1.0.2)
29+
coderay (1.1.3)
2330
concurrent-ruby (1.1.6)
2431
diff-lcs (1.3)
32+
faker (2.19.0)
33+
i18n (>= 1.6, < 2)
34+
i18n (1.8.10)
35+
concurrent-ruby (~> 1.0)
2536
jmespath (1.4.0)
37+
method_source (1.0.0)
38+
minitest (5.14.4)
39+
pry (0.13.1)
40+
coderay (~> 1.1)
41+
method_source (~> 1.0)
2642
rake (10.5.0)
2743
rspec (3.8.0)
2844
rspec-core (~> 3.8.0)
@@ -37,15 +53,22 @@ GEM
3753
diff-lcs (>= 1.2.0, < 2.0)
3854
rspec-support (~> 3.8.0)
3955
rspec-support (3.8.2)
56+
thread_safe (0.3.6)
57+
timecop (0.8.1)
58+
tzinfo (1.2.9)
59+
thread_safe (~> 0.1)
4060

4161
PLATFORMS
4262
ruby
4363

4464
DEPENDENCIES
4565
bundler (~> 2.0)
66+
faker
67+
pry (~> 0.13.1)
4668
rake (~> 10.0)
4769
rspec (~> 3.0)
4870
secrets-manager!
71+
timecop (~> 0.8.1)
4972

5073
BUNDLED WITH
5174
2.1.4

lib/secrets-manager.rb

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
require "aws-sdk-secretsmanager"
55
require "concurrent-ruby"
66
require "json"
7+
require "active_support/core_ext/object/blank.rb"
8+
require "base64"
79

810
module SecretsManager
911
class SecretNotFound < StandardError; end;
@@ -23,13 +25,15 @@ def reset
2325

2426
def set(path, value, ttl = 86400)
2527
@_cache[path] = {expires_at: (Time.now + ttl), value: value}
28+
2629
return self
2730
end
2831

2932
def find(path)
3033
fetched = @_cache[path]
3134
return unless fetched
3235
return unless !fetched[:expires_at].nil? && (fetched[:expires_at]) > Time.now
36+
3337
fetched[:value]
3438
end
3539
end
@@ -43,34 +47,36 @@ def initialize(client: nil)
4347
end
4448

4549
def secret_env
46-
ENV['AWS_SECRETS_ENV'] || ENV['RACK_ENV'] || 'development'
50+
ENV["AWS_SECRETS_ENV"] || ENV["RACK_ENV"] || "development"
4751
end
4852

4953
def client
5054
return @aws_client if @aws_client
5155

5256
@_client ||= Aws::SecretsManager::Client.new({
53-
region: ENV.fetch('AWS_SECRETS_REGION', 'us-east-1'),
54-
credentials: Aws::Credentials.new(ENV['AWS_SECRETS_KEY'], ENV['AWS_SECRETS_SECRET'])
57+
region: ENV.fetch("AWS_SECRETS_REGION", "us-east-1"),
58+
credentials: Aws::Credentials.new(ENV["AWS_SECRETS_KEY"], ENV["AWS_SECRETS_SECRET"])
5559
})
5660
end
5761

5862
def fetch(secret_path)
5963
if secret_path.start_with?("global")
6064
resolved_path = secret_path
6165
else
62-
resolved_path = secret_env + '/' + secret_path
66+
resolved_path = secret_env + "/" + secret_path
6367
end
6468

6569
cached_value = cache.find(resolved_path)
6670
return cached_value if cached_value
6771

6872
response = client.get_secret_value(secret_id: resolved_path)
6973
return nil unless response && response.secret_string
70-
object = JSON.parse(response.secret_string, symbolize_names: true)
7174

75+
object = JSON.parse(response.secret_string, symbolize_names: true)
7276
value = parse_value(object)
77+
7378
cache.set(resolved_path, value, parse_ttl(object))
79+
7480
return value
7581
rescue Aws::SecretsManager::Errors::ResourceNotFoundException => e
7682
raise SecretsManager::SecretNotFound, "Could not find secret with path #{resolved_path}"
@@ -81,6 +87,7 @@ def [](path)
8187
end
8288

8389
private
90+
8491
def parse_ttl(data)
8592
## Default to one day cache TTL
8693
return 86400 unless data[:ttl].present?
@@ -106,6 +113,5 @@ def parse_value(data)
106113

107114
return value
108115
end
109-
110116
end
111-
end
117+
end

secrets-manager.gemspec

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,17 +18,21 @@ Gem::Specification.new do |spec|
1818

1919
# Specify which files should be added to the gem when it is released.
2020
# The `git ls-files -z` loads the files in the RubyGem that have been added into git.
21-
spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
21+
spec.files = Dir.chdir(File.expand_path("..", __FILE__)) do
2222
`git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
2323
end
2424
spec.bindir = "exe"
2525
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
2626
spec.require_paths = ["lib"]
2727

2828
spec.add_dependency "concurrent-ruby", ">= 1.0"
29-
spec.add_dependency 'aws-sdk-secretsmanager', '>= 1.31.0'
29+
spec.add_dependency "aws-sdk-secretsmanager", ">= 1.31.0"
30+
spec.add_dependency "activesupport", "~> 5.0", ">= 5.0.0.1"
3031

3132
spec.add_development_dependency "bundler", "~> 2.0"
3233
spec.add_development_dependency "rake", "~> 10.0"
3334
spec.add_development_dependency "rspec", "~> 3.0"
35+
spec.add_development_dependency "pry", "~> 0.13.1"
36+
spec.add_development_dependency "timecop", "~> 0.8.1"
37+
spec.add_development_dependency "faker"
3438
end

0 commit comments

Comments
 (0)