hiera-secrets-manager 0.1.0

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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: ddb4e09c2998f196711cd698067557e0ba49e66c315a8bb77cabdf75cc4d309b
4
+ data.tar.gz: bc5fab11b745e1d8b42054a652f9bc0a704642d84fae56c2fe59b77f10265d5a
5
+ SHA512:
6
+ metadata.gz: 61f468931ae0cc0ec27c9b312c511b95f607d994bd4ddd2489feb9db7ab7968861e0c4dd402b063d25c02043d76cf6a07ddb1ae30df3876e8e5720b20356fa6c
7
+ data.tar.gz: 1c4fac048ab6cc8083bc28d97f7f0e0b712b8b4e06767f82fa01b0d64a69469afa4f56bc4ec3301dfa4fbf263bd13f2fefd61e7de9c9b54dbb541e0d0a9974b7
@@ -0,0 +1,48 @@
1
+ class Hiera
2
+ module Backend
3
+ class Secrets_manager_backend
4
+ def initialize
5
+ require 'aws-sdk-secretsmanager'
6
+ @client = Aws::SecretsManager::Client.new(
7
+ region: Config[:secrets_manager][:region]
8
+ )
9
+
10
+ Hiera.debug('AWS Secrets Manager backend starting')
11
+ end
12
+
13
+ def lookup(key, scope, order_override, resolution_type)
14
+ answer = nil
15
+
16
+ key_to_query = format_key(key, scope, Config[:secrets_manager])
17
+
18
+ begin
19
+ answer = @client.get_secret_value(secret_id: key_to_query)['secret_string']
20
+ rescue Aws::SecretsManager::Errors::ResourceNotFoundException => error
21
+ Hiera.debug("#{key} not found: #{error.message}")
22
+ end
23
+
24
+ answer
25
+ end
26
+
27
+ private
28
+
29
+ def get_prefix(environments, scope)
30
+ if environments && environments.key?(scope['environment'])
31
+ environments[scope['environment']]
32
+ else
33
+ scope['environment']
34
+ end
35
+ end
36
+
37
+ def format_key(key, scope, config)
38
+ if scope.key?('environment')
39
+ environments = config[:environments]
40
+ prefix = get_prefix(environments, scope)
41
+ "#{prefix}/#{key}"
42
+ else
43
+ key
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,125 @@
1
+ require 'spec_helper'
2
+ require 'hiera/backend/secrets_manager_backend'
3
+
4
+ class Hiera
5
+ module Backend
6
+ describe Secrets_manager_backend do
7
+ before do
8
+ @region_object = { region: 'some_region' }
9
+ @config_object = { secrets_manager:
10
+ {
11
+ region: @region_object[:region],
12
+ environments:
13
+ {
14
+ 'env1' => 'production',
15
+ 'env2' => 'staging',
16
+ 'env3' => 'development'
17
+ }
18
+ } }
19
+ Config.load(@config_object)
20
+ Hiera.stubs(:debug)
21
+ Aws::SecretsManager::Client
22
+ .stubs(:new)
23
+ .with(@region_object)
24
+ end
25
+
26
+ describe '#initialize' do
27
+ it 'should announce its creation' do
28
+ Hiera
29
+ .expects(:debug)
30
+ .with('AWS Secrets Manager backend starting')
31
+ Secrets_manager_backend.new
32
+ end
33
+
34
+ it 'should set up a connection to AWS Secrets Manager' do
35
+ Aws::SecretsManager::Client
36
+ .expects(:new)
37
+ .with(@region_object)
38
+ Secrets_manager_backend.new
39
+ end
40
+ end
41
+
42
+ describe '#lookup' do
43
+ before do
44
+ @mock_client = mock('client')
45
+ Aws::SecretsManager::Client
46
+ .stubs(:new)
47
+ .with(@region_object).returns(@mock_client)
48
+ @backend = Secrets_manager_backend.new
49
+ @scope = { 'environment' => 'env1' }
50
+ end
51
+
52
+ it 'should return a secret that exists' do
53
+ secret_name = 'secret_name'
54
+ secret_string = 'i_am_a_secret'
55
+ prefixed_secret_name = 'production/secret_name'
56
+
57
+ @mock_client.stubs(:get_secret_value)
58
+ .with(secret_id: prefixed_secret_name)
59
+ .returns('secret_string' => secret_string)
60
+
61
+ answer = @backend.lookup(secret_name, @scope, nil, nil)
62
+ expect(answer).to eq(secret_string)
63
+ end
64
+
65
+ it 'should not return a secret that does not exist' do
66
+ nonexistent_secret = 'does_not_exist'
67
+ prefixed_nonexistent_secret = 'production/does_not_exist'
68
+ mock_context = {}
69
+ error_message = 'Secrets Manager could not find this secret.'
70
+ error = Aws::
71
+ SecretsManager::
72
+ Errors::
73
+ ResourceNotFoundException.new(
74
+ mock_context,
75
+ error_message
76
+ )
77
+ @mock_client.stubs(:get_secret_value)
78
+ .with(secret_id: prefixed_nonexistent_secret)
79
+ .raises(error)
80
+ Hiera
81
+ .expects(:debug)
82
+ .with("#{nonexistent_secret} not found: #{error_message}")
83
+ answer = @backend.lookup(nonexistent_secret, @scope, nil, nil)
84
+ expect(answer).to eq(nil)
85
+ end
86
+
87
+ it 'falls back to provided scope environment when Hiera config does not include environment as a key / value pair' do
88
+ scope = { 'environment' => 'some_env_not_in_config' }
89
+ prefixed_secret_name = 'some_env_not_in_config/secret_name'
90
+
91
+ @mock_client
92
+ .expects(:get_secret_value)
93
+ .with(secret_id: prefixed_secret_name)
94
+ .returns('secret_string' => 'the_secret')
95
+ @backend.lookup('secret_name', scope, nil, nil)
96
+ end
97
+
98
+ it 'falls back to provided scope environment when Hiera config does not include any environments' do
99
+ incomplete_config = { secrets_manager: { region: @region_object[:region] } }
100
+ Config.load(incomplete_config)
101
+
102
+ scope = { 'environment' => 'some_env' }
103
+ prefixed_secret_name = 'some_env/secret_name'
104
+
105
+ @mock_client
106
+ .expects(:get_secret_value)
107
+ .with(secret_id: prefixed_secret_name)
108
+ .returns('secret_string' => 'the_secret')
109
+ @backend.lookup('secret_name', scope, nil, nil)
110
+ end
111
+
112
+ it 'does not use prefix if no environment is provided in scope' do
113
+ scope = { 'no_environment_key' => 'some_value' }
114
+ secret_name = 'secret_name'
115
+
116
+ @mock_client
117
+ .expects(:get_secret_value)
118
+ .with(secret_id: secret_name)
119
+ .returns('secret_string' => 'the_secret')
120
+ @backend.lookup('secret_name', scope, nil, nil)
121
+ end
122
+ end
123
+ end
124
+ end
125
+ end
metadata ADDED
@@ -0,0 +1,61 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: hiera-secrets-manager
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Unruly
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2018-08-21 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: aws-sdk-secretsmanager
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - '='
18
+ - !ruby/object:Gem::Version
19
+ version: 1.11.0
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - '='
25
+ - !ruby/object:Gem::Version
26
+ version: 1.11.0
27
+ description: Hiera-Secrets-Manager is a backend for Hiera which can look up secrets
28
+ from AWS Secrets Manager.
29
+ email: boss@unrulygroup.com
30
+ executables: []
31
+ extensions: []
32
+ extra_rdoc_files: []
33
+ files:
34
+ - lib/hiera/backend/secrets_manager_backend.rb
35
+ - spec/secrets_manager_backend_spec.rb
36
+ homepage: https://github.com/unruly/hiera-secrets-manager
37
+ licenses:
38
+ - MIT
39
+ metadata: {}
40
+ post_install_message:
41
+ rdoc_options: []
42
+ require_paths:
43
+ - lib
44
+ required_ruby_version: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - ">="
47
+ - !ruby/object:Gem::Version
48
+ version: '0'
49
+ required_rubygems_version: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ requirements: []
55
+ rubyforge_project:
56
+ rubygems_version: 2.7.7
57
+ signing_key:
58
+ specification_version: 4
59
+ summary: AWS Secrets Manager backend for Hiera
60
+ test_files:
61
+ - spec/secrets_manager_backend_spec.rb