foreman_vault 0.2.0 → 0.3.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 +4 -4
- data/README.md +7 -0
- data/app/models/concerns/foreman_vault/orchestration/vault_policy.rb +10 -0
- data/app/models/concerns/foreman_vault/provisioning_template_extensions.rb +13 -0
- data/app/models/setting/vault.rb +13 -1
- data/app/services/foreman_vault/vault_auth_method.rb +1 -1
- data/app/services/foreman_vault/vault_policy.rb +1 -1
- data/lib/foreman_vault/engine.rb +2 -1
- data/lib/foreman_vault/version.rb +1 -1
- data/test/factories/vault_policy_template.rb +1 -0
- data/test/models/foreman_vault/orchestration/vault_policy_test.rb +42 -0
- data/test/models/vault_policy_template_test.rb +15 -0
- data/test/unit/services/foreman_vault/vault_auth_method_test.rb +4 -4
- data/test/unit/services/foreman_vault/vault_policy_test.rb +4 -4
- metadata +9 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: dbbedb9d2f03e0e5d76b5c088d054852e1cbb8f44ff2d8454026b2fecf39215f
|
4
|
+
data.tar.gz: 0f8099efcfc129acc8d640e0240ef9418b7d4a657609d13a4e2094be7c0b8ec9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 50d747b63207ee9ae91733eb32bbbd8ee8479e985d1acf6584928a6b1017ab73c1a753b1ed792280ae68ded7f509c01243a106f4695b5f014ae9b88e480e1291
|
7
|
+
data.tar.gz: c146baed359276db93d4e696bd1b1f0cd700d022b4af12ba391cdfaccbfd858d1f0780b8d5ba20a56ea572215b19541e1213ac9b17989af05fccae6bcb0b4d76
|
data/README.md
CHANGED
@@ -18,6 +18,13 @@ Auth methods also get deleted after the host is removed from Foreman.
|
|
18
18
|
|
19
19
|
This allows Foreman to create everything needed to access Hashicorp Vault directly from a VM using it's Puppet certificate (e.g. for _Deferred functions_ in Puppet or other CLI tools).
|
20
20
|
|
21
|
+
## Compatibility
|
22
|
+
|
23
|
+
| Foreman Version | Plugin Version |
|
24
|
+
| --------------- | -------------- |
|
25
|
+
| >= 1.23 | ~> 0.3 |
|
26
|
+
| >= 1.20 | ~> 0.2 |
|
27
|
+
|
21
28
|
## Requirements
|
22
29
|
|
23
30
|
- Foreman >= 1.20
|
@@ -16,6 +16,7 @@ module ForemanVault
|
|
16
16
|
|
17
17
|
def queue_vault_push
|
18
18
|
return if !managed? || errors.any?
|
19
|
+
return unless orchestration_enabled?
|
19
20
|
return unless vault_policy.valid?
|
20
21
|
return unless vault_auth_method.valid?
|
21
22
|
|
@@ -25,6 +26,8 @@ module ForemanVault
|
|
25
26
|
|
26
27
|
def queue_vault_destroy
|
27
28
|
return if !managed? || errors.any?
|
29
|
+
return unless orchestration_enabled?
|
30
|
+
return unless vault_auth_method.valid?
|
28
31
|
|
29
32
|
queue.create(name: _('Clear %s Vault data') % self, priority: 60,
|
30
33
|
action: [self, :del_vault])
|
@@ -54,6 +57,13 @@ module ForemanVault
|
|
54
57
|
Foreman::Logging.exception("Failed to clear #{name} Vault data", e)
|
55
58
|
failure format(_("Failed to clear %{name} Vault data: %{message}\n "), name: name, message: e.message), e
|
56
59
|
end
|
60
|
+
|
61
|
+
def orchestration_enabled?
|
62
|
+
return false unless Setting[:vault_orchestration_enabled]
|
63
|
+
return false if vault_connection.nil?
|
64
|
+
|
65
|
+
true
|
66
|
+
end
|
57
67
|
end
|
58
68
|
end
|
59
69
|
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ForemanVault
|
4
|
+
module ProvisioningTemplateExtensions
|
5
|
+
extend ActiveSupport::Concern
|
6
|
+
|
7
|
+
def render(host: nil, params: {}, variables: {}, mode: Foreman::Renderer::REAL_MODE, template_input_values: {}, source_klass: nil)
|
8
|
+
source_klass = Foreman::Renderer::Source::Database if template_kind == TemplateKind.find_by(name: 'VaultPolicy')
|
9
|
+
|
10
|
+
super
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
data/app/models/setting/vault.rb
CHANGED
@@ -6,7 +6,7 @@ class Setting
|
|
6
6
|
BLANK_ATTRS << 'vault_policy_template'
|
7
7
|
|
8
8
|
def self.default_settings
|
9
|
-
[set_vault_connection, set_vault_policy_template]
|
9
|
+
[set_vault_connection, set_vault_policy_template, set_vault_orchestration_enabled]
|
10
10
|
end
|
11
11
|
|
12
12
|
def self.load_defaults
|
@@ -40,12 +40,15 @@ class Setting
|
|
40
40
|
end
|
41
41
|
|
42
42
|
def default_vault_connection
|
43
|
+
return nil unless VaultConnection.table_exists?
|
43
44
|
return unless VaultConnection.unscoped.count == 1
|
44
45
|
|
45
46
|
VaultConnection.unscoped.first.name
|
46
47
|
end
|
47
48
|
|
48
49
|
def vault_connections_collection
|
50
|
+
return [] unless VaultConnection.table_exists?
|
51
|
+
|
49
52
|
proc { Hash[VaultConnection.unscoped.all.map { |vc| [vc.name, vc.name] }] }
|
50
53
|
end
|
51
54
|
|
@@ -68,6 +71,15 @@ class Setting
|
|
68
71
|
def vault_policy_templates_collection
|
69
72
|
proc { Hash[ProvisioningTemplate.unscoped.of_kind(:VaultPolicy).map { |tmpl| [tmpl.name, tmpl.name] }] }
|
70
73
|
end
|
74
|
+
|
75
|
+
def set_vault_orchestration_enabled
|
76
|
+
set(
|
77
|
+
'vault_orchestration_enabled',
|
78
|
+
N_('Enable or disable the Vault orchestration step for managing policies and auth methods'),
|
79
|
+
false,
|
80
|
+
N_('Vault Orchestration enabled')
|
81
|
+
)
|
82
|
+
end
|
71
83
|
end
|
72
84
|
end
|
73
85
|
end
|
data/lib/foreman_vault/engine.rb
CHANGED
@@ -29,7 +29,7 @@ module ForemanVault
|
|
29
29
|
|
30
30
|
initializer 'foreman_vault.register_plugin', before: :finisher_hook do |_app|
|
31
31
|
Foreman::Plugin.register :foreman_vault do
|
32
|
-
requires_foreman '>= 1.
|
32
|
+
requires_foreman '>= 1.23'
|
33
33
|
|
34
34
|
apipie_documented_controllers ["#{ForemanVault::Engine.root}/app/controllers/api/v2/*.rb"]
|
35
35
|
|
@@ -55,6 +55,7 @@ module ForemanVault
|
|
55
55
|
config.to_prepare do
|
56
56
|
begin
|
57
57
|
::Host::Managed.include(ForemanVault::HostExtensions)
|
58
|
+
::ProvisioningTemplate.include(ForemanVault::ProvisioningTemplateExtensions)
|
58
59
|
::Foreman::Renderer::Scope::Base.include(ForemanVault::Macros)
|
59
60
|
::Foreman::Renderer.configure { |c| c.allowed_generic_helpers += [:vault_secret, :vault_issue_certificate] }
|
60
61
|
rescue StandardError => e
|
@@ -4,6 +4,7 @@ FactoryBot.modify do
|
|
4
4
|
factory :provisioning_template do
|
5
5
|
trait :vault_policy do
|
6
6
|
name { Setting['vault_policy_template'] || 'Default Vault Policy' }
|
7
|
+
template_kind { TemplateKind.find_or_create_by(name: 'VaultPolicy') }
|
7
8
|
template { File.read(File.join(ForemanVault::Engine.root, 'app/views/unattended/provisioning_templates/VaultPolicy/default.erb')) }
|
8
9
|
end
|
9
10
|
end
|
@@ -10,11 +10,14 @@ module ForemanVault
|
|
10
10
|
let(:queue) { mock('queue') }
|
11
11
|
let(:vault_policy) { mock('vault_policy') }
|
12
12
|
let(:vault_auth_method) { mock('vault_auth_method') }
|
13
|
+
let(:vault_connection) { FactoryBot.create(:vault_connection, :without_callbacks) }
|
13
14
|
|
14
15
|
setup do
|
15
16
|
host.stubs(:queue).returns(queue)
|
16
17
|
host.stubs(:vault_policy).returns(vault_policy)
|
17
18
|
host.stubs(:vault_auth_method).returns(vault_auth_method)
|
19
|
+
FactoryBot.create(:parameter, name: 'vault_connection', value: vault_connection.name)
|
20
|
+
FactoryBot.create(:setting, name: :vault_orchestration_enabled, value: true)
|
18
21
|
end
|
19
22
|
|
20
23
|
test 'should queue Vault orchestration' do
|
@@ -50,6 +53,44 @@ module ForemanVault
|
|
50
53
|
end
|
51
54
|
end
|
52
55
|
|
56
|
+
describe '#queue_vault_destroy' do
|
57
|
+
let(:host) { FactoryBot.create(:host, :managed) }
|
58
|
+
let(:queue) { mock('queue') }
|
59
|
+
let(:vault_policy) { mock('vault_policy') }
|
60
|
+
let(:vault_auth_method) { mock('vault_auth_method') }
|
61
|
+
let(:vault_connection) { FactoryBot.create(:vault_connection, :without_callbacks) }
|
62
|
+
|
63
|
+
setup do
|
64
|
+
host.stubs(:queue).returns(queue)
|
65
|
+
host.stubs(:vault_policy).returns(vault_policy)
|
66
|
+
host.stubs(:vault_auth_method).returns(vault_auth_method)
|
67
|
+
FactoryBot.create(:parameter, name: 'vault_connection', value: vault_connection.name)
|
68
|
+
FactoryBot.create(:setting, name: :vault_orchestration_enabled, value: true)
|
69
|
+
end
|
70
|
+
|
71
|
+
context 'when auth_method is valid' do
|
72
|
+
test 'should queue del_vault' do
|
73
|
+
vault_auth_method.stubs(:valid?).returns(true)
|
74
|
+
|
75
|
+
queue.expects(:create).with(
|
76
|
+
name: "Clear #{host} Vault data",
|
77
|
+
priority: 60,
|
78
|
+
action: [host, :del_vault]
|
79
|
+
).once
|
80
|
+
host.send(:queue_vault_destroy)
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
context 'when auth_method is not valid' do
|
85
|
+
test 'should not queue del_vault' do
|
86
|
+
vault_auth_method.stubs(:valid?).returns(false)
|
87
|
+
|
88
|
+
queue.expects(:create).never
|
89
|
+
host.send(:queue_vault_destroy)
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
53
94
|
describe '#set_vault' do
|
54
95
|
let(:environment) { FactoryBot.create(:environment, name: 'MyEnv') }
|
55
96
|
let(:host) { FactoryBot.create(:host, :managed, environment: environment) }
|
@@ -92,6 +133,7 @@ module ForemanVault
|
|
92
133
|
|
93
134
|
setup do
|
94
135
|
Setting.find_by(name: 'ssl_ca_file').update(value: File.join(ForemanVault::Engine.root, 'test/fixtures/ca.crt'))
|
136
|
+
FactoryBot.create(:setting, name: :vault_orchestration_enabled, value: true)
|
95
137
|
FactoryBot.create(:setting, :vault_policy)
|
96
138
|
FactoryBot.create(:provisioning_template, :vault_policy, name: Setting['vault_policy_template'])
|
97
139
|
FactoryBot.create(:parameter, name: 'vault_connection', value: vault_connection.name)
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'test_plugin_helper'
|
4
|
+
|
5
|
+
class VaultPolicyTemplateTest < ActiveSupport::TestCase
|
6
|
+
let(:template) { FactoryBot.create(:provisioning_template, :vault_policy) }
|
7
|
+
|
8
|
+
it 'is rendered from a database' do
|
9
|
+
Foreman::Renderer.expects(:get_source).with(has_entry(klass: Foreman::Renderer::Source::Database))
|
10
|
+
Foreman::Renderer.stubs(:get_scope)
|
11
|
+
Foreman::Renderer.stubs(:render)
|
12
|
+
|
13
|
+
template.render
|
14
|
+
end
|
15
|
+
end
|
@@ -91,18 +91,18 @@ class VaultAuthMethodTest < ActiveSupport::TestCase
|
|
91
91
|
end
|
92
92
|
|
93
93
|
describe '#delete' do
|
94
|
-
context '
|
94
|
+
context 'when valid' do
|
95
95
|
it 'deletes Certificate' do
|
96
|
-
subject.stubs(:
|
96
|
+
subject.stubs(:valid?).returns(true)
|
97
97
|
|
98
98
|
subject.expects(:delete_certificate).once.with(subject.name)
|
99
99
|
subject.delete
|
100
100
|
end
|
101
101
|
end
|
102
102
|
|
103
|
-
context '
|
103
|
+
context 'when not valid' do
|
104
104
|
it 'does not delete Certificate' do
|
105
|
-
subject.stubs(:
|
105
|
+
subject.stubs(:valid?).returns(false)
|
106
106
|
|
107
107
|
subject.expects(:delete_certificate).never
|
108
108
|
subject.delete
|
@@ -112,18 +112,18 @@ class VaultPolicyTest < ActiveSupport::TestCase
|
|
112
112
|
end
|
113
113
|
|
114
114
|
describe '#delete' do
|
115
|
-
context '
|
115
|
+
context 'when valid' do
|
116
116
|
it 'deletes Vault Policy' do
|
117
|
-
subject.stubs(:
|
117
|
+
subject.stubs(:valid?).returns(true)
|
118
118
|
|
119
119
|
subject.expects(:delete_policy).once.with(subject.name)
|
120
120
|
subject.delete
|
121
121
|
end
|
122
122
|
end
|
123
123
|
|
124
|
-
context '
|
124
|
+
context 'when not valid' do
|
125
125
|
it 'does not delete Vault Policy' do
|
126
|
-
subject.stubs(:
|
126
|
+
subject.stubs(:valid?).returns(false)
|
127
127
|
|
128
128
|
subject.expects(:delete_policy).never
|
129
129
|
subject.delete
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: foreman_vault
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- dmTECH GmbH
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-06-
|
11
|
+
date: 2020-06-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: vault
|
@@ -52,7 +52,7 @@ dependencies:
|
|
52
52
|
- - '='
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: 0.54.0
|
55
|
-
description:
|
55
|
+
description:
|
56
56
|
email:
|
57
57
|
- opensource@dm.de
|
58
58
|
executables: []
|
@@ -70,6 +70,7 @@ files:
|
|
70
70
|
- app/lib/foreman_vault/macros.rb
|
71
71
|
- app/models/concerns/foreman_vault/host_extensions.rb
|
72
72
|
- app/models/concerns/foreman_vault/orchestration/vault_policy.rb
|
73
|
+
- app/models/concerns/foreman_vault/provisioning_template_extensions.rb
|
73
74
|
- app/models/setting/vault.rb
|
74
75
|
- app/models/vault_connection.rb
|
75
76
|
- app/services/foreman_vault/vault_auth_method.rb
|
@@ -109,6 +110,7 @@ files:
|
|
109
110
|
- test/jobs/refresh_vault_tokens_test.rb
|
110
111
|
- test/models/foreman_vault/orchestration/vault_policy_test.rb
|
111
112
|
- test/models/vault_connection_test.rb
|
113
|
+
- test/models/vault_policy_template_test.rb
|
112
114
|
- test/test_plugin_helper.rb
|
113
115
|
- test/unit/lib/foreman_vault/macros_test.rb
|
114
116
|
- test/unit/services/foreman_vault/vault_auth_method_test.rb
|
@@ -118,7 +120,7 @@ homepage: https://github.com/dm-drogeriemarkt/foreman_vault
|
|
118
120
|
licenses:
|
119
121
|
- GPL-3.0
|
120
122
|
metadata: {}
|
121
|
-
post_install_message:
|
123
|
+
post_install_message:
|
122
124
|
rdoc_options: []
|
123
125
|
require_paths:
|
124
126
|
- lib
|
@@ -134,7 +136,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
134
136
|
version: '0'
|
135
137
|
requirements: []
|
136
138
|
rubygems_version: 3.1.2
|
137
|
-
signing_key:
|
139
|
+
signing_key:
|
138
140
|
specification_version: 4
|
139
141
|
summary: Adds support for using credentials from Hashicorp Vault
|
140
142
|
test_files:
|
@@ -142,6 +144,7 @@ test_files:
|
|
142
144
|
- test/unit/services/foreman_vault/vault_client_test.rb
|
143
145
|
- test/unit/services/foreman_vault/vault_policy_test.rb
|
144
146
|
- test/unit/services/foreman_vault/vault_auth_method_test.rb
|
147
|
+
- test/models/vault_policy_template_test.rb
|
145
148
|
- test/models/vault_connection_test.rb
|
146
149
|
- test/models/foreman_vault/orchestration/vault_policy_test.rb
|
147
150
|
- test/factories/vault_policy_template.rb
|