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.
Files changed (39) hide show
  1. checksums.yaml +4 -4
  2. data/app/controllers/foreman_salt/api/v2/salt_variables_controller.rb +75 -0
  3. data/app/controllers/foreman_salt/concerns/salt_override_value.rb +28 -0
  4. data/app/controllers/foreman_salt/concerns/salt_variable_parameters.rb +29 -0
  5. data/app/controllers/foreman_salt/minions_controller.rb +2 -0
  6. data/app/controllers/foreman_salt/salt_variables_controller.rb +46 -0
  7. data/app/helpers/foreman_salt/salt_modules_helper.rb +14 -0
  8. data/app/helpers/foreman_salt/salt_plugin_helper.rb +13 -0
  9. data/app/models/foreman_salt/concerns/host_managed_extensions.rb +16 -1
  10. data/app/models/foreman_salt/salt_module.rb +5 -0
  11. data/app/models/foreman_salt/salt_variable.rb +29 -0
  12. data/app/services/foreman_salt/report_importer.rb +1 -1
  13. data/app/views/foreman_salt/api/v2/salt_variables/create.json.rabl +3 -0
  14. data/app/views/foreman_salt/api/v2/salt_variables/destroy.json.rabl +3 -0
  15. data/app/views/foreman_salt/api/v2/salt_variables/index.json.rabl +3 -0
  16. data/app/views/foreman_salt/api/v2/salt_variables/show.json.rabl +21 -0
  17. data/app/views/foreman_salt/salt_modules/index.html.erb +11 -3
  18. data/app/views/foreman_salt/salt_variables/_fields.erb +73 -0
  19. data/app/views/foreman_salt/salt_variables/edit.html.erb +17 -0
  20. data/app/views/foreman_salt/salt_variables/index.html.erb +46 -0
  21. data/app/views/foreman_salt/salt_variables/new.html.erb +17 -0
  22. data/config/routes.rb +9 -0
  23. data/db/migrate/20190515112233_add_salt_module_id_to_lookup_keys.rb +14 -0
  24. data/lib/foreman_salt/plugin.rb +44 -16
  25. data/lib/foreman_salt/version.rb +1 -1
  26. data/locale/de/foreman_salt.edit.po +68 -41
  27. data/locale/en/foreman_salt.edit.po +1 -1
  28. data/test/factories/foreman_salt_factories.rb +6 -0
  29. data/test/functional/api/v2/salt_states_controller_test.rb +1 -1
  30. data/test/functional/api/v2/salt_variables_controller_test.rb +35 -0
  31. data/test/functional/minions_controller_test.rb +65 -5
  32. data/test/functional/salt_modules_controller_test.rb +22 -0
  33. data/test/functional/salt_variables_controller_test.rb +33 -0
  34. data/test/integration/salt_autosign_test.rb +1 -1
  35. data/test/integration/salt_keys_test.rb +3 -3
  36. data/test/integration/salt_module_test.rb +1 -1
  37. data/test/integration/salt_variable_test.rb +24 -0
  38. data/test/unit/salt_variables_test.rb +32 -0
  39. metadata +27 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 36fe9df5ebf245a2e3d62f66a9368a16a71ad78bbf07ff4ac5dc6dada03ad515
4
- data.tar.gz: 48f709a541f72c61e6fa5133f5b10e8de76fefc72e3c143a50e9b6e4069f92f8
3
+ metadata.gz: dce5a18cef1f569ee315e5260928b43cc24a059b895f6cf2c4bbc6c98592cac8
4
+ data.tar.gz: 864b8551057471a940a44b5d0447502040558fc0b697339a7ca28a09f1256203
5
5
  SHA512:
6
- metadata.gz: 8bb26eeb33777bb1c8a763d2238d2c47ad613efc90090f562821344126a1c0df24e4b50669131902632b1a19958f322b243870b6cd5b59b182a5c4166cab6640
7
- data.tar.gz: 6b11de698ddfa5bc6da7a8e1ce2ab839e092018b158179b2e56cb70ede9fdbb53f667b63ab81a53c4ce26bc2887555b963b229a8ec6ad622bd26bcec03e1e98b
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).pluck("salt_modules.name").uniq
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 !result['comment'].blank?
82
+ elsif result['comment'].presence
83
83
  result['comment']
84
84
  else
85
85
  'No message available'
@@ -0,0 +1,3 @@
1
+ object @salt_variable
2
+
3
+ extends "foreman_salt/api/v2/salt_variables/show"
@@ -0,0 +1,3 @@
1
+ object @salt_variable
2
+
3
+ extends "foreman_salt/api/v2/salt_variables/show"
@@ -0,0 +1,3 @@
1
+ collection @salt_variables
2
+
3
+ extends 'foreman_salt/api/v2/salt_variables/show'
@@ -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
- <%= action_buttons([display_link_if_authorized(_('Edit'), hash_for_edit_salt_module_path(:id => salt_module).merge(:auth_object => salt_module, :authorizer => authorizer)),
27
- display_delete_if_authorized(hash_for_salt_module_path(:id => salt_module).merge(:auth_object => salt_module, :authorizer => authorizer),
28
- :confirm => _('Delete %s?') % salt_module.name)]) %>
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