foreman_remote_execution 0.1.1 → 0.1.2

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 (77) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/template_invocation.js +48 -5
  3. data/app/controllers/api/v2/job_invocations_controller.rb +55 -10
  4. data/app/controllers/api/v2/job_templates_controller.rb +19 -4
  5. data/app/controllers/api/v2/template_inputs_controller.rb +88 -0
  6. data/app/controllers/job_invocations_controller.rb +17 -15
  7. data/app/controllers/template_invocations_controller.rb +2 -0
  8. data/app/helpers/remote_execution_helper.rb +27 -16
  9. data/app/lib/actions/middleware/bind_job_invocation.rb +7 -3
  10. data/app/lib/actions/remote_execution/run_host_job.rb +28 -17
  11. data/app/lib/actions/remote_execution/run_hosts_job.rb +9 -6
  12. data/app/models/concerns/foreman_remote_execution/foreman_tasks_task_extensions.rb +1 -1
  13. data/app/models/concerns/foreman_remote_execution/foreman_tasks_triggering_extensions.rb +9 -0
  14. data/app/models/concerns/foreman_remote_execution/host_extensions.rb +3 -1
  15. data/app/models/job_invocation.rb +48 -41
  16. data/app/models/job_invocation_composer.rb +205 -80
  17. data/app/models/job_invocation_task_group.rb +18 -0
  18. data/app/models/job_template.rb +25 -1
  19. data/app/models/job_template_effective_user.rb +23 -0
  20. data/app/models/remote_execution_provider.rb +25 -11
  21. data/app/models/setting/remote_execution.rb +6 -0
  22. data/app/models/ssh_execution_provider.rb +37 -0
  23. data/app/models/targeting.rb +13 -0
  24. data/app/models/template_input.rb +4 -1
  25. data/app/models/template_invocation.rb +23 -0
  26. data/app/views/api/v2/job_invocations/base.json.rabl +4 -0
  27. data/app/views/api/v2/job_invocations/index.json.rabl +1 -1
  28. data/app/views/api/v2/job_invocations/main.json.rabl +19 -0
  29. data/app/views/api/v2/job_invocations/show.json.rabl +0 -15
  30. data/app/views/api/v2/job_templates/base.json.rabl +1 -1
  31. data/app/views/api/v2/job_templates/index.json.rabl +1 -1
  32. data/app/views/api/v2/job_templates/main.json.rabl +5 -1
  33. data/app/views/api/v2/job_templates/show.json.rabl +4 -0
  34. data/app/views/api/v2/job_templates/update.json.rabl +3 -0
  35. data/app/views/api/v2/template_inputs/base.json.rabl +3 -0
  36. data/app/views/api/v2/template_inputs/create.json.rabl +3 -0
  37. data/app/views/api/v2/template_inputs/index.json.rabl +3 -0
  38. data/app/views/api/v2/template_inputs/main.json.rabl +9 -0
  39. data/app/views/api/v2/template_inputs/show.json.rabl +3 -0
  40. data/app/views/job_invocation_task_groups/_job_invocation_task_group.html.erb +31 -0
  41. data/app/views/job_invocation_task_groups/_job_invocation_task_groups.html.erb +3 -0
  42. data/app/views/job_invocations/_form.html.erb +102 -71
  43. data/app/views/job_invocations/_tab_overview.html.erb +5 -2
  44. data/app/views/job_invocations/index.html.erb +4 -4
  45. data/app/views/job_invocations/refresh.js.erb +2 -1
  46. data/app/views/job_invocations/show.html.erb +13 -2
  47. data/app/views/job_invocations/show.js.erb +1 -1
  48. data/app/views/job_templates/_custom_tabs.html.erb +16 -0
  49. data/app/views/templates/package_action.erb +1 -0
  50. data/app/views/templates/puppet_run_once.erb +1 -0
  51. data/app/views/templates/run_command.erb +1 -0
  52. data/app/views/templates/service_action.erb +1 -0
  53. data/config/routes.rb +15 -2
  54. data/db/migrate/20150923125825_add_job_invocation_task_group.rb +10 -0
  55. data/db/migrate/20151022105508_rename_last_task_id_column.rb +6 -0
  56. data/db/migrate/20151116105412_add_triggering_to_job_invocation.rb +10 -0
  57. data/db/migrate/20151120171100_add_effective_user_to_template_invocation.rb +5 -0
  58. data/db/migrate/20151124162300_create_job_template_effective_users.rb +13 -0
  59. data/db/migrate/20151203100824_add_description_to_job_invocation.rb +11 -0
  60. data/db/migrate/20151215114631_add_host_id_to_template_invocation.rb +29 -0
  61. data/db/migrate/20151217092555_migrate_to_task_groups.rb +16 -0
  62. data/foreman_remote_execution.gemspec +2 -1
  63. data/lib/foreman_remote_execution/engine.rb +30 -5
  64. data/lib/foreman_remote_execution/version.rb +1 -1
  65. data/test/factories/foreman_remote_execution_factories.rb +5 -0
  66. data/test/functional/api/v2/job_invocations_controller_test.rb +3 -3
  67. data/test/functional/api/v2/template_inputs_controller_test.rb +61 -0
  68. data/test/unit/actions/run_hosts_job_test.rb +10 -3
  69. data/test/unit/concerns/host_extensions_test.rb +10 -6
  70. data/test/unit/job_invocation_composer_test.rb +229 -10
  71. data/test/unit/job_invocation_test.rb +27 -27
  72. data/test/unit/job_template_effective_user_test.rb +41 -0
  73. data/test/unit/job_template_test.rb +24 -0
  74. data/test/unit/remote_execution_provider_test.rb +39 -0
  75. metadata +42 -7
  76. data/app/models/job_invocation_api_composer.rb +0 -69
  77. data/test/unit/job_invocation_api_composer_test.rb +0 -143
@@ -8,6 +8,10 @@
8
8
  :id => 'search') %>
9
9
  <% end %>
10
10
 
11
+ <%= text_f f, :description_format,
12
+ :help_inline => popover(_('Explanation'), _('Description template determines the job name once it is submitted. Input values can become part of the name
13
+ if they are specified using interpolation syntax, e.g. %{fqdn} where fqdn is the name of interpolated input.')) %>
14
+
11
15
  <%= select_f f, :provider_type, providers_options, :first, :last %>
12
16
 
13
17
  <div class="children_fields">
@@ -20,6 +24,18 @@
20
24
  <%= add_child_link '+ ' + _("Add Input"), :template_inputs, { :title => _('add a input for this template')} %>
21
25
  </div>
22
26
 
27
+ <div class="children_fields">
28
+ <%= field_set_tag _("Effective user") do %>
29
+ <%= f.fields_for :effective_user, @template.effective_user do |ff| %>
30
+ <div class="effective_user_form fields">
31
+ <%= text_f ff, :value %>
32
+ <%= checkbox_f ff, :current_user %>
33
+ <%= checkbox_f ff, :overridable %>
34
+ </div>
35
+ <% end %>
36
+ <% end %>
37
+ </div>
38
+
23
39
  </div>
24
40
 
25
41
 
@@ -2,6 +2,7 @@
2
2
  kind: job_template
3
3
  name: Package Action - SSH Default
4
4
  job_name: Package Action
5
+ description_format: "%{action} package(s) %{package}"
5
6
  provider_type: Ssh
6
7
  template_inputs:
7
8
  - name: pre_script
@@ -2,6 +2,7 @@
2
2
  kind: job_template
3
3
  name: Puppet Run Once - SSH Default
4
4
  job_name: Puppet Run Once
5
+ description_format: '%{job_name} with "%{puppet_options}"'
5
6
  provider_type: Ssh
6
7
  template_inputs:
7
8
  - name: puppet_options
@@ -2,6 +2,7 @@
2
2
  kind: job_template
3
3
  name: Run Command - SSH Default
4
4
  job_name: Run Command
5
+ description_format: "%{job_name} %{command}"
5
6
  provider_type: Ssh
6
7
  template_inputs:
7
8
  - name: command
@@ -2,6 +2,7 @@
2
2
  kind: job_template
3
3
  name: Service Action - SSH Default
4
4
  job_name: Service Action
5
+ description_format: '%{action} service %{service}'
5
6
  provider_type: Ssh
6
7
  template_inputs:
7
8
  - name: action
data/config/routes.rb CHANGED
@@ -24,11 +24,20 @@ Rails.application.routes.draw do
24
24
  end
25
25
  end
26
26
 
27
- resources :template_invocations, :only => [:show]
27
+ # index is needed so the auto_complete_search can be constructed, otherwise autocompletion in filter does not work
28
+ resources :template_invocations, :only => [:show, :index] do
29
+ collection do
30
+ get 'auto_complete_search'
31
+ end
32
+ end
28
33
 
29
34
  namespace :api, :defaults => {:format => 'json'} do
30
35
  scope "(:apiv)", :module => :v2, :defaults => {:apiv => 'v2'}, :apiv => /v1|v2/, :constraints => ApiConstraints.new(:version => 2, :default => true) do
31
- resources :job_invocations, :except => [:new, :edit, :update, :destroy]
36
+ resources :job_invocations, :except => [:new, :edit, :update, :destroy] do
37
+ resources :hosts, :only => :none do
38
+ get '/', :to => 'job_invocations#output'
39
+ end
40
+ end
32
41
 
33
42
  resources :job_templates, :except => [:new, :edit] do
34
43
  (resources :locations, :only => [:index, :show]) if SETTINGS[:locations_enabled]
@@ -38,6 +47,10 @@ Rails.application.routes.draw do
38
47
  get 'revision'
39
48
  end
40
49
  end
50
+
51
+ resources :templates, :only => :none do
52
+ resources :template_inputs, :only => [:index, :show, :create, :new, :destroy, :update]
53
+ end
41
54
  end
42
55
  end
43
56
  end
@@ -0,0 +1,10 @@
1
+ class AddJobInvocationTaskGroup < ActiveRecord::Migration
2
+ def up
3
+ add_column :job_invocations, :task_group_id, :integer, :index => true
4
+ add_foreign_key :job_invocations, :foreman_tasks_task_groups, :column => :task_group_id
5
+ end
6
+
7
+ def down
8
+ remove_column :job_invocations, :task_group_id
9
+ end
10
+ end
@@ -0,0 +1,6 @@
1
+ class RenameLastTaskIdColumn < ActiveRecord::Migration
2
+ def change
3
+ rename_column :job_invocations, :last_task_id, :task_id
4
+ rename_index :job_invocations, 'job_invocations_last_task_id', 'job_invocations_task_id'
5
+ end
6
+ end
@@ -0,0 +1,10 @@
1
+ class AddTriggeringToJobInvocation < ActiveRecord::Migration
2
+ def up
3
+ add_column :job_invocations, :triggering_id, :integer, :index => true
4
+ add_foreign_key :job_invocations, :foreman_tasks_triggerings, :column => :triggering_id
5
+ end
6
+
7
+ def down
8
+ remove_column :job_invocations, :triggering_id
9
+ end
10
+ end
@@ -0,0 +1,5 @@
1
+ class AddEffectiveUserToTemplateInvocation < ActiveRecord::Migration
2
+ def change
3
+ add_column :template_invocations, :effective_user, :string
4
+ end
5
+ end
@@ -0,0 +1,13 @@
1
+ class CreateJobTemplateEffectiveUsers < ActiveRecord::Migration
2
+ def change
3
+ create_table :job_template_effective_users do |t|
4
+ t.integer :job_template_id
5
+ t.string :value
6
+ t.boolean :overridable
7
+ t.boolean :current_user
8
+ end
9
+
10
+ add_index :job_template_effective_users, :job_template_id, :name => 'effective_users_job_template_id'
11
+ add_foreign_key :job_template_effective_users, :templates, :column => :job_template_id
12
+ end
13
+ end
@@ -0,0 +1,11 @@
1
+ class AddDescriptionToJobInvocation < ActiveRecord::Migration
2
+ def up
3
+ add_column :job_invocations, :description, :string
4
+ add_column :templates, :description_format, :string
5
+ end
6
+
7
+ def down
8
+ remove_column :job_invocations, :description
9
+ remove_column :templates, :description_format
10
+ end
11
+ end
@@ -0,0 +1,29 @@
1
+ class AddHostIdToTemplateInvocation < ActiveRecord::Migration
2
+ class FakeTemplateInvocation < ActiveRecord::Base
3
+ set_table_name 'template_invocations'
4
+ end
5
+
6
+ def up
7
+ add_column :template_invocations, :host_id, :integer
8
+ add_foreign_key "template_invocations", "hosts", :name => "template_invocations_hosts_id_fk", :column => 'host_id'
9
+ FakeTemplateInvocation.reset_column_information
10
+
11
+ say 'Migrating existing execution locks to explicit relations, this may take a while'
12
+ FakeTemplateInvocation.all.each do |template_invocation|
13
+ task = ForemanTasks::Task.for_action_types('Actions::RemoteExecution::RunHostJob').joins(:locks).where(
14
+ :'foreman_tasks_locks.resource_type' => 'TemplateInvocation',
15
+ :'foreman_tasks_locks.resource_id' => template_invocation.id).first
16
+ next if task.nil? # skip invocations from very early versions of remote executions
17
+ host_id = task.locks.where(:'foreman_tasks_locks.resource_type' => 'Host::Managed').first.resource_id
18
+ next unless Host.find_by_id(host_id)
19
+
20
+ template_invocation.host_id = host_id
21
+ template_invocation.save!
22
+ end
23
+ end
24
+
25
+ def down
26
+ remove_foreign_key "template_invocations", :name => "template_invocations_hosts_id_fk"
27
+ remove_column :template_invocations, :host_id
28
+ end
29
+ end
@@ -0,0 +1,16 @@
1
+ class MigrateToTaskGroups < ActiveRecord::Migration
2
+ class FakeJobInvocation < ActiveRecord::Base
3
+ set_table_name 'job_invocations'
4
+ end
5
+
6
+ def up
7
+ say 'Migrating from locks to task groups'
8
+ FakeJobInvocation.where('task_group_id IS NULL AND task_id IS NOT NULL').each do |job_invocation|
9
+ task_group = JobInvocationTaskGroup.new
10
+ task_group.task_ids = [job_invocation.task_id]
11
+ task_group.save!
12
+ job_invocation.task_group_id = task_group.id
13
+ job_invocation.save!
14
+ end
15
+ end
16
+ end
@@ -20,7 +20,8 @@ Gem::Specification.new do |s|
20
20
 
21
21
  s.add_dependency "deface"
22
22
  s.add_dependency "rails", "~> 3.2.8"
23
- s.add_dependency "foreman-tasks", "~> 0.7.6"
23
+ s.add_dependency "dynflow", "~> 0.8.8"
24
+ s.add_dependency "foreman-tasks", "~> 0.7.8"
24
25
 
25
26
  s.add_development_dependency 'rubocop'
26
27
  s.add_development_dependency 'rdoc'
@@ -34,22 +34,46 @@ module ForemanRemoteExecution
34
34
  # Add permissions
35
35
  security_block :foreman_remote_execution do
36
36
  permission :view_job_templates, { :job_templates => [:index, :show, :revision, :auto_complete_search, :auto_complete_job_name, :preview],
37
- :'api/v2/job_templates' => [:index, :show, :revision] }, :resource_type => 'JobTemplate'
37
+ :'api/v2/job_templates' => [:index, :show, :revision],
38
+ :'api/v2/template_inputs' => [:index, :show]}, :resource_type => 'JobTemplate'
38
39
  permission :create_job_templates, { :job_templates => [:new, :create, :clone_template],
39
40
  :'api/v2/job_templates' => [:create, :clone] }, :resource_type => 'JobTemplate'
40
41
  permission :edit_job_templates, { :job_templates => [:edit, :update],
41
- :'api/v2/job_templates' => [:update] }, :resource_type => 'JobTemplate'
42
+ :'api/v2/job_templates' => [:update],
43
+ :'api/v2/template_inputs' => [:update, :new, :create, :destroy]}, :resource_type => 'JobTemplate'
42
44
  permission :destroy_job_templates, { :job_templates => [:destroy],
43
45
  :'api/v2/job_templates' => [:destroy] }, :resource_type => 'JobTemplate'
44
46
  permission :lock_job_templates, { :job_templates => [:lock, :unlock] }, :resource_type => 'JobTemplate'
45
47
  permission :create_job_invocations, { :job_invocations => [:new, :create, :refresh, :rerun, :preview_hosts],
46
48
  'api/v2/job_invocations' => [:create] }, :resource_type => 'JobInvocation'
47
49
  permission :view_job_invocations, { :job_invocations => [:index, :show, :auto_complete_search], :template_invocations => [:show],
48
- 'api/v2/job_invocations' => [:index, :show] }, :resource_type => 'JobInvocation'
50
+ 'api/v2/job_invocations' => [:index, :show, :output] }, :resource_type => 'JobInvocation'
51
+ permission :execute_template_invocation, {}, :resource_type => 'TemplateInvocation'
52
+ # this permissions grants user to get auto completion hints when setting up filters
53
+ permission :filter_autocompletion_for_template_invocation, { :template_invocations => [ :auto_complete_search, :index ] },
54
+ :resource_type => 'TemplateInvocation'
49
55
  end
50
56
 
51
- # Add a new role called 'ForemanRemoteExecution' if it doesn't exist
52
- # role 'ForemanRemoteExecution', [:view_foreman_remote_execution]
57
+ USER_PERMISSIONS = [
58
+ :view_job_templates,
59
+ :view_job_invocations,
60
+ :create_job_invocations,
61
+ :execute_template_invocation,
62
+ :view_hosts,
63
+ :view_smart_proxies
64
+ ]
65
+ MANAGER_PERMISSIONS = USER_PERMISSIONS + [
66
+ :destroy_job_templates,
67
+ :edit_job_templates,
68
+ :create_job_templates,
69
+ :lock_job_templates,
70
+ :view_audit_logs,
71
+ :filter_autocompletion_for_template_invocation
72
+ ]
73
+
74
+ # Add a new role called 'Remote Execution User ' if it doesn't exist
75
+ role 'Remote Execution User', USER_PERMISSIONS
76
+ role 'Remote Execution Manager', MANAGER_PERMISSIONS
53
77
 
54
78
  # add menu entry
55
79
  menu :top_menu, :job_templates,
@@ -122,6 +146,7 @@ module ForemanRemoteExecution
122
146
  # having issues with resolving it to Rake::Task otherwise
123
147
  require_dependency 'foreman_tasks/task'
124
148
  ForemanTasks::Task.send(:include, ForemanRemoteExecution::ForemanTasksTaskExtensions)
149
+ RemoteExecutionProvider.register(:Ssh, SSHExecutionProvider)
125
150
  end
126
151
 
127
152
  initializer 'foreman_remote_execution.register_gettext', after: :load_config_initializers do |_app|
@@ -1,3 +1,3 @@
1
1
  module ForemanRemoteExecution
2
- VERSION = '0.1.1'
2
+ VERSION = '0.1.2'
3
3
  end
@@ -11,6 +11,10 @@ FactoryGirl.define do
11
11
  template.template_inputs << FactoryGirl.build(:template_input)
12
12
  end
13
13
  end
14
+
15
+ trait :with_description_format do
16
+ description_format "Factory-built %{job_name}"
17
+ end
14
18
  end
15
19
 
16
20
  factory :template_input do |f|
@@ -27,6 +31,7 @@ FactoryGirl.define do
27
31
  factory :job_invocation do |f|
28
32
  targeting
29
33
  f.sequence(:job_name) { |n| "Job name #{n}" }
34
+ f.description_format '%{job_name}'
30
35
  trait :with_template do
31
36
  after(:build) do |invocation, evaluator|
32
37
  invocation.template_invocations << FactoryGirl.build(:template_invocation)
@@ -23,7 +23,7 @@ module Api
23
23
  assert_equal template["job_name"], @invocation.job_name
24
24
  end
25
25
 
26
- test "should create valid without template_id" do
26
+ test "should create valid without job_template_id" do
27
27
  attrs = { :job_name => @template.job_name, :name => 'RandomName', :targeting_type => 'static_query', :search_query => "foobar"}
28
28
  post :create, :job_invocation => attrs
29
29
 
@@ -32,8 +32,8 @@ module Api
32
32
  assert_response :success
33
33
  end
34
34
 
35
- test "should create valid with template_id" do
36
- attrs = { :job_name => @template.job_name, :name => 'RandomName', :template_id => @template.id,:targeting_type => 'static_query', :search_query => "foobar"}
35
+ test "should create valid with job_template_id" do
36
+ attrs = { :job_name => @template.job_name, :name => 'RandomName', :job_template_id => @template.id,:targeting_type => 'static_query', :search_query => "foobar"}
37
37
  post :create, :job_invocation => attrs
38
38
 
39
39
  invocation = ActiveSupport::JSON.decode(@response.body)
@@ -0,0 +1,61 @@
1
+ require 'test_plugin_helper'
2
+
3
+ module Api
4
+ module V2
5
+ class TemplateInputsControllerTest < ActionController::TestCase
6
+ setup do
7
+ @template = FactoryGirl.create(:job_template, :with_input)
8
+ @input = @template.template_inputs.first
9
+ end
10
+
11
+ test 'should get index' do
12
+ get :index, :template_id => @template.id
13
+ inputs = ActiveSupport::JSON.decode(@response.body)
14
+ assert !inputs.empty?, "Should respond with inputs"
15
+ assert_response :success
16
+ end
17
+
18
+ test 'should get input detail' do
19
+ get :show, :template_id => @template.to_param, :id => @input.to_param
20
+ assert_response :success
21
+ input = ActiveSupport::JSON.decode(@response.body)
22
+ assert !input.empty?
23
+ assert_equal input["name"], @input.name
24
+ end
25
+
26
+ test 'should create valid' do
27
+ valid_attrs = { :name => 'is_potato', :input_type => 'user', :options => ['true', 'false'] }
28
+ post :create, :template_input => valid_attrs, :template_id => @template.to_param
29
+ input = ActiveSupport::JSON.decode(@response.body)
30
+ assert input['name'] == 'is_potato'
31
+ assert_response :success
32
+ end
33
+
34
+ test 'should not create invalid' do
35
+ post :create, :template_id => @template.to_param
36
+ assert_response :unprocessable_entity
37
+ end
38
+
39
+ test 'should update valid' do
40
+ put :update, :template_id => @template.to_param,
41
+ :id => @input.to_param,
42
+ :template_input => { :name => "blah" }
43
+ assert_response :ok
44
+ end
45
+
46
+ test 'should not update invalid' do
47
+ put :update, :template_id => @template.to_param,
48
+ :id => @input.to_param,
49
+ :template_input => { :name => '' }
50
+ assert_response :unprocessable_entity
51
+ end
52
+
53
+ test 'should destroy' do
54
+ delete :destroy, :template_id => @template.to_param,
55
+ :id => @input.to_param
56
+ assert_response :ok
57
+ refute TemplateInput.exists?(@input.id)
58
+ end
59
+ end
60
+ end
61
+ end
@@ -14,10 +14,17 @@ module ForemanRemoteExecution
14
14
  invocation.save
15
15
  end
16
16
  end
17
+
18
+ let(:task) do
19
+ OpenStruct.new(:id => '123').tap do |o|
20
+ o.stubs(:add_missing_task_groups)
21
+ o.stubs(:task_groups).returns([])
22
+ end
23
+ end
17
24
  let(:action) do
18
25
  action = create_action(Actions::RemoteExecution::RunHostsJob)
19
26
  action.expects(:action_subject).with(job_invocation)
20
- ForemanTasks::Task::DynflowTask.stubs(:find_by_external_id!).returns(OpenStruct.new(:id => '123'))
27
+ ForemanTasks::Task::DynflowTask.stubs(:where).returns(mock.tap { |m| m.stubs(:first! => task) })
21
28
  plan_action(action, job_invocation)
22
29
  end
23
30
 
@@ -33,13 +40,13 @@ module ForemanRemoteExecution
33
40
 
34
41
  it 'triggers the RunHostJob actions on the resolved hosts in run phase' do
35
42
  template_invocation = job_invocation.template_invocation_for_host(host)
36
- action.expects(:trigger).with(Actions::RemoteExecution::RunHostJob, job_invocation, host, template_invocation, proxy, {})
43
+ action.expects(:trigger).with(Actions::RemoteExecution::RunHostJob, job_invocation, host, template_invocation, proxy)
37
44
  action.create_sub_plans
38
45
  end
39
46
 
40
47
  it 'uses the BindJobInvocation middleware' do
41
48
  action
42
- job_invocation.last_task_id.must_equal '123'
49
+ job_invocation.task_id.must_equal '123'
43
50
  end
44
51
  end
45
52
  end
@@ -9,13 +9,14 @@ describe ForemanRemoteExecution::HostExtensions do
9
9
 
10
10
  after { User.current = nil }
11
11
 
12
- context 'ssh user' do
12
+ describe 'ssh specific params' do
13
13
  let(:host) { FactoryGirl.build(:host, :with_execution) }
14
14
  let(:sshkey) { 'ssh-rsa AAAAB3NzaC1yc2EAAAABJQ foo@example.com' }
15
15
 
16
16
  before do
17
17
  SmartProxy.any_instance.stubs(:pubkey).returns(sshkey)
18
18
  Setting[:remote_execution_ssh_user] = 'root'
19
+ Setting[:remote_execution_effective_user_method] = 'sudo'
19
20
  end
20
21
 
21
22
  it 'has ssh user in the parameters' do
@@ -26,14 +27,17 @@ describe ForemanRemoteExecution::HostExtensions do
26
27
  host.host_parameters << FactoryGirl.build(:host_parameter, :name => 'remote_execution_ssh_user', :value => 'amy')
27
28
  host.params['remote_execution_ssh_user'].must_equal 'amy'
28
29
  end
29
- end
30
30
 
31
- context 'ssh keys' do
32
- let(:host) { FactoryGirl.build(:host, :with_execution) }
33
- let(:sshkey) { 'ssh-rsa AAAAB3NzaC1yc2EAAAABJQ foo@example.com' }
31
+ it 'has effective user method in the parameters' do
32
+ host.params['remote_execution_effective_user_method'].must_equal Setting[:remote_execution_effective_user_method]
33
+ end
34
+
35
+ it 'can override effective user method' do
36
+ host.host_parameters << FactoryGirl.build(:host_parameter, :name => 'remote_execution_effective_user_method', :value => 'su')
37
+ host.params['remote_execution_effective_user_method'].must_equal 'su'
38
+ end
34
39
 
35
40
  it 'has ssh keys in the parameters' do
36
- SmartProxy.any_instance.stubs(:pubkey).returns(sshkey)
37
41
  host.remote_execution_ssh_keys.must_include sshkey
38
42
  end
39
43
  end