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.
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