foreman_salt 14.0.0 → 15.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +1 -2
- data/Rakefile +2 -2
- data/app/controllers/foreman_salt/api/v2/jobs_controller.rb +9 -9
- data/app/controllers/foreman_salt/api/v2/salt_autosign_controller.rb +15 -14
- data/app/controllers/foreman_salt/api/v2/salt_environments_controller.rb +6 -6
- data/app/controllers/foreman_salt/api/v2/salt_hostgroups_controller.rb +42 -0
- data/app/controllers/foreman_salt/api/v2/salt_keys_controller.rb +14 -14
- data/app/controllers/foreman_salt/api/v2/salt_minions_controller.rb +8 -8
- data/app/controllers/foreman_salt/api/v2/salt_states_controller.rb +24 -26
- data/app/controllers/foreman_salt/api/v2/salt_variables_controller.rb +22 -21
- data/app/controllers/foreman_salt/concerns/hostgroups_controller_extensions.rb +3 -3
- data/app/controllers/foreman_salt/concerns/hosts_controller_extensions.rb +4 -4
- data/app/controllers/foreman_salt/concerns/salt_environment_parameters.rb +1 -1
- data/app/controllers/foreman_salt/concerns/salt_hostgroup_parameters.rb +25 -0
- data/app/controllers/foreman_salt/concerns/salt_module_parameters.rb +1 -1
- data/app/controllers/foreman_salt/concerns/salt_override_value.rb +4 -4
- data/app/controllers/foreman_salt/concerns/salt_variable_parameters.rb +5 -5
- data/app/controllers/foreman_salt/minions_controller.rb +9 -20
- data/app/controllers/foreman_salt/salt_autosign_controller.rb +8 -8
- data/app/controllers/foreman_salt/salt_environments_controller.rb +4 -4
- data/app/controllers/foreman_salt/salt_keys_controller.rb +11 -11
- data/app/controllers/foreman_salt/salt_modules_controller.rb +10 -11
- data/app/controllers/foreman_salt/salt_variables_controller.rb +5 -4
- data/app/controllers/foreman_salt/state_importer.rb +12 -13
- data/app/helpers/concerns/foreman_salt/hosts_helper_extensions.rb +13 -21
- data/app/helpers/concerns/foreman_salt/smart_proxies_helper_extensions.rb +2 -2
- data/app/helpers/foreman_salt/salt_keys_helper.rb +2 -1
- data/app/helpers/foreman_salt/salt_modules_helper.rb +11 -11
- data/app/helpers/foreman_salt/salt_reports_helper.rb +0 -1
- data/app/lib/actions/foreman_salt/report_import.rb +2 -2
- data/app/lib/proxy_api/salt.rb +17 -17
- data/app/models/foreman_salt/concerns/host_managed_extensions.rb +46 -56
- data/app/models/foreman_salt/concerns/hostgroup_extensions.rb +14 -11
- data/app/models/foreman_salt/host_salt_module.rb +1 -1
- data/app/models/foreman_salt/salt_environment.rb +8 -8
- data/app/models/foreman_salt/salt_module.rb +15 -13
- data/app/models/foreman_salt/salt_module_environment.rb +1 -1
- data/app/models/foreman_salt/salt_provider.rb +7 -4
- data/app/models/foreman_salt/salt_variable.rb +8 -8
- data/app/overrides/salt_environment_host_selector.rb +4 -4
- data/app/overrides/salt_environment_hostgroup_selector.rb +4 -4
- data/app/overrides/salt_modules_selector.rb +16 -16
- data/app/overrides/salt_proxy_selector.rb +11 -9
- data/app/services/foreman_salt/report_importer.rb +30 -30
- data/app/services/foreman_salt/smart_proxies/salt_keys.rb +47 -45
- data/app/views/foreman_salt/api/v2/salt_autosign/create.json.rabl +1 -1
- data/app/views/foreman_salt/api/v2/salt_environments/create.json.rabl +1 -1
- data/app/views/foreman_salt/api/v2/salt_environments/show.json.rabl +1 -1
- data/app/views/foreman_salt/api/v2/salt_hostgroups/base.json.rabl +7 -0
- data/app/views/foreman_salt/api/v2/salt_hostgroups/show.json.rabl +3 -0
- data/app/views/foreman_salt/api/v2/salt_hostgroups/update.json.rabl +3 -0
- data/app/views/foreman_salt/api/v2/salt_keys/update.json.rabl +1 -1
- data/app/views/foreman_salt/api/v2/salt_minions/show.json.rabl +3 -4
- data/app/views/foreman_salt/api/v2/salt_states/create.json.rabl +1 -1
- data/app/views/foreman_salt/api/v2/salt_states/show.json.rabl +0 -1
- data/app/views/foreman_salt/api/v2/salt_variables/create.json.rabl +1 -1
- data/app/views/foreman_salt/api/v2/salt_variables/destroy.json.rabl +1 -1
- data/app/views/foreman_salt/api/v2/salt_variables/show.json.rabl +8 -8
- data/app/views/foreman_salt/salt_autosign/index.html.erb +1 -2
- data/app/views/foreman_salt/salt_environments/index.html.erb +1 -3
- data/app/views/foreman_salt/salt_keys/index.erb +1 -3
- data/app/views/foreman_salt/salt_modules/index.html.erb +1 -2
- data/config/api_routes.rb +31 -0
- data/config/routes.rb +16 -44
- data/db/migrate/20140817210214_create_salt_modules.rb +4 -4
- data/db/migrate/20140829210214_add_salt_modules_to_hostgroups.rb +1 -1
- data/db/migrate/20140920232200_create_salt_environments.rb +3 -3
- data/db/migrate/20150220122707_fix_incorrect_report_metrics.rb +6 -2
- data/db/migrate/20211108211312_add_missing_permissions.rb +9 -0
- data/db/migrate/20220118160349_drop_salt_hide_run_salt_button_setting.rb +5 -0
- data/db/migrate/20220406185204_fix_salt_setting_category_to_dsl.rb +5 -0
- data/db/seeds.d/75-salt_seeds.rb +1 -1
- data/db/seeds.d/76-job_templates.rb +7 -5
- data/lib/foreman_salt/engine.rb +17 -19
- data/lib/foreman_salt/extensions.rb +8 -8
- data/lib/foreman_salt/plugin.rb +130 -114
- data/lib/foreman_salt/version.rb +1 -1
- data/lib/foreman_salt.rb +1 -1
- data/lib/tasks/foreman_salt_tasks.rake +3 -5
- data/locale/action_names.rb +4 -4
- data/test/factories/foreman_salt_factories.rb +5 -5
- data/test/functional/api/v2/salt_autosign_controller_test.rb +26 -20
- data/test/functional/api/v2/salt_environments_controller_test.rb +29 -23
- data/test/functional/api/v2/salt_hostgroups_controller_test.rb +76 -0
- data/test/functional/api/v2/salt_keys_controller_test.rb +25 -19
- data/test/functional/api/v2/salt_states_controller_test.rb +72 -66
- data/test/functional/api/v2/salt_variables_controller_test.rb +4 -4
- data/test/functional/hosts_controller_test.rb +26 -26
- data/test/functional/minions_controller_test.rb +23 -24
- data/test/functional/salt_modules_controller_test.rb +3 -3
- data/test/functional/salt_variables_controller_test.rb +5 -5
- data/test/integration/hosts_js_test.rb +7 -23
- data/test/integration/salt_autosign_test.rb +5 -6
- data/test/integration/salt_environment_test.rb +2 -2
- data/test/integration/salt_keys_test.rb +7 -8
- data/test/integration/salt_module_test.rb +9 -9
- data/test/integration/salt_variable_test.rb +2 -2
- data/test/test_plugin_helper.rb +1 -1
- data/test/unit/grains_importer_test.rb +13 -13
- data/test/unit/host_extensions_test.rb +21 -19
- data/test/unit/hostgroup_extensions_test.rb +13 -13
- data/test/unit/report_importer_test.rb +9 -9
- data/test/unit/salt_keys_test.rb +2 -2
- data/test/unit/salt_modules_test.rb +2 -2
- data/test/unit/salt_variables_test.rb +10 -10
- metadata +24 -14
- data/app/models/setting/salt.rb +0 -13
@@ -10,11 +10,11 @@ module ForemanSalt
|
|
10
10
|
class_methods do
|
11
11
|
def salt_variable_params_filter
|
12
12
|
Foreman::ParameterFilter.new(::ForemanSalt::SaltVariable).tap do |filter|
|
13
|
-
filter.permit :salt_module_id, :
|
14
|
-
|
15
|
-
|
16
|
-
filter.permit_by_context :required, :
|
17
|
-
filter.permit_by_context :id, :
|
13
|
+
filter.permit :salt_module_id, salt_modules: [], salt_module_ids: [],
|
14
|
+
salt_module_names: [], param_classes: [], param_classes_ids: [],
|
15
|
+
param_classes_names: []
|
16
|
+
filter.permit_by_context :required, nested: true
|
17
|
+
filter.permit_by_context :id, ui: false, api: false, nested: true
|
18
18
|
add_lookup_key_params_filter(filter)
|
19
19
|
end
|
20
20
|
end
|
@@ -3,8 +3,8 @@ module ForemanSalt
|
|
3
3
|
include ::Foreman::Controller::SmartProxyAuth
|
4
4
|
include ::Foreman::Controller::Parameters::Host
|
5
5
|
|
6
|
-
before_action :find_resource, :
|
7
|
-
add_smart_proxy_filters :node, :
|
6
|
+
before_action :find_resource, only: %i[node]
|
7
|
+
add_smart_proxy_filters :node, features: 'Salt'
|
8
8
|
|
9
9
|
def node
|
10
10
|
enc = {}
|
@@ -19,28 +19,19 @@ module ForemanSalt
|
|
19
19
|
|
20
20
|
enc['environment'] = env
|
21
21
|
respond_to do |format|
|
22
|
-
format.html { render :
|
23
|
-
format.yml { render :
|
22
|
+
format.html { render plain: "<pre>#{ERB::Util.html_escape(enc.to_yaml)}</pre>" }
|
23
|
+
format.yml { render plain: enc.to_yaml }
|
24
24
|
end
|
25
|
-
rescue
|
25
|
+
rescue StandardError
|
26
26
|
logger.warn "Failed to generate external nodes for #{@minion} with #{$ERROR_INFO}"
|
27
|
-
render(:
|
28
|
-
end
|
29
|
-
|
30
|
-
def run
|
31
|
-
if @minion.saltrun!
|
32
|
-
success _('Successfully executed, check log files for more details')
|
33
|
-
else
|
34
|
-
error @minion.errors[:base].to_sentence
|
35
|
-
end
|
36
|
-
redirect_to host_path(@minion)
|
27
|
+
render(plain: _('Unable to generate output, Check log files\n'), status: :precondition_failed) && return
|
37
28
|
end
|
38
29
|
|
39
30
|
def salt_environment_selected
|
40
31
|
if params[:host][:salt_environment_id].present?
|
41
32
|
@salt_environment = ::ForemanSalt::SaltEnvironment.friendly.find(params[:host][:salt_environment_id])
|
42
33
|
load_ajax_vars
|
43
|
-
render :
|
34
|
+
render partial: 'foreman_salt/salt_modules/host_tab_pane'
|
44
35
|
else
|
45
36
|
logger.info 'environment_id is required to render states'
|
46
37
|
end
|
@@ -48,8 +39,6 @@ module ForemanSalt
|
|
48
39
|
|
49
40
|
def action_permission
|
50
41
|
case params[:action]
|
51
|
-
when 'run'
|
52
|
-
:saltrun
|
53
42
|
when 'node'
|
54
43
|
:view
|
55
44
|
when 'salt_environment_selected'
|
@@ -70,7 +59,7 @@ module ForemanSalt
|
|
70
59
|
private
|
71
60
|
|
72
61
|
def load_ajax_vars
|
73
|
-
@minion = Host::Base.authorized(:view_hosts, Host).
|
62
|
+
@minion = Host::Base.authorized(:view_hosts, Host).find_by(id: params[:host_id])
|
74
63
|
if @minion
|
75
64
|
unless @minion.is_a?(Host::Managed)
|
76
65
|
@minion = @minion.becomes(Host::Managed)
|
@@ -82,7 +71,7 @@ module ForemanSalt
|
|
82
71
|
end
|
83
72
|
|
84
73
|
@obj = @minion
|
85
|
-
@inherited_salt_modules = @salt_environment.salt_modules.where(:
|
74
|
+
@inherited_salt_modules = @salt_environment.salt_modules.where(id: @minion.hostgroup ? @minion.hostgroup.all_salt_modules : [])
|
86
75
|
@salt_modules = @salt_environment.salt_modules - @inherited_salt_modules
|
87
76
|
@selected = @minion.salt_modules || []
|
88
77
|
end
|
@@ -3,7 +3,7 @@ module ForemanSalt
|
|
3
3
|
def index
|
4
4
|
setup
|
5
5
|
autosign = @api.autosign_list
|
6
|
-
@autosign = autosign.paginate :
|
6
|
+
@autosign = autosign.paginate page: params[:page], per_page: Setting[:entries_per_page]
|
7
7
|
end
|
8
8
|
|
9
9
|
def new
|
@@ -14,10 +14,10 @@ module ForemanSalt
|
|
14
14
|
setup
|
15
15
|
|
16
16
|
if @api.autosign_create(params[:id])
|
17
|
-
process_success(:
|
18
|
-
:
|
17
|
+
process_success(success_redirect: hash_for_smart_proxy_salt_autosign_index_path, success_msg: _("Autosign created for #{params[:id]}"),
|
18
|
+
object_name: params[:id])
|
19
19
|
else
|
20
|
-
process_error(:
|
20
|
+
process_error(redirect: hash_for_smart_proxy_salt_autosign_index_path)
|
21
21
|
end
|
22
22
|
end
|
23
23
|
|
@@ -25,10 +25,10 @@ module ForemanSalt
|
|
25
25
|
setup
|
26
26
|
|
27
27
|
if @api.autosign_remove(params[:id])
|
28
|
-
process_success(:
|
29
|
-
:
|
28
|
+
process_success(success_redirect: hash_for_smart_proxy_salt_autosign_index_path, success_msg: _("Autosign deleted for #{params[:id]}"),
|
29
|
+
object_name: params[:id])
|
30
30
|
else
|
31
|
-
process_error(:
|
31
|
+
process_error(redirect: hash_for_smart_proxy_salt_autosign_index_path)
|
32
32
|
end
|
33
33
|
end
|
34
34
|
|
@@ -36,7 +36,7 @@ module ForemanSalt
|
|
36
36
|
|
37
37
|
def setup
|
38
38
|
@proxy = SmartProxy.authorized(:view_smart_proxies_salt_autosign).find(params[:smart_proxy_id])
|
39
|
-
@api = ProxyAPI::Salt.new(:
|
39
|
+
@api = ProxyAPI::Salt.new(url: @proxy.url)
|
40
40
|
end
|
41
41
|
end
|
42
42
|
end
|
@@ -3,10 +3,10 @@ module ForemanSalt
|
|
3
3
|
include Foreman::Controller::AutoCompleteSearch
|
4
4
|
include ::ForemanSalt::Concerns::SaltEnvironmentParameters
|
5
5
|
|
6
|
-
before_action :find_resource, :
|
6
|
+
before_action :find_resource, only: %i[edit update destroy]
|
7
7
|
|
8
8
|
def index
|
9
|
-
@salt_environments = resource_base.search_for(params[:search], :
|
9
|
+
@salt_environments = resource_base.search_for(params[:search], order: params[:order]).paginate(page: params[:page])
|
10
10
|
end
|
11
11
|
|
12
12
|
def new
|
@@ -26,8 +26,8 @@ module ForemanSalt
|
|
26
26
|
end
|
27
27
|
|
28
28
|
def update
|
29
|
-
if @salt_environment.
|
30
|
-
success _(
|
29
|
+
if @salt_environment.update(salt_environment_params)
|
30
|
+
success _("Successfully updated #{@salt_environment}")
|
31
31
|
redirect_to salt_environments_path
|
32
32
|
else
|
33
33
|
process_error
|
@@ -7,19 +7,19 @@ module ForemanSalt
|
|
7
7
|
keys = if params[:state].blank?
|
8
8
|
SmartProxies::SaltKeys.all @proxy
|
9
9
|
else
|
10
|
-
SmartProxies::SaltKeys.find_by_state
|
10
|
+
SmartProxies::SaltKeys.find_by_state(@proxy, params[:state].downcase)
|
11
11
|
end
|
12
|
-
@keys = keys.sort.paginate :
|
12
|
+
@keys = keys.sort.paginate page: params[:page], per_page: Setting[:entries_per_page]
|
13
13
|
end
|
14
14
|
|
15
15
|
def accept
|
16
16
|
@proxy = find_proxy(:edit_smart_proxies_salt_keys)
|
17
17
|
key = SmartProxies::SaltKeys.find(@proxy, params[:salt_key_id])
|
18
18
|
if key.accept
|
19
|
-
process_success(:
|
20
|
-
:
|
19
|
+
process_success(success_redirect: hash_for_smart_proxy_salt_keys_path(state: params[:state], expire_cache: true),
|
20
|
+
success_msg: _("Key accepted for #{key}"), object_name: key.to_s)
|
21
21
|
else
|
22
|
-
process_error(:
|
22
|
+
process_error(redirect: hash_for_smart_proxy_salt_keys_path(state: params[:state], expire_cache: true))
|
23
23
|
end
|
24
24
|
end
|
25
25
|
|
@@ -27,10 +27,10 @@ module ForemanSalt
|
|
27
27
|
@proxy = find_proxy(:edit_smart_proxies_salt_keys)
|
28
28
|
key = SmartProxies::SaltKeys.find(@proxy, params[:salt_key_id])
|
29
29
|
if key.reject
|
30
|
-
process_success(:
|
31
|
-
:
|
30
|
+
process_success(success_redirect: hash_for_smart_proxy_salt_keys_path(state: params[:state], expire_cache: true),
|
31
|
+
success_msg: _("Key rejected for #{key}"), object_name: key.to_s)
|
32
32
|
else
|
33
|
-
process_error(:
|
33
|
+
process_error(redirect: hash_for_smart_proxy_salt_keys_path(state: params[:state], expire_cache: true))
|
34
34
|
end
|
35
35
|
end
|
36
36
|
|
@@ -38,10 +38,10 @@ module ForemanSalt
|
|
38
38
|
@proxy = find_proxy(:destroy_smart_proxies_salt_keys)
|
39
39
|
key = SmartProxies::SaltKeys.find(@proxy, params[:id])
|
40
40
|
if key.delete
|
41
|
-
process_success(:
|
42
|
-
:
|
41
|
+
process_success(success_redirect: hash_for_smart_proxy_salt_keys_path(state: params[:state], expire_cache: true),
|
42
|
+
success_msg: _("Key deleted for #{key}"), object_name: key.to_s)
|
43
43
|
else
|
44
|
-
process_error(:
|
44
|
+
process_error(redirect: hash_for_smart_proxy_salt_keys_path(state: params[:state], expire_cache: true))
|
45
45
|
end
|
46
46
|
end
|
47
47
|
|
@@ -4,11 +4,11 @@ module ForemanSalt
|
|
4
4
|
include ::ForemanSalt::Concerns::SaltModuleParameters
|
5
5
|
include StateImporter
|
6
6
|
|
7
|
-
before_action :find_resource, :
|
8
|
-
before_action :find_proxy, :
|
7
|
+
before_action :find_resource, only: %i[edit update destroy]
|
8
|
+
before_action :find_proxy, only: :import
|
9
9
|
|
10
10
|
def index
|
11
|
-
@salt_modules = resource_base.search_for(params[:search], :
|
11
|
+
@salt_modules = resource_base.search_for(params[:search], order: params[:order]).includes(:salt_environments).paginate(page: params[:page])
|
12
12
|
end
|
13
13
|
|
14
14
|
def new
|
@@ -30,8 +30,8 @@ module ForemanSalt
|
|
30
30
|
end
|
31
31
|
|
32
32
|
def update
|
33
|
-
if @salt_module.
|
34
|
-
success _(
|
33
|
+
if @salt_module.update(salt_module_params)
|
34
|
+
success _("Successfully updated #{@salt_module}.")
|
35
35
|
redirect_to salt_modules_path
|
36
36
|
else
|
37
37
|
process_error
|
@@ -62,10 +62,9 @@ module ForemanSalt
|
|
62
62
|
@changes = result[:changes]
|
63
63
|
@deletes = result[:deletes]
|
64
64
|
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
end
|
65
|
+
return unless @changes.empty?
|
66
|
+
info _('No changes found')
|
67
|
+
redirect_to salt_modules_path
|
69
68
|
end
|
70
69
|
|
71
70
|
def apply_changes
|
@@ -75,8 +74,8 @@ module ForemanSalt
|
|
75
74
|
params[:changed].each do |environment, states|
|
76
75
|
next unless states[:add] || states[:remove]
|
77
76
|
|
78
|
-
add_to_environment(JSON.
|
79
|
-
remove_from_environment(JSON.
|
77
|
+
add_to_environment(JSON.parse(states[:add]), environment) if states[:add]
|
78
|
+
remove_from_environment(JSON.parse(states[:remove]), environment) if states[:remove]
|
80
79
|
end
|
81
80
|
|
82
81
|
clean_orphans
|
@@ -6,12 +6,12 @@ module ForemanSalt
|
|
6
6
|
include Foreman::Controller::AutoCompleteSearch
|
7
7
|
include ::ForemanSalt::Concerns::SaltVariableParameters
|
8
8
|
|
9
|
-
before_action :find_resource, :
|
9
|
+
before_action :find_resource, only: %i[edit update destroy], if: proc { params[:id] }
|
10
10
|
|
11
11
|
def index
|
12
12
|
@salt_variables = resource_base.search_for(params[:search],
|
13
|
-
|
14
|
-
|
13
|
+
order: params[:order]).paginate(page: params[:page],
|
14
|
+
per_page: params[:per_page])
|
15
15
|
end
|
16
16
|
|
17
17
|
def new
|
@@ -33,7 +33,8 @@ module ForemanSalt
|
|
33
33
|
|
34
34
|
private
|
35
35
|
|
36
|
-
def default_order
|
36
|
+
def default_order
|
37
|
+
end
|
37
38
|
|
38
39
|
def resource
|
39
40
|
@salt_variable
|
@@ -10,10 +10,10 @@ module ForemanSalt
|
|
10
10
|
end
|
11
11
|
|
12
12
|
def fetch_states_from_proxy(proxy, environments = nil)
|
13
|
-
result = { :
|
14
|
-
:
|
13
|
+
result = { changes: {},
|
14
|
+
deletes: [] }
|
15
15
|
|
16
|
-
new = ProxyAPI::Salt.new(:
|
16
|
+
new = ProxyAPI::Salt.new(url: proxy.url).states_list
|
17
17
|
old = SaltModule.to_hash
|
18
18
|
|
19
19
|
environments ||= new.keys + old.keys
|
@@ -30,26 +30,25 @@ module ForemanSalt
|
|
30
30
|
removed = []
|
31
31
|
end
|
32
32
|
|
33
|
-
|
34
|
-
|
33
|
+
next unless added.any? || removed.any?
|
34
|
+
result[:changes][environment] = {}
|
35
35
|
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
end
|
40
|
-
|
41
|
-
result[:changes][environment][:add] = added unless added.blank?
|
36
|
+
if removed.present?
|
37
|
+
result[:changes][environment][:remove] = removed
|
38
|
+
result[:deletes] << environment if removed.count == old[environment].count && added.blank?
|
42
39
|
end
|
40
|
+
|
41
|
+
result[:changes][environment][:add] = added if added.present?
|
43
42
|
end
|
44
43
|
|
45
44
|
result
|
46
45
|
end
|
47
46
|
|
48
47
|
def add_to_environment(states, environment)
|
49
|
-
environment = SaltEnvironment.where(:
|
48
|
+
environment = SaltEnvironment.where(name: environment).first_or_create
|
50
49
|
|
51
50
|
states.each do |state_name|
|
52
|
-
state = SaltModule.where(:
|
51
|
+
state = SaltModule.where(name: state_name).first_or_create
|
53
52
|
state.salt_environments << environment unless state.salt_environments.include? environment
|
54
53
|
end
|
55
54
|
end
|
@@ -5,29 +5,19 @@ module ForemanSalt
|
|
5
5
|
module Overrides
|
6
6
|
def show_appropriate_host_buttons(host)
|
7
7
|
(super(host) +
|
8
|
-
[(
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
def host_title_actions(host)
|
13
|
-
unless Setting[:salt_hide_run_salt_button]
|
14
|
-
title_actions(
|
15
|
-
button_group(
|
16
|
-
if host.try(:salt_proxy)
|
17
|
-
link_to_if_authorized(_('Run Salt'), { :controller => :'foreman_salt/minions', :action => :run, :id => host },
|
18
|
-
:title => _('Trigger a state.highstate run on a node'), :class => 'btn btn-primary')
|
19
|
-
end
|
20
|
-
)
|
21
|
-
)
|
22
|
-
end
|
23
|
-
super(host)
|
8
|
+
[(if host.salt_master.present?
|
9
|
+
link_to_if_authorized(_('Salt ENC'), { controller: :'foreman_salt/minions', action: :node, id: host },
|
10
|
+
title: _('Salt external nodes YAML dump'), class: 'btn btn-default')
|
11
|
+
end)]).flatten.compact
|
24
12
|
end
|
25
13
|
|
26
14
|
def multiple_actions
|
27
15
|
actions = super
|
28
|
-
if authorized_for(:
|
29
|
-
actions << [_('Change Salt Master'), select_multiple_salt_master_hosts_path] if SmartProxy.unscoped.authorized.with_features(
|
30
|
-
|
16
|
+
if authorized_for(controller: :hosts, action: :edit)
|
17
|
+
actions << [_('Change Salt Master'), select_multiple_salt_master_hosts_path] if SmartProxy.unscoped.authorized.with_features('Salt')
|
18
|
+
if SmartProxy.unscoped.authorized.with_features('Salt')
|
19
|
+
actions << [_('Change Salt Environment'), select_multiple_salt_environment_hosts_path]
|
20
|
+
end
|
31
21
|
end
|
32
22
|
actions
|
33
23
|
end
|
@@ -35,8 +25,10 @@ module ForemanSalt
|
|
35
25
|
def overview_fields(host)
|
36
26
|
fields = super(host)
|
37
27
|
|
38
|
-
fields.insert(5, [_('Salt Master'), (link_to(host.salt_proxy, hosts_path(:
|
39
|
-
fields.insert(6, [_('Salt Environment'), (
|
28
|
+
fields.insert(5, [_('Salt Master'), (link_to(host.salt_proxy, hosts_path(search: "saltmaster = #{host.salt_proxy}")) if host.salt_proxy)])
|
29
|
+
fields.insert(6, [_('Salt Environment'), (if host.salt_environment
|
30
|
+
link_to(host.salt_environment, hosts_path(search: "salt_environment = #{host.salt_environment}"))
|
31
|
+
end)])
|
40
32
|
|
41
33
|
fields
|
42
34
|
end
|
@@ -7,8 +7,8 @@ module ForemanSalt
|
|
7
7
|
actions = super
|
8
8
|
|
9
9
|
if proxy.has_feature?('Salt')
|
10
|
-
actions << display_link_if_authorized(_('Salt Keys'), :
|
11
|
-
actions << display_link_if_authorized(_('Salt Autosign'), :
|
10
|
+
actions << display_link_if_authorized(_('Salt Keys'), controller: 'foreman_salt/salt_keys', action: 'index', smart_proxy_id: proxy)
|
11
|
+
actions << display_link_if_authorized(_('Salt Autosign'), controller: 'foreman_salt/salt_autosign', action: 'index', smart_proxy_id: proxy)
|
12
12
|
end
|
13
13
|
|
14
14
|
actions
|
@@ -2,7 +2,8 @@ module ForemanSalt
|
|
2
2
|
module SaltKeysHelper
|
3
3
|
def salt_keys_state_filter
|
4
4
|
select_tag 'Filter', options_for_select(['', _('Accepted'), _('Rejected'), _('Unaccepted')], params[:state]),
|
5
|
-
|
5
|
+
onchange: "window.location.href = location.protocol + '//' + " \
|
6
|
+
"location.host + location.pathname + (this.value == '' ? '' : ('?state=' + this.value))"
|
6
7
|
end
|
7
8
|
end
|
8
9
|
end
|
@@ -2,29 +2,29 @@ module ForemanSalt
|
|
2
2
|
module SaltModulesHelper
|
3
3
|
def import_from_proxies
|
4
4
|
links = SmartProxy.with_features('Salt').map do |proxy|
|
5
|
-
display_link_if_authorized(_('Import from %s') % proxy.name, hash_for_import_salt_modules_path.merge(:
|
5
|
+
display_link_if_authorized(_('Import from %s') % proxy.name, hash_for_import_salt_modules_path.merge(proxy: proxy), class: 'btn btn-default')
|
6
6
|
end.flatten
|
7
7
|
|
8
8
|
select_action_button(_('Import'), {}, links)
|
9
9
|
end
|
10
10
|
|
11
11
|
def salt_module_select(form, persisted)
|
12
|
-
blank_opt = persisted ? {} : { :
|
12
|
+
blank_opt = persisted ? {} : { include_blank: true }
|
13
13
|
select_items = persisted ? [form.object.salt_module] : SaltModule.order(:name)
|
14
14
|
select_f form,
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
15
|
+
:salt_module_id,
|
16
|
+
select_items,
|
17
|
+
:id,
|
18
|
+
:to_label,
|
19
|
+
blank_opt,
|
20
|
+
label: _('Salt State'),
|
21
|
+
disabled: persisted,
|
22
|
+
required: true
|
23
23
|
end
|
24
24
|
|
25
25
|
def colorize(state)
|
26
26
|
# Make the state easier to read
|
27
|
-
combo = %w
|
27
|
+
combo = %w[2E9DB9 4D1D59 2C777E 1C4758 591D4B]
|
28
28
|
state.split('.').each_with_index.map do |section, index|
|
29
29
|
"<span style='color: ##{combo[index % 5]}; font-weight: bold;'>#{section}</span>"
|
30
30
|
end.join('.').html_safe
|
@@ -6,14 +6,14 @@ module Actions
|
|
6
6
|
end
|
7
7
|
|
8
8
|
def plan(job, proxy_id)
|
9
|
-
plan_self(:
|
9
|
+
plan_self(job_id: job[:job_id], report: job[:result], proxy_id: proxy_id)
|
10
10
|
end
|
11
11
|
|
12
12
|
def run
|
13
13
|
::User.as_anonymous_admin do
|
14
14
|
reports = ::ForemanSalt::ReportImporter.import(input[:report], input[:proxy_id])
|
15
15
|
|
16
|
-
output[:state] = { :
|
16
|
+
output[:state] = { message: "Imported #{reports.count} new reports" }
|
17
17
|
output[:hosts] = reports.map { |report| report.host.name }
|
18
18
|
end
|
19
19
|
end
|
data/app/lib/proxy_api/salt.rb
CHANGED
@@ -1,47 +1,47 @@
|
|
1
1
|
module ::ProxyAPI
|
2
2
|
class Salt < ::ProxyAPI::Resource
|
3
3
|
def initialize(args)
|
4
|
-
@url
|
4
|
+
@url = "#{args[:url]}/salt/"
|
5
5
|
super args
|
6
6
|
end
|
7
7
|
|
8
8
|
def autosign_list
|
9
9
|
parse(get('autosign'))
|
10
|
-
rescue => e
|
10
|
+
rescue StandardError => e
|
11
11
|
raise ProxyException.new(url, e, N_('Unable to fetch autosign list'))
|
12
12
|
end
|
13
13
|
|
14
14
|
def autosign_create(name)
|
15
|
-
parse(post('', "autosign/#{
|
16
|
-
rescue => e
|
15
|
+
parse(post('', "autosign/#{CGI.escape(name)}"))
|
16
|
+
rescue StandardError => e
|
17
17
|
raise ProxyException.new(url, e, N_('Unable to set Salt autosign hostname for %s'), name)
|
18
18
|
end
|
19
19
|
|
20
20
|
def autosign_remove(name)
|
21
|
-
parse(delete("autosign/#{
|
21
|
+
parse(delete("autosign/#{CGI.escape(name)}"))
|
22
22
|
rescue RestClient::ResourceNotFound
|
23
23
|
true # entry doesn't exists anyway
|
24
|
-
rescue => e
|
24
|
+
rescue StandardError => e
|
25
25
|
raise ProxyException.new(url, e, N_('Unable to delete Salt autosign hostname for %s'), name)
|
26
26
|
end
|
27
27
|
|
28
28
|
def autosign_create_key(key)
|
29
|
-
parse(post('', "autosign_key/#{
|
30
|
-
rescue => e
|
29
|
+
parse(post('', "autosign_key/#{CGI.escape(key)}"))
|
30
|
+
rescue StandardError => e
|
31
31
|
raise ProxyException.new(url, e, N_('Unable to create Salt autosign key %s'), key)
|
32
32
|
end
|
33
33
|
|
34
34
|
def autosign_remove_key(key)
|
35
|
-
parse(delete("autosign_key/#{
|
35
|
+
parse(delete("autosign_key/#{CGI.escape(key)}"))
|
36
36
|
rescue RestClient::ResourceNotFound
|
37
37
|
true # entry doesn't exists anyway
|
38
|
-
rescue => e
|
38
|
+
rescue StandardError => e
|
39
39
|
raise ProxyException.new(url, e, N_('Unable to delete Salt autosign key %s'), key)
|
40
40
|
end
|
41
41
|
|
42
42
|
def environments_list
|
43
43
|
parse(get('environments'))
|
44
|
-
rescue => e
|
44
|
+
rescue StandardError => e
|
45
45
|
raise ProxyException.new(url, e, N_('Unable to fetch Salt environments list'))
|
46
46
|
end
|
47
47
|
|
@@ -53,25 +53,25 @@ module ::ProxyAPI
|
|
53
53
|
end
|
54
54
|
|
55
55
|
states
|
56
|
-
rescue => e
|
56
|
+
rescue StandardError => e
|
57
57
|
raise ProxyException.new(url, e, N_('Unable to fetch Salt states list'))
|
58
58
|
end
|
59
59
|
|
60
60
|
def key_list
|
61
61
|
parse(get('key'))
|
62
|
-
rescue => e
|
62
|
+
rescue StandardError => e
|
63
63
|
raise ProxyException.new(url, e, N_('Unable to fetch Salt key list'))
|
64
64
|
end
|
65
65
|
|
66
66
|
def key_accept(name)
|
67
67
|
parse(post('', "key/#{name}"))
|
68
|
-
rescue => e
|
68
|
+
rescue StandardError => e
|
69
69
|
raise ProxyException.new(url, e, N_('Unable to accept Salt key for %s'), name)
|
70
70
|
end
|
71
71
|
|
72
72
|
def key_reject(name)
|
73
73
|
parse(delete("key/reject/#{name}"))
|
74
|
-
rescue => e
|
74
|
+
rescue StandardError => e
|
75
75
|
raise ProxyException.new(url, e, N_('Unable to reject Salt key for %s'), name)
|
76
76
|
end
|
77
77
|
|
@@ -79,13 +79,13 @@ module ::ProxyAPI
|
|
79
79
|
parse(delete("key/#{name}"))
|
80
80
|
rescue RestClient::ResourceNotFound
|
81
81
|
true
|
82
|
-
rescue => e
|
82
|
+
rescue StandardError => e
|
83
83
|
raise ProxyException.new(url, e, N_('Unable to delete Salt key for %s'), name)
|
84
84
|
end
|
85
85
|
|
86
86
|
def highstate(name)
|
87
87
|
parse(post('', "highstate/#{name}"))
|
88
|
-
rescue => e
|
88
|
+
rescue StandardError => e
|
89
89
|
raise ProxyException.new(url, e, N_('Unable to run Salt state.highstate for %s'), name)
|
90
90
|
end
|
91
91
|
end
|