foreman_salt 2.0.2 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. checksums.yaml +13 -5
  2. data/app/assets/javascripts/foreman_salt/states.js +33 -0
  3. data/app/controllers/foreman_salt/api/v2/salt_states_controller.rb +53 -2
  4. data/app/controllers/foreman_salt/concerns/hostgroups_controller_extensions.rb +23 -2
  5. data/app/controllers/foreman_salt/concerns/hosts_controller_extensions.rb +7 -3
  6. data/app/controllers/foreman_salt/minions_controller.rb +33 -1
  7. data/app/controllers/foreman_salt/salt_modules_controller.rb +45 -1
  8. data/app/controllers/foreman_salt/state_importer.rb +72 -0
  9. data/app/helpers/foreman_salt/salt_modules_helper.rb +19 -0
  10. data/app/lib/proxy_api/salt.rb +18 -0
  11. data/app/models/foreman_salt/concerns/host_managed_extensions.rb +23 -8
  12. data/app/models/foreman_salt/concerns/hostgroup_extensions.rb +12 -9
  13. data/app/models/foreman_salt/host_salt_module.rb +6 -0
  14. data/app/models/foreman_salt/hostgroup_salt_module.rb +6 -0
  15. data/app/models/foreman_salt/salt_environment.rb +13 -6
  16. data/app/models/foreman_salt/salt_module.rb +27 -5
  17. data/app/models/foreman_salt/salt_module_environment.rb +14 -0
  18. data/app/overrides/salt_environment_host_selector.rb +9 -0
  19. data/app/overrides/{salt_environment_selector.rb → salt_environment_hostgroup_selector.rb} +2 -6
  20. data/app/overrides/salt_modules_selector.rb +4 -4
  21. data/app/services/foreman_salt/fact_importer.rb +1 -1
  22. data/app/services/foreman_salt/report_importer.rb +9 -7
  23. data/app/services/foreman_salt/smart_proxies/salt_keys.rb +1 -1
  24. data/app/views/foreman_salt/salt_environments/index.html.erb +8 -2
  25. data/app/views/foreman_salt/salt_modules/_form.html.erb +7 -1
  26. data/app/{overrides/foreman → views/foreman_salt}/salt_modules/_host_tab.html.erb +0 -0
  27. data/app/views/foreman_salt/salt_modules/_host_tab_pane.html.erb +33 -0
  28. data/app/views/foreman_salt/salt_modules/import.html.erb +43 -0
  29. data/app/views/foreman_salt/salt_modules/index.html.erb +17 -5
  30. data/config/routes.rb +23 -3
  31. data/db/migrate/20150411003302_add_environments_to_modules.rb +17 -0
  32. data/db/migrate/20150509094409_rename_join_tables.rb +11 -0
  33. data/db/migrate/20150509101505_add_primary_keys.rb +6 -0
  34. data/lib/foreman_salt/engine.rb +21 -1
  35. data/lib/foreman_salt/version.rb +1 -1
  36. data/lib/tasks/foreman_salt_tasks.rake +0 -1
  37. data/test/unit/host_extensions_test.rb +15 -1
  38. data/test/unit/hostgroup_extensions_test.rb +2 -2
  39. metadata +35 -24
  40. data/app/overrides/foreman/salt_modules/_host_tab_pane.html.erb +0 -22
@@ -1,11 +1,7 @@
1
1
  selector_text = "<%= select_f f, :salt_environment_id, ForemanSalt::SaltEnvironment.all, :id, :name,
2
2
  { :include_blank => blank_or_inherit_f(f, :salt_environment) },
3
- { :label => _('Salt Environment') } %>"
4
-
5
- Deface::Override.new(:virtual_path => 'hosts/_form',
6
- :name => 'add_salt_environment_to_host',
7
- :insert_bottom => 'div#primary',
8
- :text => selector_text)
3
+ { :label => _('Salt Environment'), :onchange => 'update_salt_states(this)', :'data-url' => salt_environment_selected_hostgroups_path,
4
+ :'data-host-id' => (@host || @hostgroup).id, :help_inline => :indicator} %>"
9
5
 
10
6
  Deface::Override.new(:virtual_path => 'hostgroups/_form',
11
7
  :name => 'add_salt_environment_to_hostgroup',
@@ -1,19 +1,19 @@
1
1
  Deface::Override.new(:virtual_path => 'hosts/_form',
2
2
  :name => 'add_salt_modules_tab_to_host',
3
3
  :insert_after => 'li.active',
4
- :partial => '../overrides/foreman/salt_modules/host_tab')
4
+ :partial => 'foreman_salt/salt_modules/host_tab')
5
5
 
6
6
  Deface::Override.new(:virtual_path => 'hosts/_form',
7
7
  :name => 'add_salt_modules_tab_pane_to_host',
8
8
  :insert_before => 'div#puppet_klasses',
9
- :partial => '../overrides/foreman/salt_modules/host_tab_pane')
9
+ :partial => 'foreman_salt/salt_modules/host_tab_pane')
10
10
 
11
11
  Deface::Override.new(:virtual_path => 'hostgroups/_form',
12
12
  :name => 'add_salt_modules_tab_to_hg',
13
13
  :insert_after => 'li.active',
14
- :partial => '../overrides/foreman/salt_modules/host_tab')
14
+ :partial => 'foreman_salt/salt_modules/host_tab')
15
15
 
16
16
  Deface::Override.new(:virtual_path => 'hostgroups/_form',
17
17
  :name => 'add_salt_modules_tab_pane_to_hg',
18
18
  :insert_before => 'div#puppet_klasses',
19
- :partial => '../overrides/foreman/salt_modules/host_tab_pane')
19
+ :partial => 'foreman_salt/salt_modules/host_tab_pane')
@@ -102,7 +102,7 @@ module ForemanSalt
102
102
  sparse(hash).each do |k, v|
103
103
  current = ret
104
104
  key = k.to_s.split(options.fetch(:separator, FactName::SEPARATOR))
105
- current = (current[key.shift] ||= Hash.new) until (key.size <= 1)
105
+ current = (current[key.shift] ||= {}) until (key.size <= 1)
106
106
  current[key.first] = v
107
107
  end
108
108
  ret
@@ -43,7 +43,7 @@ module ForemanSalt
43
43
  private
44
44
 
45
45
  def find_or_create_host(host)
46
- @host ||= Host::Base.find_by_name(host)
46
+ @host ||= Host::Managed.find_by_name(host)
47
47
 
48
48
  unless @host
49
49
  new = Host::Managed.new(:name => host)
@@ -106,14 +106,16 @@ module ForemanSalt
106
106
  end
107
107
  end
108
108
 
109
- time[resource] = if result['duration'].is_a? String
110
- Float(result['duration'].delete(' ms')) rescue nil
111
- else
112
- result['duration']
113
- end
109
+ duration = if result['duration'].is_a? String
110
+ Float(result['duration'].delete(' ms')) rescue nil
111
+ else
112
+ result['duration']
113
+ end
114
+
115
+ time[resource] = duration || 0
114
116
  end
115
117
 
116
- time[:total] = time.values.inject(&:+)
118
+ time[:total] = time.values.compact.inject(&:+) || 0
117
119
  events = { :total => changed + failed + restarted + restarted_failed, :success => success + restarted, :failure => failed + restarted_failed }
118
120
 
119
121
  changes = { :total => changed + restarted }
@@ -22,7 +22,7 @@ module ForemanSalt
22
22
  end
23
23
 
24
24
  def find(proxy, name)
25
- all(proxy).select { |c| c.name == name }.first
25
+ all(proxy).find { |c| c.name == name }
26
26
  end
27
27
 
28
28
  def find_by_state(proxy, state)
@@ -5,14 +5,20 @@
5
5
  <table class="table table-bordered table-striped">
6
6
  <tr>
7
7
  <th><%= sort :name, :as => s_('SaltEnvironment|Name') %></th>
8
+ <th><%= _('States') %></th>
9
+ <th><%= sort :host, :as => _('Hosts'), :default => 'DESC' %></th>
10
+ <th><%= sort :hostgroup, :as => _('Host groups'), :default => 'DESC' %></th>
8
11
  <th></th>
9
12
  </tr>
10
13
  <% for salt_environment in @salt_environments %>
11
14
  <tr>
12
15
  <td><%=link_to_if_authorized h(salt_environment.name), hash_for_edit_salt_environment_path(:id => salt_environment).merge(:auth_object => salt_environment, :authorizer => authorizer) %></td>
16
+ <td><%= link_to_if_authorized(salt_environment.salt_modules.count, hash_for_salt_modules_path(:search => "environment = #{salt_environment}")) %></td>
17
+ <td><%= link_to_if_authorized(salt_environment.hosts.count, hash_for_hosts_path(:search => "salt_environment = #{salt_environment}")) %></td>
18
+ <td><%= link_to_if_authorized(salt_environment.hostgroups.count, hash_for_hostgroups_path(:search => "salt_environment = #{salt_environment}")) %></td>
13
19
  <td>
14
- <%= action_buttons(display_delete_if_authorized hash_for_salt_environment_path(:id => salt_environment).merge(:auth_object => salt_environment, :authorizer => authorizer),
15
- :confirm => _('Delete %s?') % salt_environment.name) %>
20
+ <%= action_buttons(display_delete_if_authorized(hash_for_salt_environment_path(:id => salt_environment).merge(:auth_object => salt_environment, :authorizer => authorizer),
21
+ :confirm => _('Delete %s?') % salt_environment.name)) %>
16
22
  </td>
17
23
  </tr>
18
24
  <% end %>
@@ -2,14 +2,20 @@
2
2
  <%= base_errors_for @salt_module %>
3
3
  <ul class="nav nav-tabs" data-tabs="tabs">
4
4
  <li class="active"><a href="#primary" data-toggle="tab"><%= _('Salt States') %></a></li>
5
+ <li><a href="#environments" data-toggle="tab"><%= _('Environments') %></a></li>
5
6
  </ul>
6
7
 
7
8
  <div class="tab-content">
8
9
  <div class="tab-pane active" id="primary">
9
10
  <%= text_f f, :name %>
10
11
  </div>
12
+
13
+ <div class="tab-pane" id="environments">
14
+ <%= multiple_selects f, :salt_environment, ::ForemanSalt::SaltEnvironment, @salt_environments.try(:map, &:id), :label => _("Environments").html_safe %>
15
+ </div>
11
16
  </div>
12
17
 
13
- <%= submit_or_cancel f %>
18
+ <%= submit_or_cancel f %>
19
+
14
20
  <% end %>
15
21
 
@@ -0,0 +1,33 @@
1
+ <%= javascript "foreman_salt/states" %>
2
+
3
+ <%
4
+ object_name = @obj.kind_of?(Hostgroup) ? 'hostgroup' : 'host'
5
+ @salt_modules ||= []
6
+ @selected ||= []
7
+ %>
8
+
9
+ <div class="tab-pane" id="salt_modules">
10
+ <div id="state_selector" style="<%= @salt_environment.blank? ? 'display: none' : 'visibility: block' %>;">
11
+ <% @inherited_salt_modules = [] if @inherited_salt_modules.blank? %>
12
+ <div class="row">
13
+ <div class="col-md-4">
14
+ <h3>Inherited States</h3>
15
+ <ul id="inherited_states">
16
+ <% @inherited_salt_modules.sort.each do |salt_module| -%>
17
+ <li title="Inherited from hostgroup"><%= salt_module.name -%></li>
18
+ <% end -%>
19
+ </ul>
20
+ </div>
21
+ <div class="col-md-8">
22
+ <h3>Salt States</h3>
23
+ <%= fields_for "#{object_name}".to_sym do |states| %>
24
+ <%= states.collection_select(:salt_module_ids, @salt_modules, :id, :to_s, {:selected => @selected.map(&:id), :size => "col-md-10"},
25
+ :multiple => true) %>
26
+ <% end %>
27
+ </div>
28
+ </div>
29
+ </div>
30
+ <div id="no_env" style="visibility: <%= @salt_environment.blank? ? 'block' : 'hidden' %>;">
31
+ <div class="alert alert-block alert-warning"><%= _('Please select a Salt environment first') %></div>
32
+ </div>
33
+ </div>
@@ -0,0 +1,43 @@
1
+ <% title _('Import from %s') % @proxy.name %>
2
+
3
+ <%= form_tag apply_changes_salt_modules_path do %>
4
+
5
+ <h4><%= _("Select the changes you want to realize in Foreman") %></h4>
6
+ <br/>
7
+ <h6>
8
+ <%= _("Toggle") %>:
9
+ <%= link_to_function(icon_text("check", _("Added")),
10
+ "toggleCheckboxesBySelector('.state_check_add')",
11
+ :title => _("Check/Uncheck Added")) %> |
12
+ <%= link_to_function(icon_text("check", _("Removed")),
13
+ "toggleCheckboxesBySelector('.state_check_remove')",
14
+ :title => _("Check/Uncheck Removed")) %>
15
+ </h6>
16
+
17
+ <table class="table table-bordered table-striped">
18
+ <tr>
19
+ <th class="ca"><%= link_to_function(icon_text("check"),
20
+ "toggleCheckboxesBySelector('.state_check')",
21
+ :title => _("Check/Uncheck All")) %></th>
22
+ <th><%= _('Environment') %></th>
23
+ <th><%= _('Operation') %></th>
24
+ <th><%= _('States') %></th>
25
+ </tr>
26
+ <% @changes.each do |environment, changed| -%>
27
+ <% [:add, :remove].each do |operation| -%>
28
+ <% if changed[operation] %>
29
+ <tr>
30
+ <td class="ca"><%= check_box_tag "changed[#{environment}][#{operation}]", changed[operation].to_json, false, :class => "state_check state_check_#{operation}" %></td>
31
+ <td><%= environment %><%= '*' if @deletes.include? environment %></td>
32
+ <td><%= operation.to_s.titleize %></td>
33
+ <td><%= changed[operation].to_sentence -%></td>
34
+ </tr>
35
+ <% end -%>
36
+ <% end -%>
37
+ <% end -%>
38
+ </table>
39
+ <%= '<p>* Environment will contain no states, and will be deleted'.html_safe if @deletes.any? %>
40
+
41
+ <p><%= link_to _("Cancel"), salt_modules_path, :class => "btn btn-default" %>
42
+ <%= submit_tag _("Update"), :class => "btn btn-primary" %>
43
+ <% end -%>
@@ -1,18 +1,31 @@
1
1
  <% title _('Salt States') %>
2
2
 
3
- <% title_actions button_group(display_link_if_authorized(_('New Salt State'), hash_for_new_salt_module_path)) %>
3
+ <% title_actions import_from_proxies,
4
+ button_group(display_link_if_authorized(_('New Salt State'), hash_for_new_salt_module_path)) %>
5
+
4
6
 
5
7
  <table class="table table-bordered table-striped">
6
8
  <tr>
7
9
  <th><%= sort :name, :as => s_('SaltModule|Name') %></th>
10
+ <th><%= _('Environments') %></th>
11
+ <th><%= sort :host, :as => _('Hosts'), :default => 'DESC' %></th>
12
+ <th><%= sort :hostgroup, :as => _('Host groups'), :default => 'DESC' %></th>
8
13
  <th></th>
9
14
  </tr>
10
15
  <% for salt_module in @salt_modules %>
11
16
  <tr>
12
- <td><%=link_to_if_authorized h(salt_module.name), hash_for_edit_salt_module_path(:id => salt_module).merge(:auth_object => salt_module, :authorizer => authorizer) %></td>
17
+ <td><%= link_to_if_authorized(colorize(salt_module.name), hash_for_edit_salt_module_path(:id => salt_module)) %></td>
18
+ <td>
19
+ <% salt_module.salt_environments.sort.each do |environment| -%>
20
+ <%= link_to environment.name, :controller => :'foreman_salt/salt_modules', :action => :index, :search => "environment = #{environment.name}" %>
21
+ <% end -%>
22
+ </td>
23
+ <td><%= link_to_if_authorized(salt_module.hosts.count, hash_for_hosts_path(:search => "salt_state = #{salt_module}")) %></td>
24
+ <td><%= link_to_if_authorized(salt_module.hostgroups.count, hash_for_hostgroups_path(:search => "salt_state = #{salt_module}")) %></td>
13
25
  <td>
14
- <%= action_buttons(display_delete_if_authorized hash_for_salt_module_path(:id => salt_module).merge(:auth_object => salt_module, :authorizer => authorizer),
15
- :confirm => _('Delete %s?') % salt_module.name) %>
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)]) %>
16
29
  </td>
17
30
  </tr>
18
31
  <% end %>
@@ -20,4 +33,3 @@
20
33
 
21
34
  <%= page_entries_info @salt_modules %>
22
35
  <%= will_paginate @salt_modules %>
23
-
data/config/routes.rb CHANGED
@@ -5,18 +5,30 @@ Rails.application.routes.draw do
5
5
  match '/run/:id' => 'foreman_salt/minions#run'
6
6
  end
7
7
 
8
- resources :salt_environments, :controller => 'foreman_salt/salt_environments' do
8
+ resources :minions, :controller => 'foreman_salt/minions', :only => [] do
9
9
  collection do
10
- get 'auto_complete_search'
10
+ constraints(:id => /[^\/]+/) do
11
+ post 'salt_environment_selected'
12
+ end
11
13
  end
12
14
  end
13
15
 
14
- resources :salt_modules, :controller => 'foreman_salt/salt_modules' do
16
+ resources :salt_environments, :controller => 'foreman_salt/salt_environments' do
15
17
  collection do
16
18
  get 'auto_complete_search'
17
19
  end
18
20
  end
19
21
 
22
+ constraints :id => /[\w\.-]+/ do
23
+ resources :salt_modules, :controller => 'foreman_salt/salt_modules' do
24
+ collection do
25
+ get 'import'
26
+ get 'auto_complete_search'
27
+ post 'apply_changes'
28
+ end
29
+ end
30
+ end
31
+
20
32
  scope :api, :path => '/api', :defaults => { :format => 'json' } do
21
33
  scope '(:apiv)', :defaults => { :apiv => 'v2' },
22
34
  :apiv => /v1|v2/, :constraints => ApiConstraints.new(:version => 2) do
@@ -30,6 +42,8 @@ Rails.application.routes.draw do
30
42
  match '/salt_autosign/:smart_proxy_id' => 'foreman_salt/api/v2/salt_autosign#index', :via => :get
31
43
  match '/salt_autosign/:smart_proxy_id' => 'foreman_salt/api/v2/salt_autosign#create', :via => :post
32
44
  match '/salt_autosign/:smart_proxy_id/:record' => 'foreman_salt/api/v2/salt_autosign#destroy', :via => :delete
45
+
46
+ match '/salt_states/import/:smart_proxy_id' => 'foreman_salt/api/v2/salt_states#import', :via => :post
33
47
  end
34
48
 
35
49
  constraints(:id => /[\w\.-]+/) do
@@ -52,4 +66,10 @@ Rails.application.routes.draw do
52
66
  end
53
67
  end
54
68
  end
69
+
70
+ resources :hostgroups do
71
+ collection do
72
+ post 'salt_environment_selected'
73
+ end
74
+ end
55
75
  end
@@ -0,0 +1,17 @@
1
+ class AddEnvironmentsToModules < ActiveRecord::Migration
2
+ def up
3
+ create_table 'salt_module_environments' do |t|
4
+ t.references :salt_module
5
+ t.references :salt_environment
6
+ end
7
+
8
+ environments = ForemanSalt::SaltEnvironment.all
9
+ ForemanSalt::SaltModule.all.each do |state|
10
+ state.salt_environments << environments
11
+ end
12
+ end
13
+
14
+ def down
15
+ drop_table :salt_module_environments
16
+ end
17
+ end
@@ -0,0 +1,11 @@
1
+ class RenameJoinTables < ActiveRecord::Migration
2
+ def up
3
+ rename_table :hosts_salt_modules, :host_salt_modules
4
+ rename_table :hostgroups_salt_modules, :hostgroup_salt_modules
5
+ end
6
+
7
+ def down
8
+ rename_table :host_salt_modules, :hosts_salt_modules
9
+ rename_table :hostgroup_salt_modules, :hostgroups_salt_modules
10
+ end
11
+ end
@@ -0,0 +1,6 @@
1
+ class AddPrimaryKeys < ActiveRecord::Migration
2
+ def change
3
+ add_column :host_salt_modules, :id, :primary_key
4
+ add_column :hostgroup_salt_modules, :id, :primary_key
5
+ end
6
+ end
@@ -2,6 +2,8 @@ require 'deface'
2
2
 
3
3
  module ForemanSalt
4
4
  class Engine < ::Rails::Engine
5
+ engine_name 'foreman_salt'
6
+
5
7
  config.autoload_paths += Dir["#{config.root}/app/controllers/concerns"]
6
8
  config.autoload_paths += Dir["#{config.root}/app/helpers/concerns"]
7
9
  config.autoload_paths += Dir["#{config.root}/app/models/concerns"]
@@ -21,6 +23,14 @@ module ForemanSalt
21
23
  app.config.paths['db/migrate'] += ForemanSalt::Engine.paths['db/migrate'].existent
22
24
  end
23
25
 
26
+ initializer "foreman_salt.assets.precompile" do |app|
27
+ app.config.assets.precompile += %w(foreman_salt/states.js)
28
+ end
29
+
30
+ initializer 'foreman_salt.configure_assets', :group => :assets do
31
+ SETTINGS[:foreman_salt] = {:assets => {:precompile => ['foreman_salt/states.js']}}
32
+ end
33
+
24
34
  initializer 'foreman_salt.apipie' do
25
35
  Apipie.configuration.checksum_path += ['/salt/api/']
26
36
  end
@@ -93,7 +103,8 @@ module ForemanSalt
93
103
  :resource_type => 'Host'
94
104
 
95
105
  permission :edit_hosts,
96
- { :'foreman_salt/api/v2/salt_minions' => [:update] },
106
+ { :'foreman_salt/api/v2/salt_minions' => [:update],
107
+ :'foreman_salt/minions' => [:salt_environment_selected] },
97
108
  :resource_type => 'Host'
98
109
 
99
110
  permission :view_hosts,
@@ -101,6 +112,10 @@ module ForemanSalt
101
112
  :'foreman_salt/api/v2/salt_minions' => [:index, :show] },
102
113
  :resource_type => 'Host'
103
114
 
115
+ permission :edit_hostgroups,
116
+ { :hostgroups => [:salt_environment_selected] },
117
+ :resource_type => 'Hostgroup'
118
+
104
119
  permission :view_smart_proxies_salt_keys,
105
120
  { :'foreman_salt/salt_keys' => [:index],
106
121
  :'foreman_salt/api/v2/salt_keys' => [:index] },
@@ -121,6 +136,11 @@ module ForemanSalt
121
136
  :'foreman_salt/api/v2/salt_states' => [:create] },
122
137
  :resource_type => 'ForemanSalt::SaltModule'
123
138
 
139
+ permission :import_salt_modules,
140
+ { :'foreman_salt/salt_modules' => [:import, :apply_changes],
141
+ :'foreman_salt/api/v2/salt_states' => [:import] },
142
+ :resource_type => 'ForemanSalt::SaltModule'
143
+
124
144
  permission :view_salt_modules,
125
145
  { :'foreman_salt/salt_modules' => [:index, :show, :auto_complete_search],
126
146
  :'foreman_salt/api/v2/salt_states' => [:index, :show] },
@@ -1,3 +1,3 @@
1
1
  module ForemanSalt
2
- VERSION = '2.0.2'
2
+ VERSION = '2.1.0'
3
3
  end
@@ -33,6 +33,5 @@ load 'tasks/jenkins.rake'
33
33
  if Rake::Task.task_defined?(:'jenkins:unit')
34
34
  Rake::Task['jenkins:unit'].enhance do
35
35
  Rake::Task['test:foreman_salt'].invoke
36
- Rake::Task['foreman_salt:rubocop'].invoke
37
36
  end
38
37
  end
@@ -8,7 +8,7 @@ module ForemanSalt
8
8
 
9
9
  test 'host has a salt smart proxy' do
10
10
  host = FactoryGirl.create :host, :with_salt_proxy
11
- assert host.salt_proxy.features.map(&:name).include? 'Salt'
11
+ assert host.salt_proxy.has_feature? 'Salt'
12
12
  end
13
13
 
14
14
  test 'smart_proxy_ids returns salt smart proxy' do
@@ -28,5 +28,19 @@ module ForemanSalt
28
28
  host.set_hostgroup_defaults
29
29
  assert_equal host.salt_proxy, hostgroup.salt_proxy
30
30
  end
31
+
32
+ test 'host does not accept salt modules outside its environment' do
33
+ hosts_environment = FactoryGirl.create :salt_environment
34
+ other_environment = FactoryGirl.create :salt_environment
35
+
36
+ state = FactoryGirl.create :salt_module
37
+ other_environment.salt_modules << state
38
+
39
+ host = FactoryGirl.create :host, :with_salt_proxy, :salt_environment => hosts_environment
40
+ host.salt_modules = [state]
41
+
42
+ refute host.save
43
+ assert host.errors.full_messages.include? 'Salt states must be in the environment of the host'
44
+ end
31
45
  end
32
46
  end
@@ -14,7 +14,7 @@ module ForemanSalt
14
14
  test 'nested host group inherits salt modules from parent' do
15
15
  parent = FactoryGirl.create :hostgroup, :with_salt_modules
16
16
  child = FactoryGirl.create :hostgroup, :parent => parent
17
- assert_equal [], parent.salt_modules - child.salt_modules
17
+ assert_equal [], parent.all_salt_modules - child.all_salt_modules
18
18
  end
19
19
 
20
20
  test 'child host group inherits salt proxy from child parent' do
@@ -34,7 +34,7 @@ module ForemanSalt
34
34
  parent = FactoryGirl.create :hostgroup, :with_salt_modules
35
35
  child_one = FactoryGirl.create :hostgroup, :parent => parent
36
36
  child_two = FactoryGirl.create :hostgroup, :parent => child_one
37
- assert_equal [], parent.salt_modules - child_two.salt_modules
37
+ assert_equal [], parent.all_salt_modules - child_two.all_salt_modules
38
38
  end
39
39
  end
40
40
  end
metadata CHANGED
@@ -1,41 +1,41 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: foreman_salt
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.2
4
+ version: 2.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Stephen Benjamin
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-03-17 00:00:00.000000000 Z
11
+ date: 2015-05-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: deface
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "<"
17
+ - - <
18
18
  - !ruby/object:Gem::Version
19
19
  version: '1.0'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - "<"
24
+ - - <
25
25
  - !ruby/object:Gem::Version
26
26
  version: '1.0'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: foreman-tasks
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - "~>"
31
+ - - ~>
32
32
  - !ruby/object:Gem::Version
33
33
  version: 0.6.9
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - "~>"
38
+ - - ~>
39
39
  - !ruby/object:Gem::Version
40
40
  version: 0.6.9
41
41
  description: Foreman Plug-in for Salt
@@ -48,6 +48,7 @@ files:
48
48
  - LICENSE
49
49
  - README.md
50
50
  - Rakefile
51
+ - app/assets/javascripts/foreman_salt/states.js
51
52
  - app/controllers/foreman_salt/api/v2/base_controller.rb
52
53
  - app/controllers/foreman_salt/api/v2/jobs_controller.rb
53
54
  - app/controllers/foreman_salt/api/v2/salt_autosign_controller.rb
@@ -64,21 +65,25 @@ files:
64
65
  - app/controllers/foreman_salt/salt_environments_controller.rb
65
66
  - app/controllers/foreman_salt/salt_keys_controller.rb
66
67
  - app/controllers/foreman_salt/salt_modules_controller.rb
68
+ - app/controllers/foreman_salt/state_importer.rb
67
69
  - app/helpers/concerns/foreman_salt/hosts_helper_extensions.rb
68
70
  - app/helpers/concerns/foreman_salt/smart_proxies_helper_extensions.rb
69
71
  - app/helpers/foreman_salt/salt_keys_helper.rb
72
+ - app/helpers/foreman_salt/salt_modules_helper.rb
70
73
  - app/lib/actions/foreman_salt/report_import.rb
71
74
  - app/lib/proxy_api/salt.rb
72
75
  - app/models/foreman_salt/concerns/host_managed_extensions.rb
73
76
  - app/models/foreman_salt/concerns/hostgroup_extensions.rb
74
77
  - app/models/foreman_salt/concerns/orchestration/salt.rb
75
78
  - app/models/foreman_salt/fact_name.rb
79
+ - app/models/foreman_salt/host_salt_module.rb
80
+ - app/models/foreman_salt/hostgroup_salt_module.rb
76
81
  - app/models/foreman_salt/salt_environment.rb
77
82
  - app/models/foreman_salt/salt_module.rb
83
+ - app/models/foreman_salt/salt_module_environment.rb
78
84
  - app/models/setting/salt.rb
79
- - app/overrides/foreman/salt_modules/_host_tab.html.erb
80
- - app/overrides/foreman/salt_modules/_host_tab_pane.html.erb
81
- - app/overrides/salt_environment_selector.rb
85
+ - app/overrides/salt_environment_host_selector.rb
86
+ - app/overrides/salt_environment_hostgroup_selector.rb
82
87
  - app/overrides/salt_modules_selector.rb
83
88
  - app/overrides/salt_proxy_selector.rb
84
89
  - app/services/foreman_salt/fact_importer.rb
@@ -116,7 +121,10 @@ files:
116
121
  - app/views/foreman_salt/salt_environments/new.html.erb
117
122
  - app/views/foreman_salt/salt_keys/index.erb
118
123
  - app/views/foreman_salt/salt_modules/_form.html.erb
124
+ - app/views/foreman_salt/salt_modules/_host_tab.html.erb
125
+ - app/views/foreman_salt/salt_modules/_host_tab_pane.html.erb
119
126
  - app/views/foreman_salt/salt_modules/edit.html.erb
127
+ - app/views/foreman_salt/salt_modules/import.html.erb
120
128
  - app/views/foreman_salt/salt_modules/index.html.erb
121
129
  - app/views/foreman_salt/salt_modules/new.html.erb
122
130
  - config/routes.rb
@@ -125,6 +133,9 @@ files:
125
133
  - db/migrate/20140829210214_add_salt_modules_to_hostgroups.rb
126
134
  - db/migrate/20140920232200_create_salt_environments.rb
127
135
  - db/migrate/20150220122707_fix_incorrect_report_metrics.rb
136
+ - db/migrate/20150411003302_add_environments_to_modules.rb
137
+ - db/migrate/20150509094409_rename_join_tables.rb
138
+ - db/migrate/20150509101505_add_primary_keys.rb
128
139
  - db/seeds.d/75-salt-seeds.rb
129
140
  - lib/foreman_salt.rb
130
141
  - lib/foreman_salt/engine.rb
@@ -159,12 +170,12 @@ require_paths:
159
170
  - lib
160
171
  required_ruby_version: !ruby/object:Gem::Requirement
161
172
  requirements:
162
- - - ">="
173
+ - - ! '>='
163
174
  - !ruby/object:Gem::Version
164
175
  version: '0'
165
176
  required_rubygems_version: !ruby/object:Gem::Requirement
166
177
  requirements:
167
- - - ">="
178
+ - - ! '>='
168
179
  - !ruby/object:Gem::Version
169
180
  version: '0'
170
181
  requirements: []
@@ -174,22 +185,22 @@ signing_key:
174
185
  specification_version: 4
175
186
  summary: Foreman Plug-in for Salt
176
187
  test_files:
177
- - test/integration/salt_keys_test.rb
178
- - test/integration/salt_environment_test.rb
179
- - test/integration/salt_module_test.rb
180
- - test/integration/salt_autosign_test.rb
188
+ - test/functional/minions_controller_test.rb
189
+ - test/functional/api/v2/salt_states_controller_test.rb
190
+ - test/functional/api/v2/salt_autosign_controller_test.rb
191
+ - test/functional/api/v2/salt_keys_controller_test.rb
192
+ - test/functional/api/v2/salt_environments_controller_test.rb
193
+ - test/factories/foreman_salt_factories.rb
181
194
  - test/unit/salt_keys_test.rb
182
- - test/unit/grains_centos.json
183
195
  - test/unit/host_extensions_test.rb
184
- - test/unit/salt_modules_test.rb
185
- - test/unit/highstate.json
196
+ - test/unit/grains_centos.json
186
197
  - test/unit/grains_importer_test.rb
187
198
  - test/unit/hostgroup_extensions_test.rb
188
199
  - test/unit/report_importer_test.rb
200
+ - test/unit/salt_modules_test.rb
201
+ - test/unit/highstate.json
189
202
  - test/test_plugin_helper.rb
190
- - test/factories/foreman_salt_factories.rb
191
- - test/functional/minions_controller_test.rb
192
- - test/functional/api/v2/salt_environments_controller_test.rb
193
- - test/functional/api/v2/salt_autosign_controller_test.rb
194
- - test/functional/api/v2/salt_states_controller_test.rb
195
- - test/functional/api/v2/salt_keys_controller_test.rb
203
+ - test/integration/salt_keys_test.rb
204
+ - test/integration/salt_environment_test.rb
205
+ - test/integration/salt_autosign_test.rb
206
+ - test/integration/salt_module_test.rb