foreman_salt 2.0.2 → 2.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 +13 -5
- data/app/assets/javascripts/foreman_salt/states.js +33 -0
- data/app/controllers/foreman_salt/api/v2/salt_states_controller.rb +53 -2
- data/app/controllers/foreman_salt/concerns/hostgroups_controller_extensions.rb +23 -2
- data/app/controllers/foreman_salt/concerns/hosts_controller_extensions.rb +7 -3
- data/app/controllers/foreman_salt/minions_controller.rb +33 -1
- data/app/controllers/foreman_salt/salt_modules_controller.rb +45 -1
- data/app/controllers/foreman_salt/state_importer.rb +72 -0
- data/app/helpers/foreman_salt/salt_modules_helper.rb +19 -0
- data/app/lib/proxy_api/salt.rb +18 -0
- data/app/models/foreman_salt/concerns/host_managed_extensions.rb +23 -8
- data/app/models/foreman_salt/concerns/hostgroup_extensions.rb +12 -9
- data/app/models/foreman_salt/host_salt_module.rb +6 -0
- data/app/models/foreman_salt/hostgroup_salt_module.rb +6 -0
- data/app/models/foreman_salt/salt_environment.rb +13 -6
- data/app/models/foreman_salt/salt_module.rb +27 -5
- data/app/models/foreman_salt/salt_module_environment.rb +14 -0
- data/app/overrides/salt_environment_host_selector.rb +9 -0
- data/app/overrides/{salt_environment_selector.rb → salt_environment_hostgroup_selector.rb} +2 -6
- data/app/overrides/salt_modules_selector.rb +4 -4
- data/app/services/foreman_salt/fact_importer.rb +1 -1
- data/app/services/foreman_salt/report_importer.rb +9 -7
- data/app/services/foreman_salt/smart_proxies/salt_keys.rb +1 -1
- data/app/views/foreman_salt/salt_environments/index.html.erb +8 -2
- data/app/views/foreman_salt/salt_modules/_form.html.erb +7 -1
- data/app/{overrides/foreman → views/foreman_salt}/salt_modules/_host_tab.html.erb +0 -0
- data/app/views/foreman_salt/salt_modules/_host_tab_pane.html.erb +33 -0
- data/app/views/foreman_salt/salt_modules/import.html.erb +43 -0
- data/app/views/foreman_salt/salt_modules/index.html.erb +17 -5
- data/config/routes.rb +23 -3
- data/db/migrate/20150411003302_add_environments_to_modules.rb +17 -0
- data/db/migrate/20150509094409_rename_join_tables.rb +11 -0
- data/db/migrate/20150509101505_add_primary_keys.rb +6 -0
- data/lib/foreman_salt/engine.rb +21 -1
- data/lib/foreman_salt/version.rb +1 -1
- data/lib/tasks/foreman_salt_tasks.rake +0 -1
- data/test/unit/host_extensions_test.rb +15 -1
- data/test/unit/hostgroup_extensions_test.rb +2 -2
- metadata +35 -24
- data/app/overrides/foreman/salt_modules/_host_tab_pane.html.erb +0 -22
checksums.yaml
CHANGED
@@ -1,7 +1,15 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
|
2
|
+
!binary "U0hBMQ==":
|
3
|
+
metadata.gz: !binary |-
|
4
|
+
ZDYxMGMzYTMxM2FjODk0NGY5YzU2YWFlYjZlZGIxOGM4OGMwYzQ1MQ==
|
5
|
+
data.tar.gz: !binary |-
|
6
|
+
ZWYxNGRiOWY2MmYxMjExNTJiYWM4N2ZlOTE3ZjBiZGJiNWIzOGExZg==
|
5
7
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
|
8
|
+
metadata.gz: !binary |-
|
9
|
+
YmU3NjEwNzA3NWMwOWQ0MDBhYTljOWMxOWZjNzliMTJlODc4NzRlOWVlN2Q5
|
10
|
+
ZWY4MGNiNjlmNWNlNGMxNWVmYjU0YmQ1YjkyODhjYTY2YzM2ODIxYjNkYjc2
|
11
|
+
MGQwNzI0NTFjNGUzZDQxOWU2YWQzZWQ1ZDgwZjJkNmYxN2MyMWQ=
|
12
|
+
data.tar.gz: !binary |-
|
13
|
+
NDA2MDM3Y2ZiMzE5NzUwOWMwY2QyYmE4YzFmY2YzNDIyYmE2NzM4YjM0ODc3
|
14
|
+
NGE0MDdjMGJjYzA2MWIzOTg3NzRhNGUyMTdlZWVmN2M1ODAyYTAyZDY5YjM3
|
15
|
+
NGI2NGI2MjZmYzA5NGU2ZTQ4NTA4YzgxYmJlMjI5Y2I2ODBlMTM=
|
@@ -0,0 +1,33 @@
|
|
1
|
+
$(document).on( "ContentLoad", function() {
|
2
|
+
update_salt_states($('#host_salt_environment_id'));
|
3
|
+
});
|
4
|
+
|
5
|
+
function update_salt_states(element) {
|
6
|
+
var host_id = $("form").data('id')
|
7
|
+
var env_id = $('*[id*=salt_environment_id]').val();
|
8
|
+
var url = $(element).attr('data-url');
|
9
|
+
var data = $("form").serialize().replace('method=put', 'method=post');
|
10
|
+
|
11
|
+
if (url.match('hostgroups')) {
|
12
|
+
data = data + '&hostgroup_id=' + host_id
|
13
|
+
} else {
|
14
|
+
data = data + '&host_id=' + host_id
|
15
|
+
}
|
16
|
+
|
17
|
+
if (env_id == "") return;
|
18
|
+
|
19
|
+
$(element).indicator_show();
|
20
|
+
$.ajax({
|
21
|
+
type: 'post',
|
22
|
+
url: url,
|
23
|
+
data: data,
|
24
|
+
success: function(request) {
|
25
|
+
$('#salt_modules').html(request);
|
26
|
+
$('[rel="twipsy"]').tooltip();
|
27
|
+
multiSelectOnLoad();
|
28
|
+
},
|
29
|
+
complete: function() {
|
30
|
+
$(element).indicator_hide();
|
31
|
+
}
|
32
|
+
});
|
33
|
+
}
|
@@ -2,11 +2,22 @@ module ForemanSalt
|
|
2
2
|
module Api
|
3
3
|
module V2
|
4
4
|
class SaltStatesController < ::ForemanSalt::Api::V2::BaseController
|
5
|
-
|
5
|
+
include StateImporter
|
6
|
+
|
7
|
+
before_filter :find_resource, :except => [:index, :create, :import]
|
8
|
+
before_filter :find_proxy, :only => :import
|
9
|
+
before_filter :find_environment, :only => :index
|
6
10
|
|
7
11
|
api :GET, '/salt_states', N_('List all Salt states')
|
12
|
+
param :salt_environment_id, :identifier_dottable, :required => false, :desc => N_('Limit to a specific environment')
|
8
13
|
def index
|
9
|
-
@
|
14
|
+
if @salt_environment
|
15
|
+
@salt_states = resource_scope_for_index.joins(:salt_environments).where('salt_module_environments.salt_environment_id' => @salt_environment)
|
16
|
+
else
|
17
|
+
@salt_states = resource_scope_for_index
|
18
|
+
end
|
19
|
+
|
20
|
+
@subtotal = @salt_states.count
|
10
21
|
end
|
11
22
|
|
12
23
|
api :GET, '/salt_states/:id/', N_('Show a state')
|
@@ -33,6 +44,28 @@ module ForemanSalt
|
|
33
44
|
process_response @salt_state.destroy
|
34
45
|
end
|
35
46
|
|
47
|
+
api :POST, '/salt_states/import/:smart_proxy_id', N_('Import states from a salt master')
|
48
|
+
param :smart_proxy_id, :identifier_dottable, :required => true, :desc => N_('Salt Smart Proxy ID')
|
49
|
+
param :salt_environment_ids, Array, :required => false, :desc => N_('Limit to a specific environments')
|
50
|
+
param :actions, Array, :required => false, :desc => N_('Limit to specific actions: i.e. add, remove')
|
51
|
+
param :dryrun, :bool, :required => false, :desc => N_('Dryrun only')
|
52
|
+
def import
|
53
|
+
states = fetch_states_from_proxy(@proxy, params[:salt_environment_ids])
|
54
|
+
unless params[:dryrun]
|
55
|
+
states[:changes].each do |environment, state|
|
56
|
+
if state[:add].any? && (params[:actions].blank? || params[:actions].include?('add'))
|
57
|
+
add_to_environment(state[:add], environment)
|
58
|
+
end
|
59
|
+
|
60
|
+
if state[:remove].any? && (params[:actions].blank? || params[:actions].include?('remove'))
|
61
|
+
remove_from_environment(state[:remove], environment)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
clean_orphans
|
65
|
+
end
|
66
|
+
render :text => states.to_json
|
67
|
+
end
|
68
|
+
|
36
69
|
def controller_permission
|
37
70
|
'salt_modules'
|
38
71
|
end
|
@@ -40,6 +73,24 @@ module ForemanSalt
|
|
40
73
|
def resource_class
|
41
74
|
ForemanSalt::SaltModule
|
42
75
|
end
|
76
|
+
|
77
|
+
def action_permission
|
78
|
+
case params[:action]
|
79
|
+
when 'import'
|
80
|
+
:import
|
81
|
+
else
|
82
|
+
super
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
private
|
87
|
+
|
88
|
+
def find_environment
|
89
|
+
if params[:salt_environment_id]
|
90
|
+
@salt_environment = ForemanSalt::SaltEnvironment.find(params[:salt_environment_id])
|
91
|
+
fail _('Could not find salt environment with id %s') % params[:salt_environment_id] unless @salt_environment
|
92
|
+
end
|
93
|
+
end
|
43
94
|
end
|
44
95
|
end
|
45
96
|
end
|
@@ -7,12 +7,33 @@ module ForemanSalt
|
|
7
7
|
alias_method_chain :load_vars_for_ajax, :salt_modules
|
8
8
|
end
|
9
9
|
|
10
|
+
def salt_environment_selected
|
11
|
+
@hostgroup = Hostgroup.authorized(:view_hostgroups, Hostgroup).find_by_id(params[:hostgroup_id]) || Hostgroup.new(params[:hostgroup])
|
12
|
+
|
13
|
+
if params[:hostgroup][:salt_environment_id].present?
|
14
|
+
@salt_environment = ::ForemanSalt::SaltEnvironment.find(params[:hostgroup][:salt_environment_id])
|
15
|
+
load_vars_for_ajax
|
16
|
+
render :partial => 'foreman_salt/salt_modules/host_tab_pane'
|
17
|
+
else
|
18
|
+
logger.info 'environment_id is required to render states'
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
10
22
|
private
|
11
23
|
|
12
24
|
def load_vars_for_ajax_with_salt_modules
|
13
25
|
load_vars_for_ajax_without_salt_modules
|
14
|
-
@
|
15
|
-
@
|
26
|
+
@obj = @hostgroup
|
27
|
+
@salt_environment ||= @hostgroup.salt_environment
|
28
|
+
|
29
|
+
if @salt_environment
|
30
|
+
@inherited_salt_modules = @salt_environment.salt_modules.where(:id => @hostgroup.inherited_salt_modules)
|
31
|
+
@salt_modules = @salt_environment.salt_modules - @inherited_salt_modules
|
32
|
+
else
|
33
|
+
@inherited_salt_modules = @salt_modules = []
|
34
|
+
end
|
35
|
+
|
36
|
+
@selected = @hostgroup.salt_modules || []
|
16
37
|
end
|
17
38
|
end
|
18
39
|
end
|
@@ -13,7 +13,8 @@ module ForemanSalt
|
|
13
13
|
return head(:not_found) unless @hostgroup
|
14
14
|
|
15
15
|
@salt_modules = @host.salt_modules if @host
|
16
|
-
@
|
16
|
+
@salt_environment = @host.salt_environment if @host
|
17
|
+
@inherited_salt_modules = @hostgroup.all_salt_modules
|
17
18
|
process_hostgroup_without_salt_modules
|
18
19
|
end
|
19
20
|
|
@@ -21,8 +22,11 @@ module ForemanSalt
|
|
21
22
|
|
22
23
|
def load_vars_for_ajax_with_salt_modules
|
23
24
|
return unless @host
|
24
|
-
@
|
25
|
-
@
|
25
|
+
@obj = @host
|
26
|
+
@salt_environment = @host.salt_environment if @host
|
27
|
+
@selected = @host.salt_modules
|
28
|
+
@salt_modules = @host.salt_environment ? @salt_environment.salt_modules : []
|
29
|
+
@inherited_salt_modules = @host.hostgroup.all_salt_modules if @host.hostgroup
|
26
30
|
load_vars_for_ajax_without_salt_modules
|
27
31
|
end
|
28
32
|
end
|
@@ -8,7 +8,7 @@ module ForemanSalt
|
|
8
8
|
def node
|
9
9
|
enc = {}
|
10
10
|
env = @minion.salt_environment.blank? ? 'base' : @minion.salt_environment.name
|
11
|
-
enc['classes'] = @minion.
|
11
|
+
enc['classes'] = @minion.salt_modules_for_enc
|
12
12
|
|
13
13
|
pillars = @minion.info['parameters']
|
14
14
|
enc['parameters'] = Setting[:salt_namespace_pillars] ? { 'foreman' => pillars } : pillars
|
@@ -32,12 +32,24 @@ module ForemanSalt
|
|
32
32
|
redirect_to host_path(@minion)
|
33
33
|
end
|
34
34
|
|
35
|
+
def salt_environment_selected
|
36
|
+
if params[:host][:salt_environment_id].present?
|
37
|
+
@salt_environment = ::ForemanSalt::SaltEnvironment.find(params[:host][:salt_environment_id])
|
38
|
+
load_ajax_vars
|
39
|
+
render :partial => 'foreman_salt/salt_modules/host_tab_pane'
|
40
|
+
else
|
41
|
+
logger.info 'environment_id is required to render states'
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
35
45
|
def action_permission
|
36
46
|
case params[:action]
|
37
47
|
when 'run'
|
38
48
|
:saltrun
|
39
49
|
when 'node'
|
40
50
|
:view
|
51
|
+
when 'salt_environment_selected'
|
52
|
+
:edit
|
41
53
|
else
|
42
54
|
super
|
43
55
|
end
|
@@ -50,5 +62,25 @@ module ForemanSalt
|
|
50
62
|
def resource_class
|
51
63
|
Host
|
52
64
|
end
|
65
|
+
|
66
|
+
private
|
67
|
+
|
68
|
+
def load_ajax_vars
|
69
|
+
@minion = Host::Base.authorized(:view_hosts, Host).find_by_id(params[:host_id])
|
70
|
+
if @minion
|
71
|
+
unless @minion.is_a?(Host::Managed)
|
72
|
+
@minion = @host.becomes(Host::Managed)
|
73
|
+
@minion.type = 'Host::Managed'
|
74
|
+
end
|
75
|
+
@minion.attributes = params[:host]
|
76
|
+
else
|
77
|
+
@minion ||= Host::Managed.new(params[:host])
|
78
|
+
end
|
79
|
+
|
80
|
+
@obj = @minion
|
81
|
+
@inherited_salt_modules = @salt_environment.salt_modules.where(:id => @minion.hostgroup ? @minion.hostgroup.all_salt_modules : [])
|
82
|
+
@salt_modules = @salt_environment.salt_modules - @inherited_salt_modules
|
83
|
+
@selected = @minion.salt_modules || []
|
84
|
+
end
|
53
85
|
end
|
54
86
|
end
|
@@ -1,11 +1,13 @@
|
|
1
1
|
module ForemanSalt
|
2
2
|
class SaltModulesController < ::ForemanSalt::ApplicationController
|
3
3
|
include Foreman::Controller::AutoCompleteSearch
|
4
|
+
include StateImporter
|
4
5
|
|
5
6
|
before_filter :find_resource, :only => [:edit, :update, :destroy]
|
7
|
+
before_filter :find_proxy, :only => :import
|
6
8
|
|
7
9
|
def index
|
8
|
-
@salt_modules = resource_base.search_for(params[:search], :order => params[:order]).paginate(:page => params[:page])
|
10
|
+
@salt_modules = resource_base.search_for(params[:search], :order => params[:order]).includes(:salt_environments).paginate(:page => params[:page])
|
9
11
|
end
|
10
12
|
|
11
13
|
def new
|
@@ -23,6 +25,7 @@ module ForemanSalt
|
|
23
25
|
end
|
24
26
|
|
25
27
|
def edit
|
28
|
+
@salt_environments = @salt_module.salt_environments
|
26
29
|
end
|
27
30
|
|
28
31
|
def update
|
@@ -41,5 +44,46 @@ module ForemanSalt
|
|
41
44
|
process_error
|
42
45
|
end
|
43
46
|
end
|
47
|
+
|
48
|
+
def action_permission
|
49
|
+
case params[:action]
|
50
|
+
when 'import'
|
51
|
+
:import
|
52
|
+
when 'apply_changes'
|
53
|
+
:import
|
54
|
+
else
|
55
|
+
super
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
def import
|
60
|
+
result = fetch_states_from_proxy(@proxy)
|
61
|
+
@changes = result[:changes]
|
62
|
+
@deletes = result[:deletes]
|
63
|
+
|
64
|
+
if @changes.empty?
|
65
|
+
notice _('No changes found')
|
66
|
+
redirect_to salt_modules_path
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
def apply_changes
|
71
|
+
if params[:changed].blank?
|
72
|
+
notice _('No changes found')
|
73
|
+
redirect_to salt_modules_path
|
74
|
+
else
|
75
|
+
params[:changed].each do |environment, states|
|
76
|
+
next unless states[:add] || states[:remove]
|
77
|
+
environment = SaltEnvironment.find_or_create_by_name(environment)
|
78
|
+
|
79
|
+
add_to_environment(JSON.load(states[:add]), environment) if states[:add]
|
80
|
+
remove_from_environment(JSON.load(states[:remove]), environment) if states[:remove]
|
81
|
+
end
|
82
|
+
|
83
|
+
clean_orphans
|
84
|
+
notice _('Successfully imported')
|
85
|
+
redirect_to salt_modules_path
|
86
|
+
end
|
87
|
+
end
|
44
88
|
end
|
45
89
|
end
|
@@ -0,0 +1,72 @@
|
|
1
|
+
module ForemanSalt
|
2
|
+
module StateImporter
|
3
|
+
extend ActiveSupport::Concern
|
4
|
+
|
5
|
+
private
|
6
|
+
|
7
|
+
def find_proxy
|
8
|
+
@proxy = SmartProxy.find(params[:proxy] || params[:smart_proxy_id])
|
9
|
+
return :not_found unless @proxy
|
10
|
+
end
|
11
|
+
|
12
|
+
def fetch_states_from_proxy(proxy, environments = nil)
|
13
|
+
result = { :changes => {},
|
14
|
+
:deletes => [] }
|
15
|
+
|
16
|
+
new = ProxyAPI::Salt.new(:url => proxy.url).states_list
|
17
|
+
old = SaltModule.to_hash
|
18
|
+
|
19
|
+
environments ||= new.keys + old.keys
|
20
|
+
|
21
|
+
environments.each do |environment|
|
22
|
+
old_states = old[environment] || []
|
23
|
+
new_states = new[environment] || []
|
24
|
+
|
25
|
+
if old_states.any?
|
26
|
+
removed = old_states - new_states
|
27
|
+
added = new_states - old_states
|
28
|
+
else
|
29
|
+
added = new_states
|
30
|
+
removed = []
|
31
|
+
end
|
32
|
+
|
33
|
+
if added.any? || removed.any?
|
34
|
+
result[:changes][environment] = {}
|
35
|
+
|
36
|
+
unless removed.blank?
|
37
|
+
result[:changes][environment][:remove] = removed
|
38
|
+
result[:deletes] << environment if removed.count == old[environment].count && added.blank?
|
39
|
+
end
|
40
|
+
|
41
|
+
result[:changes][environment][:add] = added unless added.blank?
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
result
|
46
|
+
end
|
47
|
+
|
48
|
+
def add_to_environment(states, environment)
|
49
|
+
states.each do |state_name|
|
50
|
+
state = SaltModule.find_or_create_by_name(state_name)
|
51
|
+
state.salt_environments << SaltEnvironment.find(environment)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
def remove_from_environment(states, environment)
|
56
|
+
states.each do |state_name|
|
57
|
+
state = SaltModule.find(state_name)
|
58
|
+
state.salt_environments.delete(environment) if state
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
def clean_orphans
|
63
|
+
SaltModule.all.each do |state|
|
64
|
+
state.destroy if state.salt_environments.empty?
|
65
|
+
end
|
66
|
+
|
67
|
+
SaltEnvironment.all.each do |environment|
|
68
|
+
environment.destroy if environment.salt_modules.empty?
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module ForemanSalt
|
2
|
+
module SaltModulesHelper
|
3
|
+
def import_from_proxies
|
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(:proxy => proxy), :class => 'btn btn-default')
|
6
|
+
end.flatten
|
7
|
+
|
8
|
+
select_action_button(_('Import'), {}, links)
|
9
|
+
end
|
10
|
+
|
11
|
+
def colorize(state)
|
12
|
+
# Make the state easier to read
|
13
|
+
combo = %w(2E9DB9 4D1D59 2C777E 1C4758 591D4B)
|
14
|
+
state.split('.').each_with_index.map do |section, index|
|
15
|
+
"<span style='color: ##{combo[index % 5]}; font-weight: bold;'>#{section}</span>"
|
16
|
+
end.join('.').html_safe
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
data/app/lib/proxy_api/salt.rb
CHANGED
@@ -25,6 +25,24 @@ module ::ProxyAPI
|
|
25
25
|
raise ProxyException.new(url, e, N_('Unable to delete Salt autosign for %s'), name)
|
26
26
|
end
|
27
27
|
|
28
|
+
def environments_list
|
29
|
+
parse(get('environments'))
|
30
|
+
rescue => e
|
31
|
+
raise ProxyException.new(url, e, N_('Unable to fetch Salt environments list'))
|
32
|
+
end
|
33
|
+
|
34
|
+
def states_list
|
35
|
+
states = {}
|
36
|
+
|
37
|
+
environments_list.each do |environment|
|
38
|
+
states[environment] = parse(get("environments/#{environment}"))
|
39
|
+
end
|
40
|
+
|
41
|
+
states
|
42
|
+
rescue => e
|
43
|
+
raise ProxyException.new(url, e, N_('Unable to fetch Salt states list'))
|
44
|
+
end
|
45
|
+
|
28
46
|
def key_list
|
29
47
|
parse(get('key'))
|
30
48
|
rescue => e
|
@@ -4,12 +4,20 @@ module ForemanSalt
|
|
4
4
|
extend ActiveSupport::Concern
|
5
5
|
|
6
6
|
included do
|
7
|
-
|
7
|
+
has_many :salt_modules, :through => :host_salt_modules, :class_name => '::ForemanSalt::SaltModule'
|
8
|
+
has_many :host_salt_modules, :foreign_key => :host_id, :class_name => '::ForemanSalt::HostSaltModule'
|
9
|
+
|
8
10
|
belongs_to :salt_proxy, :class_name => 'SmartProxy'
|
9
11
|
belongs_to :salt_environment, :class_name => 'ForemanSalt::SaltEnvironment'
|
12
|
+
|
10
13
|
alias_method_chain :params, :salt_proxy
|
11
14
|
alias_method_chain :set_hostgroup_defaults, :salt_proxy
|
12
15
|
alias_method_chain :smart_proxy_ids, :salt_proxy
|
16
|
+
|
17
|
+
scoped_search :in => :salt_modules, :on => :name, :complete_value => true, :rename => :salt_state
|
18
|
+
scoped_search :in => :salt_environment, :on => :name, :complete_value => true, :rename => :salt_environment
|
19
|
+
|
20
|
+
validate :salt_modules_in_host_environment
|
13
21
|
end
|
14
22
|
|
15
23
|
def handle_salt
|
@@ -23,14 +31,11 @@ module ForemanSalt
|
|
23
31
|
params
|
24
32
|
end
|
25
33
|
|
26
|
-
def
|
27
|
-
return
|
28
|
-
[super + hostgroup.salt_modules].flatten
|
29
|
-
end
|
34
|
+
def salt_modules_for_enc
|
35
|
+
return [] unless self.salt_environment
|
30
36
|
|
31
|
-
|
32
|
-
|
33
|
-
[super + hostgroup.salt_module_ids].flatten
|
37
|
+
hostgroup_modules = self.hostgroup ? self.hostgroup.all_salt_modules : []
|
38
|
+
self.salt_environment.salt_modules.where(:id => self.salt_modules + hostgroup_modules).pluck(:name)
|
34
39
|
end
|
35
40
|
|
36
41
|
def salt_master
|
@@ -62,6 +67,16 @@ module ForemanSalt
|
|
62
67
|
end
|
63
68
|
ids
|
64
69
|
end
|
70
|
+
|
71
|
+
def salt_modules_in_host_environment
|
72
|
+
return unless self.salt_modules.any?
|
73
|
+
|
74
|
+
if self.salt_environment
|
75
|
+
errors.add(:base, _('Salt states must be in the environment of the host')) unless (self.salt_modules - self.salt_environment.salt_modules).empty?
|
76
|
+
else
|
77
|
+
errors.add(:base, _('Host must have an environment in order to set salt states'))
|
78
|
+
end
|
79
|
+
end
|
65
80
|
end
|
66
81
|
end
|
67
82
|
end
|
@@ -4,19 +4,22 @@ module ForemanSalt
|
|
4
4
|
extend ActiveSupport::Concern
|
5
5
|
|
6
6
|
included do
|
7
|
-
|
7
|
+
has_many :salt_modules, :through => :hostgroup_salt_modules, :class_name => '::ForemanSalt::SaltModule'
|
8
|
+
has_many :hostgroup_salt_modules, :class_name => '::ForemanSalt::HostgroupSaltModule'
|
9
|
+
|
8
10
|
belongs_to :salt_proxy, :class_name => 'SmartProxy'
|
9
11
|
belongs_to :salt_environment, :class_name => 'ForemanSalt::SaltEnvironment'
|
10
|
-
end
|
11
12
|
|
12
|
-
|
13
|
-
|
14
|
-
([super] + [inherited_salt_modules]).flatten.uniq.compact
|
13
|
+
scoped_search :in => :salt_modules, :on => :name, :complete_value => true, :rename => :salt_state
|
14
|
+
scoped_search :in => :salt_environment, :on => :name, :complete_value => true, :rename => :salt_environment
|
15
15
|
end
|
16
16
|
|
17
|
-
def
|
18
|
-
|
19
|
-
|
17
|
+
def all_salt_modules
|
18
|
+
if ancestry.present?
|
19
|
+
(self.salt_modules + self.inherited_salt_modules).uniq
|
20
|
+
else
|
21
|
+
self.salt_modules
|
22
|
+
end
|
20
23
|
end
|
21
24
|
|
22
25
|
def inherited_salt_modules
|
@@ -25,7 +28,7 @@ module ForemanSalt
|
|
25
28
|
|
26
29
|
def inherited_salt_module_ids
|
27
30
|
if ancestry.present?
|
28
|
-
self.class.sort_by_ancestry(ancestors.reject { |ancestor| ancestor.salt_module_ids.empty? }).
|
31
|
+
self.class.sort_by_ancestry(ancestors.reject { |ancestor| ancestor.salt_module_ids.empty? }).map(&:salt_module_ids).inject(&:+).uniq
|
29
32
|
else
|
30
33
|
[]
|
31
34
|
end
|
@@ -5,19 +5,26 @@ module ForemanSalt
|
|
5
5
|
extend FriendlyId
|
6
6
|
friendly_id :name
|
7
7
|
|
8
|
-
before_destroy EnsureNotUsedBy.new(:hosts, :hostgroups)
|
9
|
-
|
10
8
|
has_many :hosts, :class_name => '::Host::Managed'
|
11
9
|
has_many :hostgroups, :class_name => '::Hostgroup'
|
12
10
|
|
13
|
-
|
11
|
+
has_many :salt_modules, :through => :salt_module_environments, :before_remove => :remove_from_hosts
|
12
|
+
has_many :salt_module_environments
|
14
13
|
|
15
|
-
|
16
|
-
order('salt_environments.name')
|
17
|
-
}
|
14
|
+
validates :name, :uniqueness => true, :presence => true, :format => { :with => /\A[\w\d\.]+\z/, :message => N_('is alphanumeric and cannot contain spaces') }
|
18
15
|
|
19
16
|
scoped_search :on => :name, :complete_value => true
|
20
17
|
scoped_search :in => :hostgroups, :on => :name, :complete_value => true, :rename => :hostgroup
|
21
18
|
scoped_search :in => :hosts, :on => :name, :complete_value => true, :rename => :host
|
19
|
+
|
20
|
+
def self.humanize_class_name(_name = nil)
|
21
|
+
_('Salt environment')
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
|
26
|
+
def remove_from_hosts(state)
|
27
|
+
HostSaltModule.joins(:host).where(:hosts => { :salt_environment_id => id }, :salt_module_id => state).destroy
|
28
|
+
end
|
22
29
|
end
|
23
30
|
end
|
@@ -5,20 +5,42 @@ module ForemanSalt
|
|
5
5
|
extend FriendlyId
|
6
6
|
friendly_id :name
|
7
7
|
|
8
|
-
before_destroy EnsureNotUsedBy.new(:hosts, :hostgroups)
|
9
|
-
has_and_belongs_to_many :hosts, :class_name => '::Host::Managed', :join_table => 'hosts_salt_modules',
|
10
|
-
:association_foreign_key => 'host_id'
|
8
|
+
# before_destroy EnsureNotUsedBy.new(:hosts, :hostgroups)
|
11
9
|
|
12
|
-
|
10
|
+
has_many :hosts, :through => :host_salt_modules, :class_name => '::Host::Managed'
|
11
|
+
has_many :host_salt_modules, :foreign_key => :salt_module_id
|
13
12
|
|
14
|
-
|
13
|
+
has_many :hostgroups, :through => :hostgroup_salt_modules
|
14
|
+
has_many :hostgroup_salt_modules, :foreign_key => :salt_module_id
|
15
|
+
|
16
|
+
has_many :salt_environments, :through => :salt_module_environments
|
17
|
+
has_many :salt_module_environments
|
18
|
+
|
19
|
+
validates :name, :uniqueness => true, :presence => true, :format => { :with => /\A(?:[\w\d\-]+\.{0,1})+[^\.]\z/, :message => N_('must be alphanumeric, can contain periods, dashes, underscores and must not contain spaces') }
|
15
20
|
|
16
21
|
default_scope lambda {
|
17
22
|
order('salt_modules.name')
|
18
23
|
}
|
19
24
|
|
25
|
+
scope :in_environment, ->(environment) { joins(:salt_environments).where('salt_module_environments.salt_environment_id' => environment) }
|
26
|
+
|
20
27
|
scoped_search :on => :name, :complete_value => true
|
28
|
+
scoped_search :in => :salt_environments, :on => :name, :complete_value => true, :rename => :environment
|
21
29
|
scoped_search :in => :hostgroups, :on => :name, :complete_value => true, :rename => :hostgroup
|
22
30
|
scoped_search :in => :hosts, :on => :name, :complete_value => true, :rename => :host
|
31
|
+
|
32
|
+
def self.to_hash
|
33
|
+
states = {}
|
34
|
+
|
35
|
+
SaltEnvironment.all.each do |environment|
|
36
|
+
states[environment.name] = environment.salt_modules.map(&:name)
|
37
|
+
end
|
38
|
+
|
39
|
+
states
|
40
|
+
end
|
41
|
+
|
42
|
+
def self.humanize_class_name(_name = nil)
|
43
|
+
_('Salt state')
|
44
|
+
end
|
23
45
|
end
|
24
46
|
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module ForemanSalt
|
2
|
+
class SaltModuleEnvironment < ActiveRecord::Base
|
3
|
+
belongs_to :salt_environment
|
4
|
+
belongs_to :salt_module
|
5
|
+
|
6
|
+
before_destroy :remove_from_hosts
|
7
|
+
|
8
|
+
private
|
9
|
+
|
10
|
+
def remove_from_hosts
|
11
|
+
HostSaltModule.joins(:host).where(:hosts => { :salt_environment_id => salt_environment_id }, :salt_module_id => salt_module_id).destroy
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,9 @@
|
|
1
|
+
selector_text = "<%= select_f f, :salt_environment_id, ForemanSalt::SaltEnvironment.all, :id, :name,
|
2
|
+
{ :include_blank => blank_or_inherit_f(f, :salt_environment) },
|
3
|
+
{ :label => _('Salt Environment'), :onchange => 'update_salt_states(this)', :'data-url' => salt_environment_selected_minions_path,
|
4
|
+
:'data-host-id' => (@host || @hostgroup).id, :help_inline => :indicator} %>"
|
5
|
+
|
6
|
+
Deface::Override.new(:virtual_path => 'hosts/_form',
|
7
|
+
:name => 'add_salt_environment_to_host',
|
8
|
+
:insert_bottom => 'div#primary',
|
9
|
+
:text => selector_text)
|