foreman_salt 13.0.0 → 13.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/controllers/foreman_salt/api/v2/salt_variables_controller.rb +75 -0
- data/app/controllers/foreman_salt/concerns/salt_override_value.rb +28 -0
- data/app/controllers/foreman_salt/concerns/salt_variable_parameters.rb +29 -0
- data/app/controllers/foreman_salt/minions_controller.rb +2 -0
- data/app/controllers/foreman_salt/salt_variables_controller.rb +46 -0
- data/app/helpers/foreman_salt/salt_modules_helper.rb +14 -0
- data/app/helpers/foreman_salt/salt_plugin_helper.rb +13 -0
- data/app/models/foreman_salt/concerns/host_managed_extensions.rb +16 -1
- data/app/models/foreman_salt/salt_module.rb +5 -0
- data/app/models/foreman_salt/salt_variable.rb +29 -0
- data/app/services/foreman_salt/report_importer.rb +1 -1
- data/app/views/foreman_salt/api/v2/salt_variables/create.json.rabl +3 -0
- data/app/views/foreman_salt/api/v2/salt_variables/destroy.json.rabl +3 -0
- data/app/views/foreman_salt/api/v2/salt_variables/index.json.rabl +3 -0
- data/app/views/foreman_salt/api/v2/salt_variables/show.json.rabl +21 -0
- data/app/views/foreman_salt/salt_modules/index.html.erb +11 -3
- data/app/views/foreman_salt/salt_variables/_fields.erb +73 -0
- data/app/views/foreman_salt/salt_variables/edit.html.erb +17 -0
- data/app/views/foreman_salt/salt_variables/index.html.erb +46 -0
- data/app/views/foreman_salt/salt_variables/new.html.erb +17 -0
- data/config/routes.rb +9 -0
- data/db/migrate/20190515112233_add_salt_module_id_to_lookup_keys.rb +14 -0
- data/lib/foreman_salt/plugin.rb +44 -16
- data/lib/foreman_salt/version.rb +1 -1
- data/locale/de/foreman_salt.edit.po +68 -41
- data/locale/en/foreman_salt.edit.po +1 -1
- data/test/factories/foreman_salt_factories.rb +6 -0
- data/test/functional/api/v2/salt_states_controller_test.rb +1 -1
- data/test/functional/api/v2/salt_variables_controller_test.rb +35 -0
- data/test/functional/minions_controller_test.rb +65 -5
- data/test/functional/salt_modules_controller_test.rb +22 -0
- data/test/functional/salt_variables_controller_test.rb +33 -0
- data/test/integration/salt_autosign_test.rb +1 -1
- data/test/integration/salt_keys_test.rb +3 -3
- data/test/integration/salt_module_test.rb +1 -1
- data/test/integration/salt_variable_test.rb +24 -0
- data/test/unit/salt_variables_test.rb +32 -0
- metadata +27 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: dce5a18cef1f569ee315e5260928b43cc24a059b895f6cf2c4bbc6c98592cac8
|
4
|
+
data.tar.gz: 864b8551057471a940a44b5d0447502040558fc0b697339a7ca28a09f1256203
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d4ed7429fd288b8d07677e7bc28091262c5acc2f751fc511fa0a4b223bb8e9b257177a91098b94ef0e68dd660e704fbbe70ec37e0135d04a8e8a2ff6d9507445
|
7
|
+
data.tar.gz: 82aa1176e433e8223e8ceb8003bfc22eb2d207ada21cdfd0e98a106e78ec7338f484db96fa315a303757a910b91d65247f7edbb66719090570c69397b8a2d9b6
|
@@ -0,0 +1,75 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ForemanSalt
|
4
|
+
module Api
|
5
|
+
module V2
|
6
|
+
# API controller for Salt Variables
|
7
|
+
class SaltVariablesController < ::ForemanSalt::Api::V2::BaseController
|
8
|
+
include ::ForemanSalt::Concerns::SaltVariableParameters
|
9
|
+
include Foreman::Controller::Parameters::VariableLookupKey
|
10
|
+
|
11
|
+
wrap_parameters :salt_variable, :include => salt_variable_params_filter.accessible_attributes(parameter_filter_context) + ['salt_state_id']
|
12
|
+
before_action :find_resource, :only => [:show, :destroy, :update]
|
13
|
+
|
14
|
+
api :GET, '/salt_variables/:id', N_('Show variable')
|
15
|
+
param :id, :identifier, :required => true
|
16
|
+
def show; end
|
17
|
+
|
18
|
+
api :GET, '/salt_variables', N_('List Salt variables')
|
19
|
+
param_group :search_and_pagination, ::Api::V2::BaseController
|
20
|
+
def index
|
21
|
+
@salt_variables = resource_scope_for_index
|
22
|
+
end
|
23
|
+
|
24
|
+
api :DELETE, '/salt_variables/:id', N_('Deletes Salt variable')
|
25
|
+
param :id, :identifier, :required => true
|
26
|
+
def destroy
|
27
|
+
@salt_variable.destroy
|
28
|
+
render 'foreman_salt/api/v2/salt_variables/destroy'
|
29
|
+
end
|
30
|
+
|
31
|
+
def_param_group :salt_variable do
|
32
|
+
param :salt_variable, Hash, :required => true, :action_aware => true do
|
33
|
+
param :variable, String, :required => true, :desc => N_("Name of variable")
|
34
|
+
param :salt_state_id, :number, :required => true, :desc => N_("State ID")
|
35
|
+
param :default_value, :any_type, :of => LookupKey::KEY_TYPES, :desc => N_("Default value of variable")
|
36
|
+
param :hidden_value, :bool, :desc => N_("When enabled the parameter is hidden in the UI")
|
37
|
+
param :override_value_order, String, :desc => N_("The order in which values are resolved")
|
38
|
+
param :description, String, :desc => N_("Description of variable")
|
39
|
+
param :validator_type, LookupKey::VALIDATOR_TYPES, :desc => N_("Types of validation values")
|
40
|
+
param :validator_rule, String, :desc => N_("Used to enforce certain values for the parameter values")
|
41
|
+
param :variable_type, LookupKey::KEY_TYPES, :desc => N_("Types of variable values")
|
42
|
+
param :merge_overrides, :bool, :desc => N_("Merge all matching values (only array/hash type)")
|
43
|
+
param :merge_default, :bool, :desc => N_("Include default value when merging all matching values")
|
44
|
+
param :avoid_duplicates, :bool, :desc => N_("Remove duplicate values (only array type)")
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
api :POST, '/salt_variables', N_('Create Salt variable')
|
49
|
+
param_group :salt_variable, :as => :create
|
50
|
+
def create
|
51
|
+
params[:salt_variable][:salt_module_id] = params[:salt_variable].delete(:salt_state_id) if params[:salt_variable]
|
52
|
+
@salt_variable = SaltVariable.new(salt_variable_params)
|
53
|
+
process_response @salt_variable.save
|
54
|
+
end
|
55
|
+
|
56
|
+
api :PUT, '/salt_variables/:id', N_('Updates Salt variable')
|
57
|
+
param :id, :identifier, :required => true
|
58
|
+
param_group :salt_variable, :as => :update
|
59
|
+
|
60
|
+
def update
|
61
|
+
@salt_variable.update!(variable_lookup_key_params)
|
62
|
+
render 'foreman_salt/api/v2/salt_variables/show'
|
63
|
+
end
|
64
|
+
|
65
|
+
def controller_permission
|
66
|
+
'salt_variables'
|
67
|
+
end
|
68
|
+
|
69
|
+
def resource_class
|
70
|
+
ForemanSalt::SaltVariable
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ForemanSalt
|
4
|
+
module Concerns
|
5
|
+
# Keys to allow as parameters in the SaltVariable controller
|
6
|
+
module SaltOverrideValue
|
7
|
+
extend ActiveSupport::Concern
|
8
|
+
|
9
|
+
class_methods do
|
10
|
+
def lookup_value_params_filter
|
11
|
+
Foreman::ParameterFilter.new(::LookupValue).tap do |filter|
|
12
|
+
filter.permit :salt_variable_id, :override_value => {}
|
13
|
+
|
14
|
+
filter.permit_by_context :hidden_value, :host_or_hostgroup, :lookup_key, :lookup_key_id,
|
15
|
+
:match, :omit, :value, :nested => true
|
16
|
+
|
17
|
+
filter.permit_by_context :id, :_destroy, :ui => false,
|
18
|
+
:api => false, :nested => true
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def lookup_value_params
|
24
|
+
self.class.lookup_value_params_filter.filter_params(params, parameter_filter_context, 'foreman_salt_salt_variable')
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ForemanSalt
|
4
|
+
module Concerns
|
5
|
+
# Keys to allow as parameters in the SaltVariable controller
|
6
|
+
module SaltVariableParameters
|
7
|
+
extend ActiveSupport::Concern
|
8
|
+
include Foreman::Controller::Parameters::LookupKey
|
9
|
+
|
10
|
+
class_methods do
|
11
|
+
def salt_variable_params_filter
|
12
|
+
Foreman::ParameterFilter.new(::ForemanSalt::SaltVariable).tap do |filter|
|
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
|
+
add_lookup_key_params_filter(filter)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def salt_variable_params
|
24
|
+
param_name = parameter_filter_context.api? ? 'salt_variable' : 'foreman_salt_salt_variable'
|
25
|
+
self.class.salt_variable_params_filter.filter_params(params, parameter_filter_context, param_name)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -12,6 +12,8 @@ module ForemanSalt
|
|
12
12
|
enc['classes'] = @minion.salt_modules_for_enc
|
13
13
|
|
14
14
|
pillars = @minion.info['parameters']
|
15
|
+
pillars.merge!(@minion.salt_params)
|
16
|
+
|
15
17
|
enc['parameters'] = Setting[:salt_namespace_pillars] ? { 'foreman' => pillars } : pillars
|
16
18
|
|
17
19
|
enc['environment'] = env
|
@@ -0,0 +1,46 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ForemanSalt
|
4
|
+
# UI controller for salt variables
|
5
|
+
class SaltVariablesController < ::LookupKeysController
|
6
|
+
include Foreman::Controller::AutoCompleteSearch
|
7
|
+
include ::ForemanSalt::Concerns::SaltVariableParameters
|
8
|
+
|
9
|
+
before_action :find_resource, :only => [:edit, :update, :destroy], :if => proc { params[:id] }
|
10
|
+
|
11
|
+
def index
|
12
|
+
@salt_variables = resource_base.search_for(params[:search],
|
13
|
+
:order => params[:order]).paginate(:page => params[:page],
|
14
|
+
:per_page => params[:per_page])
|
15
|
+
end
|
16
|
+
|
17
|
+
def new
|
18
|
+
@salt_variable = SaltVariable.new
|
19
|
+
end
|
20
|
+
|
21
|
+
def create
|
22
|
+
@salt_variable = SaltVariable.new(salt_variable_params)
|
23
|
+
if @salt_variable.save
|
24
|
+
process_success
|
25
|
+
else
|
26
|
+
process_error
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def resource_class
|
31
|
+
"ForemanSalt::#{controller_name.singularize.classify}".constantize
|
32
|
+
end
|
33
|
+
|
34
|
+
private
|
35
|
+
|
36
|
+
def default_order; end
|
37
|
+
|
38
|
+
def resource
|
39
|
+
@salt_variable
|
40
|
+
end
|
41
|
+
|
42
|
+
def resource_params
|
43
|
+
salt_variable_params
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -8,6 +8,20 @@ module ForemanSalt
|
|
8
8
|
select_action_button(_('Import'), {}, links)
|
9
9
|
end
|
10
10
|
|
11
|
+
def salt_module_select(form, persisted)
|
12
|
+
blank_opt = persisted ? {} : { :include_blank => true }
|
13
|
+
select_items = persisted ? [form.object.salt_module] : SaltModule.order(:name)
|
14
|
+
select_f form,
|
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
|
+
end
|
24
|
+
|
11
25
|
def colorize(state)
|
12
26
|
# Make the state easier to read
|
13
27
|
combo = %w(2E9DB9 4D1D59 2C777E 1C4758 591D4B)
|
@@ -0,0 +1,13 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "#{ForemanSalt::Engine.root}/lib/foreman_salt/version"
|
4
|
+
|
5
|
+
module ForemanSalt
|
6
|
+
# General helper functions for foreman_salt
|
7
|
+
module SaltPluginHelper
|
8
|
+
def salt_doc_url
|
9
|
+
major_version = ::ForemanSalt::VERSION.split('.')[0]
|
10
|
+
"https://theforeman.org/plugins/foreman_salt/#{major_version}.x/index.html"
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -47,11 +47,26 @@ module ForemanSalt
|
|
47
47
|
before_destroy :delete_salt_key, :if => ->(host) { host.salt_proxy }
|
48
48
|
end
|
49
49
|
|
50
|
+
def salt_params
|
51
|
+
variables = ForemanSalt::SaltVariable.where(:salt_module_id => all_salt_modules.pluck(:id), :override => true)
|
52
|
+
values = variables.values_hash(self)
|
53
|
+
|
54
|
+
variables.each_with_object({}) do |var, memo|
|
55
|
+
value = values[var]
|
56
|
+
memo[var.key] = value if value
|
57
|
+
memo
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
50
61
|
def salt_modules_for_enc
|
62
|
+
all_salt_modules.collect(&:name).uniq
|
63
|
+
end
|
64
|
+
|
65
|
+
def all_salt_modules
|
51
66
|
return [] unless salt_environment
|
52
67
|
|
53
68
|
modules = salt_modules + (hostgroup ? hostgroup.all_salt_modules : [])
|
54
|
-
ForemanSalt::SaltModule.in_environment(salt_environment).where(:id => modules)
|
69
|
+
ForemanSalt::SaltModule.in_environment(salt_environment).where(:id => modules)
|
55
70
|
end
|
56
71
|
|
57
72
|
def salt_master
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module ForemanSalt
|
2
4
|
class SaltModule < ApplicationRecord
|
3
5
|
include Authorizable
|
@@ -11,6 +13,9 @@ module ForemanSalt
|
|
11
13
|
has_many :hostgroup_salt_modules, :foreign_key => :salt_module_id
|
12
14
|
has_many :hostgroups, :through => :hostgroup_salt_modules
|
13
15
|
|
16
|
+
has_many :salt_variables, :inverse_of => :salt_module,
|
17
|
+
:dependent => :destroy
|
18
|
+
|
14
19
|
has_many :salt_module_environments
|
15
20
|
has_many :salt_environments, :through => :salt_module_environments
|
16
21
|
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ForemanSalt
|
4
|
+
# Represents the variables used in Salt
|
5
|
+
class SaltVariable < LookupKey
|
6
|
+
belongs_to :salt_module, :inverse_of => :salt_variables
|
7
|
+
validates :salt_module_id, :presence => true
|
8
|
+
before_validation :cast_default_value, :if => :override?
|
9
|
+
scoped_search :on => :key, :aliases => [:name], :complete_value => true
|
10
|
+
scoped_search :relation => :salt_module, :on => :name,
|
11
|
+
:complete_value => true, :rename => :salt_module
|
12
|
+
|
13
|
+
def salt?
|
14
|
+
true
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.humanize_class_name(options = nil)
|
18
|
+
if options.present?
|
19
|
+
super
|
20
|
+
else
|
21
|
+
"Salt variable"
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def editable_by_user?
|
26
|
+
SaltVariable.authorized(:edit_external_parameters).where(:id => id).exists?
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -79,7 +79,7 @@ module ForemanSalt
|
|
79
79
|
result['changes']['diff']
|
80
80
|
elsif !result['pchanges'].blank? && result['pchanges'].include?('diff')
|
81
81
|
result['pchanges']['diff']
|
82
|
-
elsif
|
82
|
+
elsif result['comment'].presence
|
83
83
|
result['comment']
|
84
84
|
else
|
85
85
|
'No message available'
|
@@ -0,0 +1,21 @@
|
|
1
|
+
object @salt_variable
|
2
|
+
|
3
|
+
attribute :parameter
|
4
|
+
attributes :id, :variable, :salt_state, :salt_state_id, :description, :override,
|
5
|
+
:variable_type, :hidden_value?, :validator_type,
|
6
|
+
:validator_rule, :merge_overrides, :merge_default,
|
7
|
+
:avoid_duplicates, :override_value_order, :created_at, :updated_at,
|
8
|
+
:default_value
|
9
|
+
|
10
|
+
node do |salt_variable|
|
11
|
+
{
|
12
|
+
:override_values => partial(
|
13
|
+
'api/v2/override_values/index',
|
14
|
+
:object => salt_variable.lookup_values
|
15
|
+
)
|
16
|
+
}
|
17
|
+
end
|
18
|
+
|
19
|
+
node :override_values_count do |lk|
|
20
|
+
lk.lookup_values.count
|
21
|
+
end
|
@@ -23,9 +23,17 @@
|
|
23
23
|
<td><%= link_to_if_authorized(salt_module.hosts.count, hash_for_hosts_path(:search => "salt_state = #{salt_module}")) %></td>
|
24
24
|
<td><%= link_to_if_authorized(salt_module.hostgroups.count, hash_for_hostgroups_path(:search => "salt_state = #{salt_module}")) %></td>
|
25
25
|
<td>
|
26
|
-
|
27
|
-
|
28
|
-
|
26
|
+
<%
|
27
|
+
links = [
|
28
|
+
link_to(
|
29
|
+
_('Variables'), salt_variables_path(:search => "salt_module = #{salt_module}")),
|
30
|
+
display_link_if_authorized(_('Edit'), hash_for_edit_salt_module_path(:id => salt_module).merge(:auth_object => salt_module, :authorizer => authorizer)),
|
31
|
+
display_delete_if_authorized(hash_for_salt_module_path(:id => salt_module).merge(:auth_object => salt_module, :authorizer => authorizer),
|
32
|
+
:confirm => _('Delete %s?') % salt_module.name)
|
33
|
+
]
|
34
|
+
%>
|
35
|
+
<%= action_buttons(*links) %>
|
36
|
+
</td>
|
29
37
|
</td>
|
30
38
|
</tr>
|
31
39
|
<% end %>
|
@@ -0,0 +1,73 @@
|
|
1
|
+
<div id='<%= f.object.to_param %>' class='tab-pane fields'>
|
2
|
+
<fieldset>
|
3
|
+
<h2><%= _("Salt Variable Details")%></h2>
|
4
|
+
<%= text_f f, :key, :disabled => f.object.persisted?, :size => "col-md-8" %>
|
5
|
+
<%= textarea_f f, :description, :rows => :auto, :size => "col-md-8", :class => "no-stretch" %>
|
6
|
+
<%= salt_module_select f, f.object.persisted? %>
|
7
|
+
|
8
|
+
</fieldset>
|
9
|
+
<fieldset>
|
10
|
+
<h2><%= _("Default Behavior") %></h2>
|
11
|
+
<h6><%= _("Override the default value of the Salt variable.") %></h6>
|
12
|
+
<%= checkbox_f(f, :override, :onchange => 'toggleOverrideValue(this)', :size => "col-md-8",
|
13
|
+
:label_help => _('Mark the variable to be managed by Foreman. When the Salt State of this variable is assigned to a host, the default value will be added as a Salt pillar for this host. Specify matchers to set a different value for such variable.')
|
14
|
+
) %>
|
15
|
+
|
16
|
+
<% version = Foreman::Version.new %>
|
17
|
+
<% if version.major.to_i >= 1 && version.minor.to_i >= 22 %>
|
18
|
+
<%= param_type_selector(f, false, :onchange => 'keyTypeChange(this)', :disabled => !f.object.override) %>
|
19
|
+
<% else %>
|
20
|
+
<%= param_type_selector(f, :onchange => 'keyTypeChange(this)', :disabled => !f.object.override) %>
|
21
|
+
<% end %>
|
22
|
+
<%= textarea_f f, :default_value, :value => f.object.default_value_before_type_cast, :size => "col-md-8",
|
23
|
+
:disabled => (!f.object.override || f.object.omit),
|
24
|
+
:input_group_btn => fullscreen_input,
|
25
|
+
:rows => 1,
|
26
|
+
:label_help => _("Value to use when there is no match."),
|
27
|
+
:class => "no-stretch #{'masked-input' if f.object.hidden_value?}" %>
|
28
|
+
<div class="form-group">
|
29
|
+
<%= checkbox_f(f, :hidden_value, :label => _('Hidden Value'),
|
30
|
+
:class => 'hidden_value_textarea_switch', :onchange => 'toggle_lookupkey_hidden(this)',
|
31
|
+
:checked => f.object.hidden_value?,
|
32
|
+
:label_help => _("Hide all values for this parameter."),
|
33
|
+
:size => "col-md-1", :label_size => "col-md-2", :table_field => true,
|
34
|
+
:disabled => !f.object.override) %>
|
35
|
+
</div>
|
36
|
+
</fieldset>
|
37
|
+
<fieldset>
|
38
|
+
<%= collapsing_header _("Optional Input Validator"), "#optional_input_validators_#{f.object.id}", "collapsed" %>
|
39
|
+
<div id="optional_input_validators_<%= f.object.id %>" class="collapse out">
|
40
|
+
<h6><%= _('Before including these variables as Salt pillar, Foreman will validate that your variables comply with the validation.') %></h6>
|
41
|
+
|
42
|
+
<%= checkbox_f(f, :required, :size => "col-md-8", :disabled => !f.object.override,
|
43
|
+
:label_help => _("If checked, will raise an error if there is no default value and no matcher provide a value.")
|
44
|
+
) %>
|
45
|
+
<%= validator_type_selector f %>
|
46
|
+
<%= text_f f, :validator_rule, :size => "col-md-8", :disabled => f.object.validator_type.blank?, :class => "no-stretch" %>
|
47
|
+
</div>
|
48
|
+
</fieldset>
|
49
|
+
</br>
|
50
|
+
<div class="matcher-parent" <%= "id=#{f.object.key.to_s.gsub(' ', '_')}_lookup_key_override_value" %> style=<%= "display:none;" if !f.object.override %>>
|
51
|
+
<fieldset>
|
52
|
+
<h2><%= _("Prioritize Attribute Order") %></h2>
|
53
|
+
<h6><%= _("Set the order in which values are resolved.") %></h6>
|
54
|
+
<%= textarea_f f, :path, :rows => :auto, :label => _("Order"), :id => 'order', :size => "col-md-8", :onchange => 'fill_in_matchers()', :value => f.object.path, :class => "no-stretch",
|
55
|
+
:label_help => _("The order in which matchers keys are processed, first match wins.<br> You may use multiple attributes as a matcher key, for example, an order of <code>host group, environment</code> would expect a matcher such as <code>hostgroup = \"web servers\", environment = production</code>").html_safe %>
|
56
|
+
<%= checkbox_f(f, :merge_overrides, :onchange => 'mergeOverridesChanged(this)', :table_field => true,
|
57
|
+
:disabled => !f.object.supports_merge?, :size => "col-md-1", :label_size => "col-md-2",
|
58
|
+
:label_help => _("Continue to look for matches after first find (only array/hash type)? Note: merging overrides ignores all matchers that are omitted.")) %>
|
59
|
+
<%= checkbox_f(f, :merge_default, :disabled => !f.object.merge_overrides, :size => "col-md-1", :table_field => true,
|
60
|
+
:label_size => "col-md-2", :label_help => _("Include default value when merging all matching values.")) %>
|
61
|
+
<%= checkbox_f(f, :avoid_duplicates, :disabled => (!f.object.supports_uniq? || !f.object.merge_overrides),
|
62
|
+
:size => "col-md-1", :label_size => "col-md-2", :table_field => true,
|
63
|
+
:label_help => _("Avoid duplicate values when merging them (only array type)?")) %>
|
64
|
+
</fieldset>
|
65
|
+
</br>
|
66
|
+
<fieldset>
|
67
|
+
<h2><%= _("Specify Matchers") %> <%= documentation_button('4.2.6SmartMatchers') %></h2>
|
68
|
+
<div class="children_fields lookup_values">
|
69
|
+
<%= render 'lookup_keys/values', :f => f, :is_param => false %>
|
70
|
+
</div>
|
71
|
+
</fieldset>
|
72
|
+
</div>
|
73
|
+
</div>
|
@@ -0,0 +1,17 @@
|
|
1
|
+
<%= breadcrumbs(
|
2
|
+
:items => [
|
3
|
+
{
|
4
|
+
:caption => _('Salt Variables'),
|
5
|
+
:url => url_for(salt_variables_path)
|
6
|
+
},
|
7
|
+
{
|
8
|
+
:caption => _('Edit %s' % @salt_variable.key)
|
9
|
+
}
|
10
|
+
],
|
11
|
+
:switchable => false
|
12
|
+
) %>
|
13
|
+
<% title(_('Edit Salt Variable')) %>
|
14
|
+
<%= form_for(@salt_variable, :url => salt_variable_path(:id => @salt_variable.id)) do |f| %>
|
15
|
+
<%= render 'fields', :f => f %>
|
16
|
+
<%= submit_or_cancel f %>
|
17
|
+
<% end %>
|
@@ -0,0 +1,46 @@
|
|
1
|
+
<% title _("Salt Variables") %>
|
2
|
+
|
3
|
+
<%= title_actions display_link_if_authorized(_('New Salt Variable'), hash_for_new_salt_variable_path, :class => "btn btn-default no-float"),
|
4
|
+
documentation_button('#4.3Variables', :root_url => salt_doc_url) %>
|
5
|
+
|
6
|
+
<table class="<%= table_css_classes 'table-fixed' %>">
|
7
|
+
<thead>
|
8
|
+
<tr>
|
9
|
+
<th class='col-md-6'><%= sort :name, :as => s_('Variable|Name') %></th>
|
10
|
+
<th class='col-md-2'><%= sort :salt_module, :as => s_('Variable|State') %></th>
|
11
|
+
<th class='col-md-1'><%= _('Type') %></th>
|
12
|
+
<th class='col-md-2'><%= _('Actions') %></th>
|
13
|
+
</tr>
|
14
|
+
</thead>
|
15
|
+
<tbody>
|
16
|
+
<% @salt_variables.each do |variable| %>
|
17
|
+
<tr>
|
18
|
+
<td class="ellipsis"><%= link_to_if_authorized(
|
19
|
+
icon_text((variable.override ? "flag": ""), variable.key.to_s, :kind => 'fa', :title => _('Overriden')),
|
20
|
+
hash_for_edit_salt_variable_path(:id => variable).
|
21
|
+
merge(:auth_object => variable,
|
22
|
+
:permission => 'edit_external_parameters',
|
23
|
+
:authorizer => authorizer)
|
24
|
+
) %></td>
|
25
|
+
<td class="ellipsis"><%= link_to_if_authorized(
|
26
|
+
variable.salt_module.name,
|
27
|
+
hash_for_salt_variables_path(:search => "salt_module = #{variable.salt_module}")
|
28
|
+
) %></td>
|
29
|
+
<td class="ellipsis"><%= variable.key_type || 'string' %></td>
|
30
|
+
<td class="ellipsis">
|
31
|
+
<% links = [
|
32
|
+
display_delete_if_authorized(
|
33
|
+
hash_for_salt_variable_path(:id => variable.id).merge(
|
34
|
+
:auth_object => variable,
|
35
|
+
:authorizer => authorizer),
|
36
|
+
:data => { :confirm => _("Delete %s?") % variable.key },
|
37
|
+
:action => :delete)
|
38
|
+
] %>
|
39
|
+
<%= action_buttons(*links) %>
|
40
|
+
</td>
|
41
|
+
</tr>
|
42
|
+
<% end %>
|
43
|
+
</tbody>
|
44
|
+
</table>
|
45
|
+
|
46
|
+
<%= will_paginate_with_info @salt_variables %>
|
@@ -0,0 +1,17 @@
|
|
1
|
+
<%= breadcrumbs(
|
2
|
+
:items => [
|
3
|
+
{
|
4
|
+
:caption => _('Salt Variables'),
|
5
|
+
:url => url_for(salt_variables_path)
|
6
|
+
},
|
7
|
+
{
|
8
|
+
:caption => _('Create Salt Variable')
|
9
|
+
}
|
10
|
+
],
|
11
|
+
:switchable => false
|
12
|
+
) %>
|
13
|
+
<% title(_('Create Salt Variable')) %>
|
14
|
+
<%= form_for(@salt_variable, :url => salt_variables_path) do |f| %>
|
15
|
+
<%= render 'fields', :f => f %>
|
16
|
+
<%= submit_or_cancel f %>
|
17
|
+
<% end %>
|
data/config/routes.rb
CHANGED
@@ -27,6 +27,13 @@ Rails.application.routes.draw do
|
|
27
27
|
end
|
28
28
|
end
|
29
29
|
|
30
|
+
resources :salt_variables, :controller => 'foreman_salt/salt_variables', :except => [:show] do
|
31
|
+
resources :lookup_values, :only => [:index, :create, :update, :destroy]
|
32
|
+
collection do
|
33
|
+
get 'auto_complete_search'
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
30
37
|
scope :api, :path => '/api', :defaults => { :format => 'json' } do
|
31
38
|
scope '(:apiv)', :defaults => { :apiv => 'v2' },
|
32
39
|
:apiv => /v1|v2/, :constraints => ApiConstraints.new(:version => 2) do
|
@@ -49,6 +56,8 @@ Rails.application.routes.draw do
|
|
49
56
|
resources :salt_minions, :only => [:show, :index, :update], :controller => 'foreman_salt/api/v2/salt_minions'
|
50
57
|
resources :salt_states, :only => [:show, :index, :create, :destroy], :controller => 'foreman_salt/api/v2/salt_states'
|
51
58
|
end
|
59
|
+
|
60
|
+
resources :salt_variables, :only => [:show, :index, :destroy, :update, :create], :controller => 'foreman_salt/api/v2/salt_variables'
|
52
61
|
end
|
53
62
|
end
|
54
63
|
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# to keep track of when the modules were imported
|
4
|
+
class AddSaltModuleIdToLookupKeys < ActiveRecord::Migration[4.2]
|
5
|
+
def up
|
6
|
+
add_column :lookup_keys, :salt_module_id, :integer
|
7
|
+
add_index :lookup_keys, :salt_module_id
|
8
|
+
end
|
9
|
+
|
10
|
+
def down
|
11
|
+
remove_index :lookup_keys, :salt_module_id
|
12
|
+
remove_column :lookup_keys, :salt_module_id
|
13
|
+
end
|
14
|
+
end
|