foreman_chef 0.8.1 → 0.9.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 +5 -5
- data/app/controllers/foreman_chef/concerns/hosts_controller_extensions.rb +24 -0
- data/app/controllers/foreman_chef/environments_controller.rb +4 -5
- data/app/helpers/foreman_chef/chef_reports_helper.rb +7 -0
- data/app/lib/actions/foreman_chef/host/update.rb +1 -1
- data/app/models/foreman_chef/chef_report_scanner.rb +20 -0
- data/app/models/foreman_chef/concerns/host_extensions.rb +5 -1
- data/app/models/foreman_chef/fact_importer.rb +0 -87
- data/app/models/foreman_chef/fact_name.rb +4 -0
- data/app/models/foreman_chef/fact_parser.rb +13 -2
- data/app/models/setting/foreman_chef.rb +1 -0
- data/lib/foreman_chef/engine.rb +11 -3
- data/lib/foreman_chef/version.rb +1 -1
- metadata +6 -5
- data/app/models/foreman_chef/concerns/host_action_subject.rb +0 -23
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 3fedb5a89f5be407411bf40c5ce91252c61051bece15e3f3b4388fb794672ade
|
4
|
+
data.tar.gz: c9b41183e4474675c612ccb79e3cb94e207c1ecb3f14afd3150dc14853688ee8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 73aa559fd56934944e8eafc4827337d4e25e26d6fd9a1201f5d21b063a8ab963bf3cdedc0144f1ae952d8967857d9181021be22f571ff68b661c9ab05129a3fd
|
7
|
+
data.tar.gz: 33b4941d7907d7c460b9646f1b9e7e74f5368e155ac77c0f3c222bf29c6f4710001aa0f46ae73192e3a72ac06045d849f5b190b35af347ba942f34a7bb34c2b2
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module ForemanChef
|
2
|
+
module Concerns
|
3
|
+
module HostsControllerExtensions
|
4
|
+
extend ActiveSupport::Concern
|
5
|
+
include ForemanTasks::Triggers
|
6
|
+
|
7
|
+
module Overrides
|
8
|
+
def destroy
|
9
|
+
super
|
10
|
+
::ForemanTasks.sync_task ::Actions::ForemanChef::Host::Destroy, @host
|
11
|
+
end
|
12
|
+
|
13
|
+
def update
|
14
|
+
super
|
15
|
+
::ForemanTasks.sync_task ::Actions::ForemanChef::Host::Update, @host
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
included do
|
20
|
+
prepend Overrides
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -12,19 +12,18 @@ module ForemanChef
|
|
12
12
|
@importer = ChefServerImporter.new(opts)
|
13
13
|
@changed = @importer.changes
|
14
14
|
if @changed.values.all?(&:empty?)
|
15
|
-
|
16
|
-
redirect_to foreman_chef_environments_path
|
15
|
+
process_success :success_redirect => foreman_chef_environments_path, :success_msg => _("Nothing to synchronize")
|
17
16
|
end
|
18
17
|
end
|
19
18
|
|
20
19
|
def synchronize
|
21
20
|
proxy = SmartProxy.authorized(:view_smart_proxies).find(params[:proxy])
|
22
21
|
if (errors = ChefServerImporter.new(:chef_proxy => proxy).obsolete_and_new(params[:changed])).empty?
|
23
|
-
|
22
|
+
process_success :success_redirect => foreman_chef_environments_path, :success_msg => _("Successfully updated environments")
|
24
23
|
else
|
25
|
-
|
24
|
+
process_error :redirect => foreman_chef_environments_path, :error_msg => _("Failed to update environments: %s") % errors.to_sentence
|
26
25
|
end
|
27
|
-
|
26
|
+
|
28
27
|
end
|
29
28
|
|
30
29
|
def index
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module ForemanChef
|
2
|
+
# Scans ConfigReports after import for indicators of an Ansible report and
|
3
|
+
# sets the origin of the report to 'Ansible'
|
4
|
+
class ChefReportScanner
|
5
|
+
class << self
|
6
|
+
def scan(report, logs)
|
7
|
+
if (result = chef_report?(logs))
|
8
|
+
report.origin = 'Chef'
|
9
|
+
end
|
10
|
+
|
11
|
+
result
|
12
|
+
end
|
13
|
+
|
14
|
+
def chef_report?(logs)
|
15
|
+
return false if logs.blank?
|
16
|
+
logs.last['log']['sources']['source'] == 'Chef'
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -63,6 +63,10 @@ module ForemanChef
|
|
63
63
|
super.concat(%w(chef_proxy_id chef_environment_id))
|
64
64
|
end
|
65
65
|
|
66
|
+
def action_input_key
|
67
|
+
"host"
|
68
|
+
end
|
69
|
+
|
66
70
|
private
|
67
71
|
|
68
72
|
def load_node_data
|
@@ -73,5 +77,5 @@ module ForemanChef
|
|
73
77
|
end
|
74
78
|
|
75
79
|
class ::Host::Managed::Jail < Safemode::Jail
|
76
|
-
allow :run_list
|
80
|
+
allow :run_list, :chef_proxy, :chef_environment, :chef_private_key
|
77
81
|
end
|
@@ -16,93 +16,6 @@ module ForemanChef
|
|
16
16
|
|
17
17
|
private
|
18
18
|
|
19
|
-
attr_accessor :original_facts
|
20
|
-
|
21
|
-
def logger
|
22
|
-
Foreman::Logging.logger('foreman_chef')
|
23
|
-
end
|
24
|
-
|
25
|
-
def add_new_facts
|
26
|
-
@counters[:added] = 0
|
27
|
-
add_missing_facts(Sparser.new.unsparse(original_facts))
|
28
|
-
logger.debug("Merging facts for '#{host}': added #{@counters[:added]} facts")
|
29
|
-
end
|
30
|
-
|
31
|
-
def add_missing_facts(tree_hash, parent = nil, prefix = '')
|
32
|
-
tree_hash.each do |name, value|
|
33
|
-
name_with_prefix = prefix.empty? ? name : prefix + FactName::SEPARATOR + name
|
34
|
-
|
35
|
-
compose = value.is_a?(Hash)
|
36
|
-
if fact_names[name_with_prefix].present?
|
37
|
-
fact_name_id = fact_names[name_with_prefix]
|
38
|
-
else
|
39
|
-
# fact names didn't contain fact_name so we create new one
|
40
|
-
fact_name = fact_name_class.new(:name => name_with_prefix,
|
41
|
-
:parent_id => parent,
|
42
|
-
:compose => compose)
|
43
|
-
if fact_name.save
|
44
|
-
fact_name_id = fact_name.id
|
45
|
-
elsif fact_name.errors[:name].present?
|
46
|
-
# saving could have failed because of raise condition with another import process,
|
47
|
-
# so if the error is on name uniqueness, we try to reload conflicting name and use it
|
48
|
-
conflicting_fact_name = fact_name_class.where(:name => fact_name.name).first
|
49
|
-
fact_name_id = conflicting_fact_name.id
|
50
|
-
else
|
51
|
-
raise FactNameImportError, "unable to save fact name, errors: #{fact_name.errors.full_messages.join("\n")}"
|
52
|
-
end
|
53
|
-
fact_name_id
|
54
|
-
end
|
55
|
-
|
56
|
-
if compose
|
57
|
-
add_fact(name_with_prefix, nil, fact_name_id)
|
58
|
-
add_missing_facts(value, fact_name_id, name_with_prefix)
|
59
|
-
else
|
60
|
-
add_fact(name_with_prefix, value, fact_name_id)
|
61
|
-
end
|
62
|
-
end
|
63
|
-
end
|
64
|
-
|
65
|
-
def add_fact(name, value, fact_name_id)
|
66
|
-
if facts_to_create.include?(name)
|
67
|
-
host.fact_values.send(method,
|
68
|
-
:value => value, :fact_name_id => fact_name_id)
|
69
|
-
@counters[:added] += 1
|
70
|
-
end
|
71
|
-
end
|
72
|
-
|
73
|
-
def facts_to_create
|
74
|
-
@facts_to_create ||= facts.keys - db_facts.pluck('fact_names.name')
|
75
|
-
end
|
76
|
-
|
77
|
-
def fact_names
|
78
|
-
@fact_names ||= fact_name_class.group(:name).maximum(:id)
|
79
|
-
end
|
80
|
-
|
81
|
-
# if the host does not exists yet, we don't have an host_id to use the fact_values table.
|
82
|
-
def method
|
83
|
-
@method ||= host.new_record? ? :build : :create!
|
84
|
-
end
|
85
|
-
|
86
|
-
def normalize(facts)
|
87
|
-
@original_facts = super(facts)
|
88
|
-
@facts = completify(@original_facts)
|
89
|
-
end
|
90
|
-
|
91
|
-
def completify(hash)
|
92
|
-
new_facts = hash.dup
|
93
|
-
hash.each do |fact_name, value|
|
94
|
-
name_parts = fact_name.split(FactName::SEPARATOR)
|
95
|
-
|
96
|
-
name_parts.inject([]) do |memo, name|
|
97
|
-
memo = memo + [name]
|
98
|
-
key = memo.join(FactName::SEPARATOR)
|
99
|
-
new_facts[key] ||= name_parts == memo ? value : nil
|
100
|
-
memo
|
101
|
-
end
|
102
|
-
end
|
103
|
-
new_facts
|
104
|
-
end
|
105
|
-
|
106
19
|
class Sparser
|
107
20
|
def sparse(hash, options={})
|
108
21
|
hash.map do |k, v|
|
@@ -22,6 +22,13 @@ module ForemanChef
|
|
22
22
|
release_name = facts['lsb::codename']
|
23
23
|
end
|
24
24
|
|
25
|
+
# convert OHAI names to Foreman common OS names
|
26
|
+
case os_name
|
27
|
+
when 'RedHatEnterpriseServer'
|
28
|
+
os_name = 'RedHat'
|
29
|
+
end
|
30
|
+
|
31
|
+
|
25
32
|
# So far only CentOS needs exception
|
26
33
|
case os_name
|
27
34
|
when 'CentOS'
|
@@ -85,6 +92,10 @@ module ForemanChef
|
|
85
92
|
support_interfaces_parsing? && !Setting['ignore_puppet_facts_for_provisioning']
|
86
93
|
end
|
87
94
|
|
95
|
+
def boot_timestamp
|
96
|
+
Time.zone.now.to_i - facts['system_uptime::seconds'].to_i
|
97
|
+
end
|
98
|
+
|
88
99
|
private
|
89
100
|
|
90
101
|
def logger
|
@@ -122,11 +133,11 @@ module ForemanChef
|
|
122
133
|
end
|
123
134
|
|
124
135
|
def network_hash
|
125
|
-
@network_hash ||= ForemanChef::FactImporter::Sparser.new.unsparse(facts.select { |k, v| k =~ /\Anetwork::interfaces::/})['network'
|
136
|
+
@network_hash ||= ForemanChef::FactImporter::Sparser.new.unsparse(facts.select { |k, v| k =~ /\Anetwork::interfaces::/}).try(:[], 'network') || {}
|
126
137
|
end
|
127
138
|
|
128
139
|
def interfaces_hash
|
129
|
-
@interfaces_hash ||= network_hash['interfaces'
|
140
|
+
@interfaces_hash ||= network_hash.try(:[], 'interfaces') || {}
|
130
141
|
end
|
131
142
|
|
132
143
|
# adds attributes like virtual
|
@@ -6,6 +6,7 @@ class Setting::ForemanChef < Setting
|
|
6
6
|
|
7
7
|
self.transaction do
|
8
8
|
[
|
9
|
+
self.set('chef_interval', N_("Duration in minutes after servers reporting via Chef are classed as out of sync."), 60),
|
9
10
|
self.set('auto_deletion', N_("Enable the auto deletion of mapped objects in chef-server through foreman-proxy (currently node and client upon host deletion, client on host rebuild)"), true),
|
10
11
|
self.set('validation_bootstrap_method', N_("Use validation.pem or create client directly storing private key in Foreman DB)"), true),
|
11
12
|
].each { |s| self.create! s.update(:category => "Setting::ForemanChef")}
|
data/lib/foreman_chef/engine.rb
CHANGED
@@ -13,7 +13,7 @@ module ForemanChef
|
|
13
13
|
end
|
14
14
|
end
|
15
15
|
|
16
|
-
config.autoload_paths += Dir["#{config.root}/app/helpers
|
16
|
+
config.autoload_paths += Dir["#{config.root}/app/helpers"]
|
17
17
|
|
18
18
|
# Precompile any JS or CSS files under app/assets/
|
19
19
|
# If requiring files from each other, list them explicitly here to avoid precompiling the same
|
@@ -47,7 +47,7 @@ module ForemanChef
|
|
47
47
|
|
48
48
|
initializer 'foreman_chef.register_plugin', :before => :finisher_hook do |app|
|
49
49
|
Foreman::Plugin.register :foreman_chef do
|
50
|
-
requires_foreman '>= 1.
|
50
|
+
requires_foreman '>= 1.24'
|
51
51
|
extend_template_helpers ForemanChef::Concerns::Renderer
|
52
52
|
|
53
53
|
permission :import_chef_environments, { :environments => [:import, :synchronize] }, :resource_type => 'ForemanChef::Environment'
|
@@ -69,6 +69,9 @@ module ForemanChef
|
|
69
69
|
if ForemanChef.with_remote_execution? && Gem::Version.new(ForemanRemoteExecution::VERSION) >= Gem::Version.new('1.2.3')
|
70
70
|
RemoteExecutionFeature.register(:foreman_chef_run_chef_client, N_("Run chef-client Once"), :description => N_("Run chef-client once"), :host_action_button => true)
|
71
71
|
end
|
72
|
+
|
73
|
+
register_report_scanner ForemanChef::ChefReportScanner
|
74
|
+
register_report_origin 'Chef', 'ConfigReport'
|
72
75
|
end
|
73
76
|
end
|
74
77
|
|
@@ -76,6 +79,10 @@ module ForemanChef
|
|
76
79
|
ActionView::Base.send :include, ChefProxyForm
|
77
80
|
end
|
78
81
|
|
82
|
+
initializer 'foreman_chef.chef_reports_helper' do |app|
|
83
|
+
ActionView::Base.send :include, ChefReportsHelper
|
84
|
+
end
|
85
|
+
|
79
86
|
initializer 'foreman_chef.dynflow_world', :before => 'foreman_tasks.initialize_dynflow' do |app|
|
80
87
|
ForemanTasks.dynflow.require!
|
81
88
|
end
|
@@ -93,8 +100,9 @@ module ForemanChef
|
|
93
100
|
::Host::Managed.send :prepend, ForemanChef::Concerns::HostExtensions
|
94
101
|
::Hostgroup.send :include, ForemanChef::Concerns::HostgroupExtensions
|
95
102
|
::SmartProxy.send :prepend, ForemanChef::Concerns::SmartProxyExtensions
|
96
|
-
::Host::Managed.send :prepend, ForemanChef::Concerns::HostActionSubject
|
97
103
|
::Host::Managed.send :prepend, ForemanChef::Concerns::HostBuild
|
104
|
+
::HostsController.send :include, ForemanChef::Concerns::HostsControllerExtensions
|
105
|
+
::Api::V2::HostsController.send :include, ForemanChef::Concerns::HostsControllerExtensions
|
98
106
|
::HostsController.send :prepend, ForemanChef::Concerns::HostsControllerRescuer
|
99
107
|
|
100
108
|
::Host::Managed.send :include, ForemanChef::Concerns::Renderer
|
data/lib/foreman_chef/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: foreman_chef
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.9.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Marek Hulan
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2019-09-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: deface
|
@@ -69,9 +69,11 @@ files:
|
|
69
69
|
- app/assets/javascripts/foreman_chef/jsoneditor.js.map
|
70
70
|
- app/controllers/foreman_chef/application_controller.rb
|
71
71
|
- app/controllers/foreman_chef/concerns/environment_parameters.rb
|
72
|
+
- app/controllers/foreman_chef/concerns/hosts_controller_extensions.rb
|
72
73
|
- app/controllers/foreman_chef/concerns/hosts_controller_rescuer.rb
|
73
74
|
- app/controllers/foreman_chef/environments_controller.rb
|
74
75
|
- app/helpers/foreman_chef/chef_proxy_form.rb
|
76
|
+
- app/helpers/foreman_chef/chef_reports_helper.rb
|
75
77
|
- app/lib/actions/foreman_chef/client/create.rb
|
76
78
|
- app/lib/actions/foreman_chef/client/destroy.rb
|
77
79
|
- app/lib/actions/foreman_chef/host/destroy.rb
|
@@ -79,7 +81,7 @@ files:
|
|
79
81
|
- app/lib/actions/foreman_chef/node/update.rb
|
80
82
|
- app/lib/proxy_api/foreman_chef/chef_proxy.rb
|
81
83
|
- app/models/foreman_chef/cached_run_list.rb
|
82
|
-
- app/models/foreman_chef/
|
84
|
+
- app/models/foreman_chef/chef_report_scanner.rb
|
83
85
|
- app/models/foreman_chef/concerns/host_and_hostgroup_extensions.rb
|
84
86
|
- app/models/foreman_chef/concerns/host_build.rb
|
85
87
|
- app/models/foreman_chef/concerns/host_extensions.rb
|
@@ -139,8 +141,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
139
141
|
- !ruby/object:Gem::Version
|
140
142
|
version: '0'
|
141
143
|
requirements: []
|
142
|
-
|
143
|
-
rubygems_version: 2.6.8
|
144
|
+
rubygems_version: 3.0.3
|
144
145
|
signing_key:
|
145
146
|
specification_version: 4
|
146
147
|
summary: Plugin for Chef integration with Foreman
|
@@ -1,23 +0,0 @@
|
|
1
|
-
module ForemanChef
|
2
|
-
module Concerns
|
3
|
-
module HostActionSubject
|
4
|
-
def update_action
|
5
|
-
sync_action!
|
6
|
-
::Actions::ForemanChef::Host::Update
|
7
|
-
end
|
8
|
-
|
9
|
-
def destroy_action
|
10
|
-
sync_action!
|
11
|
-
::Actions::ForemanChef::Host::Destroy
|
12
|
-
end
|
13
|
-
|
14
|
-
def action_input_key
|
15
|
-
"host"
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
class ::Host::Managed::Jail < Safemode::Jail
|
22
|
-
allow :chef_proxy, :chef_environment, :chef_private_key
|
23
|
-
end
|