foreman_remote_execution 0.3.2 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +11 -0
- data/app/controllers/api/v2/foreign_input_sets_controller.rb +1 -1
- data/app/helpers/concerns/foreman_remote_execution/hosts_helper_extensions.rb +1 -1
- data/app/helpers/remote_execution_helper.rb +4 -9
- data/app/models/job_invocation.rb +3 -0
- data/app/models/job_invocation_composer.rb +11 -2
- data/app/models/job_template.rb +2 -2
- data/app/models/job_template_effective_user.rb +2 -0
- data/app/models/setting/remote_execution.rb +4 -1
- data/app/views/job_templates/index.html.erb +1 -3
- data/app/views/template_invocations/show.html.erb +5 -5
- data/app/views/templates/README.md +6 -0
- data/app/views/templates/{package_action.erb → ssh/package_action.erb} +0 -0
- data/app/views/templates/{power_action.erb → ssh/power_action.erb} +0 -0
- data/app/views/templates/{puppet_run_once.erb → ssh/puppet_run_once.erb} +0 -0
- data/app/views/templates/{run_command.erb → ssh/run_command.erb} +0 -0
- data/app/views/templates/{service_action.erb → ssh/service_action.erb} +0 -0
- data/foreman_remote_execution.gemspec +1 -1
- data/lib/foreman_remote_execution/engine.rb +2 -2
- data/lib/foreman_remote_execution/version.rb +1 -1
- data/test/factories/foreman_remote_execution_factories.rb +10 -1
- data/test/unit/concerns/host_extensions_test.rb +4 -7
- data/test/unit/input_template_renderer_test.rb +3 -0
- data/test/unit/job_template_test.rb +11 -0
- data/test/unit/remote_execution_feature_test.rb +4 -0
- data/test/unit/remote_execution_provider_test.rb +5 -2
- metadata +8 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5b0446f3fb6c5f2d4640bbe0e15ddee61123fd03
|
4
|
+
data.tar.gz: 49de19a88a35ff89dd770be96886a75600634012
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 777c28e28ab17cc1e5db620faff516f3b350cb6ae4acb3361e7fecd99821919d1a2ad5ca3706c79e4df246a7f6c92a78e6a0500de52c8fcbb4ac02411e747dab
|
7
|
+
data.tar.gz: cde19bd5f565b9d823f7668ddb7dbb4458d3d31f1607bef4a685f580bcfd0f340c9fcaef1916b1c9543419f11d6aa794cb7027ee0fa1534f768aefc7fbf9e6b4
|
data/README.md
CHANGED
@@ -33,6 +33,17 @@ Check the Foreman manual [remote execution section](http://theforeman.org/plugin
|
|
33
33
|
|
34
34
|
Fork and send a Pull Request. Thanks!
|
35
35
|
|
36
|
+
## Release Process
|
37
|
+
|
38
|
+
### Pull Translations from Transifex
|
39
|
+
|
40
|
+
As part of the release process, localization must be synced from Transifex. See the [wiki](http://projects.theforeman.org/projects/foreman/wiki/How_to_Create_a_Plugin#Pulling-translations-from-Transifex) for more information.
|
41
|
+
|
42
|
+
### Sync Job Templates from Community Templates
|
43
|
+
|
44
|
+
The [community-templates](https://github.com/theforeman/community-templates.git) repo is the source for our job templates. Prior to release, use the script/sync_templates.sh script to pull in any changes.
|
45
|
+
|
46
|
+
|
36
47
|
## Copyright
|
37
48
|
|
38
49
|
Copyright (c) 2015 The Foreman developers
|
@@ -23,7 +23,7 @@ module Api
|
|
23
23
|
def_param_group :foreign_input_set do
|
24
24
|
param :foreign_input_set, Hash, :required => true, :action_aware => true do
|
25
25
|
param :target_template_id, :identifier, :required => true, :desc => N_('Target template ID')
|
26
|
-
param :include_all, :bool, :desc => N_('Include all inputs
|
26
|
+
param :include_all, :bool, :desc => N_('Include all inputs from the foreign template')
|
27
27
|
param :include, String, :desc => N_('A comma separated list of input names to be included from the foreign template.')
|
28
28
|
param :exclude, String, :desc => N_('A comma separated list of input names to be included from the foreign template.')
|
29
29
|
param :description, String, :required => false, :desc => N_('Input set description')
|
@@ -12,7 +12,7 @@ module ForemanRemoteExecution
|
|
12
12
|
end
|
13
13
|
|
14
14
|
def host_title_actions_with_run_button(*args)
|
15
|
-
title_actions(button_group(link_to(_('Run Job'), new_job_invocation_path(:host_ids => [args.first.id]), :id => :run_button)))
|
15
|
+
title_actions(button_group(link_to(_('Run Job'), new_job_invocation_path(:host_ids => [args.first.id]), :id => :run_button, :class => 'btn btn-default')))
|
16
16
|
host_title_actions_without_run_button(*args)
|
17
17
|
end
|
18
18
|
end
|
@@ -35,7 +35,7 @@ module RemoteExecutionHelper
|
|
35
35
|
when HostStatus::ExecutionStatus::QUEUED
|
36
36
|
_('queued')
|
37
37
|
when HostStatus::ExecutionStatus::RUNNING
|
38
|
-
_('running %{percent}
|
38
|
+
_('running %{percent}%%') % {:percent => invocation.progress}
|
39
39
|
when HostStatus::ExecutionStatus::OK
|
40
40
|
_('succeeded')
|
41
41
|
when HostStatus::ExecutionStatus::ERROR
|
@@ -96,7 +96,7 @@ module RemoteExecutionHelper
|
|
96
96
|
def job_invocations_buttons
|
97
97
|
[
|
98
98
|
documentation_button_rex('3.2ExecutingaJob'),
|
99
|
-
|
99
|
+
new_link(_('Run Job'))
|
100
100
|
]
|
101
101
|
end
|
102
102
|
|
@@ -206,13 +206,8 @@ module RemoteExecutionHelper
|
|
206
206
|
|
207
207
|
def documentation_button_rex(section = '')
|
208
208
|
url = 'http://theforeman.org/plugins/foreman_remote_execution/' +
|
209
|
-
"#{ForemanRemoteExecution::VERSION.split('.').take(2).join('.')}/index.html#"
|
210
|
-
|
211
|
-
link_to(
|
212
|
-
icon_text('help', _('Documentation'),
|
213
|
-
:class => 'icon-white', :kind => 'pficon'),
|
214
|
-
url,
|
215
|
-
:rel => 'external', :class => 'btn btn-info', :target => '_blank')
|
209
|
+
"#{ForemanRemoteExecution::VERSION.split('.').take(2).join('.')}/index.html#"
|
210
|
+
documentation_button section, :root_url => url
|
216
211
|
end
|
217
212
|
|
218
213
|
def template_input_header(f, template)
|
@@ -20,6 +20,9 @@ class JobInvocation < ActiveRecord::Base
|
|
20
20
|
scoped_search :on => :job_category, :complete_value => true
|
21
21
|
scoped_search :on => :description # FIXME No auto complete because of https://github.com/wvanbergen/scoped_search/issues/138
|
22
22
|
|
23
|
+
has_many :template_invocations_hosts, :through => :template_invocations, :source => :host
|
24
|
+
scoped_search :in => :template_invocations_hosts, :on => :name, :rename => 'host', :complete_value => true
|
25
|
+
|
23
26
|
delegate :bookmark, :resolved?, :to => :targeting, :allow_nil => true
|
24
27
|
|
25
28
|
include ForemanTasks::Concerns::ActionSubject
|
@@ -9,7 +9,7 @@ class JobInvocationComposer
|
|
9
9
|
def params
|
10
10
|
{ :job_category => job_invocation_base[:job_category],
|
11
11
|
:targeting => ui_params.fetch(:targeting, {}).merge(:user_id => User.current.id),
|
12
|
-
:triggering =>
|
12
|
+
:triggering => triggering,
|
13
13
|
:host_ids => ui_params[:host_ids],
|
14
14
|
:description_format => job_invocation_base[:description_format],
|
15
15
|
:concurrency_control => concurrency_control_params,
|
@@ -57,6 +57,14 @@ class JobInvocationComposer
|
|
57
57
|
:level => job_invocation_base[:concurrency_level]
|
58
58
|
}
|
59
59
|
end
|
60
|
+
|
61
|
+
def triggering
|
62
|
+
return {} unless ui_params.key?(:triggering)
|
63
|
+
trig = ui_params[:triggering]
|
64
|
+
keys = (1..5).map { |i| "end_time(#{i}i)" }
|
65
|
+
return trig unless trig.key?(:end_time) && trig[:end_time].keys == keys
|
66
|
+
trig.merge(:end_time => Time.local(*trig[:end_time].values_at(*keys)))
|
67
|
+
end
|
60
68
|
end
|
61
69
|
|
62
70
|
class ApiParams
|
@@ -304,7 +312,8 @@ class JobInvocationComposer
|
|
304
312
|
end
|
305
313
|
|
306
314
|
def valid?
|
307
|
-
targeting.valid? & job_invocation.valid? & !pattern_template_invocations.map(&:valid?).include?(false)
|
315
|
+
targeting.valid? & job_invocation.valid? & !pattern_template_invocations.map(&:valid?).include?(false) &
|
316
|
+
triggering.valid?
|
308
317
|
end
|
309
318
|
|
310
319
|
def save
|
data/app/models/job_template.rb
CHANGED
@@ -195,8 +195,8 @@ class JobTemplate < ::Template
|
|
195
195
|
end
|
196
196
|
|
197
197
|
def sync_feature(feature_name)
|
198
|
-
if feature_name && (feature = RemoteExecutionFeature.feature(feature_name))
|
199
|
-
|
198
|
+
if feature_name && (feature = RemoteExecutionFeature.feature(feature_name)) && feature.job_template.blank?
|
199
|
+
self.remote_execution_features << feature
|
200
200
|
end
|
201
201
|
end
|
202
202
|
|
@@ -22,7 +22,10 @@ class Setting::RemoteExecution < Setting
|
|
22
22
|
'root'),
|
23
23
|
self.set('remote_execution_effective_user_method',
|
24
24
|
N_('What command should be used to switch to the effective user. One of %s') % SSHExecutionProvider::EFFECTIVE_USER_METHODS.inspect,
|
25
|
-
'sudo'
|
25
|
+
'sudo',
|
26
|
+
'remote_execution_effective_user_method',
|
27
|
+
nil,
|
28
|
+
{ :collection => Proc.new {Hash[SSHExecutionProvider::EFFECTIVE_USER_METHODS.map{|method| [method, method]}]} }),
|
26
29
|
self.set('remote_execution_sync_templates',
|
27
30
|
N_('Whether we should sync templates from disk when running db:seed.'),
|
28
31
|
true)
|
@@ -1,4 +1,3 @@
|
|
1
|
-
<%= include_javascript if SETTINGS[:version].short == '1.9' %>
|
2
1
|
<%= javascript 'job_templates' %>
|
3
2
|
<%= javascript 'lookup_keys' %>
|
4
3
|
<%= javascript 'template_input' %>
|
@@ -6,8 +5,7 @@
|
|
6
5
|
<% title _("Job Templates") %>
|
7
6
|
<% title_actions(documentation_button_rex('3.1JobTemplates'),
|
8
7
|
link_to_function(_('Import'), 'show_import_job_template_modal();', :class => 'btn btn-default'),
|
9
|
-
|
10
|
-
hash_for_new_job_template_path)) %>
|
8
|
+
new_link(_("New Job Template"))) %>
|
11
9
|
|
12
10
|
<table class="table table-bordered table-striped table-two-pane table-fixed">
|
13
11
|
<thead>
|
@@ -4,11 +4,11 @@
|
|
4
4
|
|
5
5
|
<div id="title_action">
|
6
6
|
<div class="btn-toolbar pull-right">
|
7
|
-
<%= link_to(_('Back to Job'), job_invocation_path(@template_invocation.job_invocation)) %>
|
8
|
-
<%= button_group(link_to_function(_('Toggle command'), '$("div.preview").toggle()'),
|
9
|
-
link_to_function(_('Toggle STDERR'), '$("div.line.stderr").toggle()'),
|
10
|
-
link_to_function(_('Toggle STDOUT'), '$("div.line.stdout").toggle()'),
|
11
|
-
link_to_function(_('Toggle DEBUG'), '$("div.line.debug").toggle()')) %>
|
7
|
+
<%= link_to(_('Back to Job'), job_invocation_path(@template_invocation.job_invocation), :class => 'btn btn-default') %>
|
8
|
+
<%= button_group(link_to_function(_('Toggle command'), '$("div.preview").toggle()', :class => 'btn btn-default'),
|
9
|
+
link_to_function(_('Toggle STDERR'), '$("div.line.stderr").toggle()', :class => 'btn btn-default'),
|
10
|
+
link_to_function(_('Toggle STDOUT'), '$("div.line.stdout").toggle()', :class => 'btn btn-default'),
|
11
|
+
link_to_function(_('Toggle DEBUG'), '$("div.line.debug").toggle()', :class => 'btn btn-default')) %>
|
12
12
|
<%= button_group(template_invocation_task_buttons(@template_invocation_task)) %>
|
13
13
|
</div>
|
14
14
|
</div>
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
@@ -14,7 +14,7 @@ Gem::Specification.new do |s|
|
|
14
14
|
s.description = 'A plugin bringing remote execution to the Foreman, completing the config ' +
|
15
15
|
'management functionality with remote management functionality.'
|
16
16
|
|
17
|
-
s.files = `git ls-files`.split("\n")
|
17
|
+
s.files = `git ls-files`.split("\n").reject { |f| f =~ /^scripts/ }
|
18
18
|
s.test_files = `git ls-files test`.split("\n")
|
19
19
|
s.extra_rdoc_files = `git ls-files doc`.split("\n") + Dir['README*', 'LICENSE']
|
20
20
|
|
@@ -27,9 +27,9 @@ module ForemanRemoteExecution
|
|
27
27
|
ForemanTasks.dynflow.config.eager_load_paths << File.join(ForemanRemoteExecution::Engine.root, 'app/lib/actions')
|
28
28
|
end
|
29
29
|
|
30
|
-
initializer 'foreman_remote_execution.register_plugin',
|
30
|
+
initializer 'foreman_remote_execution.register_plugin', before: :finisher_hook do |_app|
|
31
31
|
Foreman::Plugin.register :foreman_remote_execution do
|
32
|
-
requires_foreman '>= 1.
|
32
|
+
requires_foreman '>= 1.12'
|
33
33
|
|
34
34
|
apipie_documented_controllers ["#{ForemanRemoteExecution::Engine.root}/app/controllers/api/v2/*.rb"]
|
35
35
|
|
@@ -15,6 +15,10 @@ FactoryGirl.define do
|
|
15
15
|
trait :with_description_format do
|
16
16
|
description_format 'Factory-built %{job_category}'
|
17
17
|
end
|
18
|
+
|
19
|
+
trait :with_feature do
|
20
|
+
remote_execution_feature
|
21
|
+
end
|
18
22
|
end
|
19
23
|
|
20
24
|
factory :template_input do |f|
|
@@ -54,6 +58,11 @@ FactoryGirl.define do
|
|
54
58
|
factory :template_invocation_input_value do |f|
|
55
59
|
f.sequence(:value) { |n| "Input Value #{n}" }
|
56
60
|
end
|
61
|
+
|
62
|
+
factory :remote_execution_feature do |f|
|
63
|
+
f.sequence(:label) { |n| "remote_execution_feature_#{n}" }
|
64
|
+
f.sequence(:name) { |n| "Remote Execution Feature #{n}" }
|
65
|
+
end
|
57
66
|
end
|
58
67
|
|
59
68
|
FactoryGirl.modify do
|
@@ -89,7 +98,7 @@ FactoryGirl.modify do
|
|
89
98
|
overrides[:organizations] = [organization] unless organization.nil?
|
90
99
|
|
91
100
|
FactoryGirl.create(
|
92
|
-
:
|
101
|
+
:subnet_ipv4,
|
93
102
|
overrides
|
94
103
|
)
|
95
104
|
end
|
@@ -3,14 +3,11 @@ require 'test_plugin_helper'
|
|
3
3
|
describe ForemanRemoteExecution::HostExtensions do
|
4
4
|
let(:provider) { 'SSH' }
|
5
5
|
|
6
|
-
before
|
7
|
-
User.current = FactoryGirl.build(:user, :admin)
|
8
|
-
end
|
9
|
-
|
6
|
+
before { User.current = FactoryGirl.build(:user, :admin) }
|
10
7
|
after { User.current = nil }
|
11
8
|
|
12
9
|
describe 'ssh specific params' do
|
13
|
-
let(:host) { FactoryGirl.
|
10
|
+
let(:host) { FactoryGirl.create(:host, :with_execution) }
|
14
11
|
let(:sshkey) { 'ssh-rsa AAAAB3NzaC1yc2EAAAABJQ foo@example.com' }
|
15
12
|
|
16
13
|
before do
|
@@ -24,7 +21,7 @@ describe ForemanRemoteExecution::HostExtensions do
|
|
24
21
|
end
|
25
22
|
|
26
23
|
it 'can override ssh user' do
|
27
|
-
host.host_parameters << FactoryGirl.
|
24
|
+
host.host_parameters << FactoryGirl.create(:host_parameter, :host => host, :name => 'remote_execution_ssh_user', :value => 'amy')
|
28
25
|
host.params['remote_execution_ssh_user'].must_equal 'amy'
|
29
26
|
end
|
30
27
|
|
@@ -33,7 +30,7 @@ describe ForemanRemoteExecution::HostExtensions do
|
|
33
30
|
end
|
34
31
|
|
35
32
|
it 'can override effective user method' do
|
36
|
-
host.host_parameters << FactoryGirl.
|
33
|
+
host.host_parameters << FactoryGirl.create(:host_parameter, :host => host, :name => 'remote_execution_effective_user_method', :value => 'su')
|
37
34
|
host.params['remote_execution_effective_user_method'].must_equal 'su'
|
38
35
|
end
|
39
36
|
|
@@ -412,6 +412,9 @@ TEMPLATE
|
|
412
412
|
end
|
413
413
|
|
414
414
|
context 'with host specified' do
|
415
|
+
before { User.current = FactoryGirl.build(:user, :admin) }
|
416
|
+
after { User.current = nil }
|
417
|
+
|
415
418
|
let(:environment) { FactoryGirl.create(:environment) }
|
416
419
|
before { renderer.host = FactoryGirl.create(:host, :environment => environment) }
|
417
420
|
|
@@ -73,6 +73,10 @@ describe JobTemplate do
|
|
73
73
|
end
|
74
74
|
|
75
75
|
context 'importing a new template' do
|
76
|
+
let(:remote_execution_feature) do
|
77
|
+
FactoryGirl.create(:remote_execution_feature)
|
78
|
+
end
|
79
|
+
|
76
80
|
let(:template) do
|
77
81
|
template = <<-END_TEMPLATE
|
78
82
|
<%#
|
@@ -80,6 +84,7 @@ describe JobTemplate do
|
|
80
84
|
name: Service Restart
|
81
85
|
job_category: Service Restart
|
82
86
|
provider_type: SSH
|
87
|
+
feature: #{remote_execution_feature.label}
|
83
88
|
template_inputs:
|
84
89
|
- name: service_name
|
85
90
|
input_type: user
|
@@ -129,6 +134,12 @@ describe JobTemplate do
|
|
129
134
|
template_with_input_sets.template_inputs_with_foreign.map(&:name).must_equal ['service_name']
|
130
135
|
end
|
131
136
|
|
137
|
+
it 'imports feature' do
|
138
|
+
template # let is lazy
|
139
|
+
remote_execution_feature.reload
|
140
|
+
remote_execution_feature.job_template.must_equal template
|
141
|
+
end
|
142
|
+
|
132
143
|
it 'sets additional options' do
|
133
144
|
template.default.must_equal true
|
134
145
|
end
|
@@ -1,6 +1,10 @@
|
|
1
1
|
require 'test_plugin_helper'
|
2
2
|
|
3
3
|
describe RemoteExecutionFeature do
|
4
|
+
should validate_presence_of(:name)
|
5
|
+
should validate_presence_of(:label)
|
6
|
+
should validate_uniqueness_of(:name)
|
7
|
+
should validate_uniqueness_of(:label)
|
4
8
|
|
5
9
|
let(:install_feature) do
|
6
10
|
RemoteExecutionFeature.register(:katello_install_package, N_('Katello: Install package'),
|
@@ -50,6 +50,9 @@ describe RemoteExecutionProvider do
|
|
50
50
|
end
|
51
51
|
|
52
52
|
describe SSHExecutionProvider do
|
53
|
+
before { User.current = FactoryGirl.build(:user, :admin) }
|
54
|
+
after { User.current = nil }
|
55
|
+
|
53
56
|
before do
|
54
57
|
Setting::RemoteExecution.load_defaults
|
55
58
|
end
|
@@ -69,7 +72,7 @@ describe RemoteExecutionProvider do
|
|
69
72
|
describe 'ssh user' do
|
70
73
|
it 'uses the remote_execution_ssh_user on the host param' do
|
71
74
|
host.params['remote_execution_ssh_user'] = 'my user'
|
72
|
-
host.host_parameters << FactoryGirl.
|
75
|
+
host.host_parameters << FactoryGirl.create(:host_parameter, :host => host, :name => 'remote_execution_ssh_user', :value => 'my user')
|
73
76
|
proxy_options[:ssh_user].must_equal 'my user'
|
74
77
|
end
|
75
78
|
end
|
@@ -77,7 +80,7 @@ describe RemoteExecutionProvider do
|
|
77
80
|
describe 'sudo' do
|
78
81
|
it 'uses the remote_execution_ssh_user on the host param' do
|
79
82
|
host.params['remote_execution_effective_user_method'] = 'sudo'
|
80
|
-
method_param = FactoryGirl.
|
83
|
+
method_param = FactoryGirl.create(:host_parameter, :host => host, :name => 'remote_execution_effective_user_method', :value => 'sudo')
|
81
84
|
host.host_parameters << method_param
|
82
85
|
proxy_options[:effective_user_method].must_equal 'sudo'
|
83
86
|
method_param.update_attributes!(:value => 'su')
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: foreman_remote_execution
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Foreman Remote Execution team
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-07-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: deface
|
@@ -254,11 +254,12 @@ files:
|
|
254
254
|
- app/views/template_invocations/_refresh.js.erb
|
255
255
|
- app/views/template_invocations/show.html.erb
|
256
256
|
- app/views/template_invocations/show.js.erb
|
257
|
-
- app/views/templates/
|
258
|
-
- app/views/templates/
|
259
|
-
- app/views/templates/
|
260
|
-
- app/views/templates/
|
261
|
-
- app/views/templates/
|
257
|
+
- app/views/templates/README.md
|
258
|
+
- app/views/templates/ssh/package_action.erb
|
259
|
+
- app/views/templates/ssh/power_action.erb
|
260
|
+
- app/views/templates/ssh/puppet_run_once.erb
|
261
|
+
- app/views/templates/ssh/run_command.erb
|
262
|
+
- app/views/templates/ssh/service_action.erb
|
262
263
|
- config/routes.rb
|
263
264
|
- db/migrate/20150612121541_add_job_template_to_template.rb
|
264
265
|
- db/migrate/20150616080015_create_template_input.rb
|