settings_reader-vault_resolver 0.2.1 → 0.2.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f126e949c2a936423dbca26aacba8a20a5ddc89b245c9ff0fbd514d0d41e9f05
4
- data.tar.gz: c3a592e95462d32c511f945033ff4da1ff7956f9b9854c08fa91b65682d8fc20
3
+ metadata.gz: 16ca7880831b27b05c24651940a1dab796b792f7d98229f2f01e229ffcee5662
4
+ data.tar.gz: ff8e434b0512ce66772e8f99b16761ea51597614b195abb91889a5543ba88267
5
5
  SHA512:
6
- metadata.gz: 6117c34284578be43c1bb21d370d1c56298ffea393c2ce485d25e4b1fbb6f8a2ec8f1b9d9d86b472cff6ad6b6506949895babd8086c71e26193a7fbcca5f6b1e
7
- data.tar.gz: b17550f51be60b61eb7efdb0034d262408ec5a231f6152cc3e356813a632b88b15f679e84a7bf3deb039dd0252742082b1917bc9f1a21206730a803048fb4027
6
+ metadata.gz: e1476c785e7369a2a2f3d4ee47a149cfd3c1fc2ebf333a94a1ec158c564584995ced9392fa08e1be9ec16ba166c0f20899414e02622473a4d0058ef5d70abce2
7
+ data.tar.gz: 8c1a40bd635b8e9de7193114618a0669e3c9d3ffabae250ff5efc416a31636c199584bb7e474373ead29bde9e85e281adbba0e7ba123358e1729d0e599bf17bf
@@ -42,6 +42,10 @@ module SettingsReader
42
42
  secret.data[attribute.to_sym]
43
43
  end
44
44
 
45
+ def to_s
46
+ address.to_s
47
+ end
48
+
45
49
  private
46
50
 
47
51
  def lease_duration
@@ -4,6 +4,8 @@ module SettingsReader
4
4
  module VaultResolver
5
5
  # Resolver class for Settings Reader
6
6
  class Instance
7
+ include Logging
8
+
7
9
  IDENTIFIER = 'vault://'.freeze
8
10
  DATABASE_MOUNT = 'database'.freeze
9
11
 
@@ -15,6 +17,7 @@ module SettingsReader
15
17
 
16
18
  # Expect value in format `vault://mount/path/to/secret?attribute_name`
17
19
  def resolve(value, _path)
20
+ debug { "Resolving Vault secret at #{value}" }
18
21
  address = SettingsReader::VaultResolver::Address.new(value)
19
22
  entry = fetch_entry(address)
20
23
  entry&.value_for(address.attribute)
@@ -22,14 +25,18 @@ module SettingsReader
22
25
 
23
26
  # Resolve KV secret
24
27
  def kv_secret(address)
28
+ debug { "Fetching new kv secret at: #{address}" }
25
29
  Vault.kv(address.mount).read(address.path)
26
30
  rescue Vault::HTTPClientError => e
31
+ error { "Error retrieving secret at: #{address}: #{e.message}" }
27
32
  raise SettingsReader::VaultResolver::Error, e.message
28
33
  end
29
34
 
30
35
  def database_secret(address)
36
+ debug { "Fetching new database secret at: #{address}" }
31
37
  Vault.logical.read(address.full_path)
32
38
  rescue Vault::HTTPClientError => e
39
+ error { "Error retrieving database secret: #{address}: #{e.message}" }
33
40
  return nil if e.message.include?('* unknown role')
34
41
 
35
42
  raise SettingsReader::VaultResolver::Error, e.message
@@ -39,8 +46,12 @@ module SettingsReader
39
46
 
40
47
  def fetch_entry(address)
41
48
  cache.fetch(address) do
49
+ info { "Retrieving new secret at: #{address}" }
42
50
  if (secret = address.mount == DATABASE_MOUNT ? database_secret(address) : kv_secret(address))
51
+ debug { "Retrieved secret at: #{address}" }
43
52
  SettingsReader::VaultResolver::Entry.new(address, secret)
53
+ else
54
+ debug { "Secret not retrieved: #{address}" }
44
55
  end
45
56
  end
46
57
  end
@@ -0,0 +1,40 @@
1
+ module SettingsReader
2
+ module VaultResolver
3
+ # Methods for centralized logging
4
+ module Logging
5
+ def debug(&block)
6
+ logger.debug do
7
+ "[VaultResolver] #{block.call}"
8
+ end
9
+ nil
10
+ end
11
+
12
+ def info(&block)
13
+ logger.info do
14
+ "[VaultResolver] #{block.call}"
15
+ end
16
+ nil
17
+ end
18
+
19
+ def warn(&block)
20
+ logger.warn do
21
+ "[VaultResolver] #{block.call}"
22
+ end
23
+ nil
24
+ end
25
+
26
+ def error(&block)
27
+ logger.error do
28
+ "[VaultResolver] #{block.call}"
29
+ end
30
+ nil
31
+ end
32
+
33
+ private
34
+
35
+ def logger
36
+ @logger ||= SettingsReader::VaultResolver.logger
37
+ end
38
+ end
39
+ end
40
+ end
@@ -2,6 +2,8 @@ module SettingsReader
2
2
  module VaultResolver
3
3
  # Vault Lease refresher task
4
4
  class Refresher
5
+ include Logging
6
+
5
7
  DEFAULT_RENEW_DELAY = 200
6
8
  REFRESH_INTERVAL = 60
7
9
 
@@ -11,12 +13,15 @@ module SettingsReader
11
13
 
12
14
  def refresh
13
15
  @cache.entries.each do |entry|
16
+ debug { "Checking lease for #{entry}. Leased?: #{entry.leased?}. Expires in: #{entry.expires_in}s" }
14
17
  next unless entry.leased?
15
18
  next unless entry.expires_in < DEFAULT_RENEW_DELAY
16
19
 
20
+ info { "Refreshing lease for #{entry}. Expires in: #{entry.expires_in}" }
17
21
  entry.renew
18
- rescue SettingsReader::VaultResolver::Error => _e
19
- # TODO: Log error in future. Think if we can request new secret again.
22
+ info { "Lease renewed for #{entry}. Expires in: #{entry.expires_in}" }
23
+ rescue SettingsReader::VaultResolver::Error => e
24
+ error { "Error refreshing lease for #{entry}: #{e.message}" }
20
25
  # Continue renewal.
21
26
  end
22
27
  end
@@ -24,6 +29,7 @@ module SettingsReader
24
29
  def self.refresh_task(cache)
25
30
  refresher = self
26
31
  Concurrent::TimerTask.new(execution_interval: refresher::REFRESH_INTERVAL) do
32
+ info { 'Refreshing Vault leases' }
27
33
  refresher.new(cache).refresh
28
34
  end
29
35
  end
@@ -1,5 +1,5 @@
1
1
  module SettingsReader
2
2
  module VaultResolver
3
- VERSION = '0.2.1'.freeze
3
+ VERSION = '0.2.2'.freeze
4
4
  end
5
5
  end
@@ -1,6 +1,9 @@
1
+ require 'logger'
1
2
  require 'concurrent/timer_task'
3
+
2
4
  require 'settings_reader'
3
5
  require 'settings_reader/vault_resolver/version'
6
+ require 'settings_reader/vault_resolver/logging'
4
7
  require 'settings_reader/vault_resolver/address'
5
8
  require 'settings_reader/vault_resolver/entry'
6
9
  require 'settings_reader/vault_resolver/cache'
@@ -16,6 +19,13 @@ module SettingsReader
16
19
  attr_accessor :cache, :refresher_timer_task
17
20
  end
18
21
 
22
+ def self.logger
23
+ return @logger if @logger
24
+ return @logger = Rails.logger if defined? Rails
25
+
26
+ @logger = Logger.new($stdout, level: Logger::INFO)
27
+ end
28
+
19
29
  def self.setup_cache
20
30
  self.cache ||= SettingsReader::VaultResolver::Cache.new
21
31
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: settings_reader-vault_resolver
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.1
4
+ version: 0.2.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Volodymyr Mykhailyk
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-03-03 00:00:00.000000000 Z
11
+ date: 2022-03-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: concurrent-ruby
@@ -84,6 +84,7 @@ files:
84
84
  - lib/settings_reader/vault_resolver/entry.rb
85
85
  - lib/settings_reader/vault_resolver/helpers/k8s_auth.rb
86
86
  - lib/settings_reader/vault_resolver/instance.rb
87
+ - lib/settings_reader/vault_resolver/logging.rb
87
88
  - lib/settings_reader/vault_resolver/patches/authenticate.rb
88
89
  - lib/settings_reader/vault_resolver/refresher.rb
89
90
  - lib/settings_reader/vault_resolver/version.rb