foreman_salt 13.0.0 → 13.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 +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
|