hammer_cli_foreman_remote_execution 0.0.4 → 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.
- checksums.yaml +5 -5
- data/.gitignore +4 -0
- data/.travis.yml +5 -3
- data/.tx/config +8 -0
- data/Gemfile +8 -3
- data/README.md +53 -14
- data/Rakefile +19 -8
- data/hammer_cli_foreman_remote_execution.gemspec +3 -3
- data/lib/hammer_cli_foreman_remote_execution.rb +1 -0
- data/lib/hammer_cli_foreman_remote_execution/foreign_input_set.rb +4 -4
- data/lib/hammer_cli_foreman_remote_execution/i18n.rb +13 -1
- data/lib/hammer_cli_foreman_remote_execution/job_invocation.rb +65 -7
- data/lib/hammer_cli_foreman_remote_execution/job_template.rb +31 -1
- data/lib/hammer_cli_foreman_remote_execution/remote_execution_feature.rb +41 -0
- data/lib/hammer_cli_foreman_remote_execution/template_input.rb +12 -4
- data/lib/hammer_cli_foreman_remote_execution/version.rb +1 -1
- data/locale/Makefile +57 -0
- data/locale/README.md +18 -0
- data/locale/de/hammer-cli-foreman-remote-execution.po +93 -0
- data/locale/en/hammer-cli-foreman-remote-execution.po +209 -0
- data/locale/es/hammer-cli-foreman-remote-execution.po +93 -0
- data/locale/fr/hammer-cli-foreman-remote-execution.po +93 -0
- data/locale/hammer-cli-foreman-remote-execution.pot +358 -0
- data/locale/it/hammer-cli-foreman-remote-execution.po +93 -0
- data/locale/ja/hammer-cli-foreman-remote-execution.po +93 -0
- data/locale/ko/hammer-cli-foreman-remote-execution.po +93 -0
- data/locale/pt_BR/hammer-cli-foreman-remote-execution.po +94 -0
- data/locale/ru/hammer-cli-foreman-remote-execution.po +95 -0
- data/locale/zh_CN/hammer-cli-foreman-remote-execution.po +94 -0
- data/locale/zh_TW/hammer-cli-foreman-remote-execution.po +94 -0
- data/test/data/1.14/foreman_api.json +1 -0
- data/test/data/1.16/foreman_api.json +1 -0
- data/test/data/1.17/foreman_api.json +1 -0
- data/test/data/export.erb +9 -0
- data/test/{unit/data → data}/template.txt +0 -0
- data/test/unit/foreign_input_set_test.rb +3 -3
- data/test/unit/job_invocation_test.rb +41 -5
- data/test/unit/job_template_test.rb +31 -4
- data/test/unit/remote_execution_feature_test.rb +44 -0
- data/test/unit/template_input_test.rb +11 -3
- metadata +35 -12
- data/test/unit/data/1.10/foreman_api.json +0 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 82a8e161e362047b1b57912566bba871c744abf23f65b23f5425865138f281a2
|
4
|
+
data.tar.gz: 3a26ec61f5fda760497bbc0bb8d9744ffa1d99bb5717f3d15a82b9750e37d949
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f3ee7406b730f5036b5b283e35d2353f7341a007b28e10da883f5dc2fe9ab9ad801ac162765e6646b664a8cf61bd7da355eae1d10e76ca940909f9ab87a3c8ac
|
7
|
+
data.tar.gz: 12bad04f757471161f6ac7e4e8cb3b5e25c4971957af6e37e9cc4fa8d7755f9257aa5c3940586696db72afe686c49ff2dcda02af30f9df2f946178ad3f12a61d
|
data/.gitignore
CHANGED
data/.travis.yml
CHANGED
data/.tx/config
ADDED
data/Gemfile
CHANGED
@@ -3,11 +3,14 @@ source 'https://rubygems.org'
|
|
3
3
|
gemspec
|
4
4
|
|
5
5
|
gem 'gettext', '>= 3.1.3', '< 4.0.0'
|
6
|
+
if RUBY_VERSION < '2.1.0'
|
7
|
+
gem 'fast_gettext', '< 1.2.0'
|
8
|
+
end
|
6
9
|
|
7
10
|
group :test do
|
8
11
|
gem 'rake', '~> 10.1.0'
|
9
12
|
gem 'thor'
|
10
|
-
gem 'minitest', '<
|
13
|
+
gem 'minitest', '< 4.7.4'
|
11
14
|
gem 'minitest-spec-context'
|
12
15
|
gem 'simplecov'
|
13
16
|
gem 'mocha'
|
@@ -15,5 +18,7 @@ group :test do
|
|
15
18
|
end
|
16
19
|
|
17
20
|
# load local gemfile
|
18
|
-
|
19
|
-
|
21
|
+
['Gemfile.local.rb', 'Gemfile.local'].map do |file_name|
|
22
|
+
local_gemfile = File.join(File.dirname(__FILE__), file_name)
|
23
|
+
self.instance_eval(Bundler.read_file(local_gemfile)) if File.exist?(local_gemfile)
|
24
|
+
end
|
data/README.md
CHANGED
@@ -8,41 +8,60 @@ CLI Plugin for Foreman Remote Execution
|
|
8
8
|
|
9
9
|
This [Hammer CLI](https://github.com/theforeman/hammer-cli) plugin contains commands for [foreman_remote_execution](https://github.com/theforeman/foreman_remote_execution).
|
10
10
|
|
11
|
-
Examples
|
12
|
-
--------
|
11
|
+
# Examples
|
13
12
|
|
14
|
-
|
13
|
+
## Templates
|
14
|
+
|
15
|
+
### List templates
|
16
|
+
|
17
|
+
```
|
18
|
+
hammer job-template list
|
19
|
+
```
|
20
|
+
|
21
|
+
### Create a template
|
15
22
|
|
16
23
|
```
|
17
24
|
hammer job-template create --file /tmp/template.txt --name "Ping a Host"\
|
18
|
-
--provider-type
|
25
|
+
--provider-type SSH --job-category "Commands"
|
19
26
|
```
|
20
27
|
|
21
|
-
### Create a
|
28
|
+
### Create a template input
|
22
29
|
|
23
30
|
```
|
24
31
|
hammer template-input create --template-id 17 --name hostname\
|
25
32
|
--input-type user --options www.google.com,www.facebook.com,localhost
|
26
33
|
```
|
27
34
|
|
28
|
-
|
35
|
+
## Jobs
|
36
|
+
|
37
|
+
### Show jobs
|
29
38
|
|
30
|
-
|
39
|
+
```
|
40
|
+
hammer job-invocation list
|
41
|
+
```
|
42
|
+
|
43
|
+
Show details:
|
31
44
|
|
32
45
|
```
|
33
|
-
hammer job-invocation
|
34
|
-
--search-query "name ~ rex01"
|
46
|
+
hammer job-invocation info --id 83
|
35
47
|
```
|
36
48
|
|
49
|
+
### Run a job with command line inputs
|
50
|
+
|
51
|
+
```
|
52
|
+
hammer job-invocation create --job-template "Run Command - SSH Default" \
|
53
|
+
--inputs command="ping -c 50 www.google.com" --search-query "name ~ rex01"
|
37
54
|
```
|
38
|
-
|
55
|
+
|
56
|
+
```
|
57
|
+
hammer job-invocation create --job-template "Package Action - SSH Default" \
|
39
58
|
--inputs package=vim-enhanced,action=install --search-query "name ~ rex01"
|
40
59
|
```
|
41
60
|
|
42
|
-
|
61
|
+
### Run a job with file inputs
|
43
62
|
|
44
63
|
```
|
45
|
-
hammer job-invocation create --job-
|
64
|
+
hammer job-invocation create --job-template "Run Command - SSH Default"\
|
46
65
|
--input-files command=/tmp/script.sh --search-query "name ~ rex01"
|
47
66
|
```
|
48
67
|
|
@@ -60,7 +79,27 @@ Alternatively, pass the `--async` option to see the output so far:
|
|
60
79
|
hammer job-invocation output --id 155 --host rex01.example.com --async
|
61
80
|
```
|
62
81
|
|
63
|
-
|
64
|
-
|
82
|
+
## Developer Information
|
83
|
+
|
84
|
+
### Updating API docs
|
85
|
+
|
86
|
+
In `test/data/[foreman_version]/foreman_api.json`, we include the Apipie
|
87
|
+
documentation, with generated examples from the tests.
|
88
|
+
|
89
|
+
When adding new features to the hammer, you'll need to update this.
|
90
|
+
|
91
|
+
1. From foreman directory, run remote execution tests with examples enabled:
|
92
|
+
|
93
|
+
APIPIE_RECORD=examples rake test:foreman_remote_execution
|
94
|
+
|
95
|
+
2. From foreman directory, generate the apipie cache for English:
|
96
|
+
|
97
|
+
FOREMAN_APIPIE_LANGS=en rake apipie:cache
|
98
|
+
|
99
|
+
3. Copy the docs to hammer_cli_foreman_remote_execution
|
100
|
+
|
101
|
+
cp public/apipie-cache/apidoc/v2.en.json ~/hammer_cli_foreman_remote_execution/test/data/1.10/foreman_api.json
|
102
|
+
|
103
|
+
## License
|
65
104
|
|
66
105
|
This project is licensed under the GPLv3+.
|
data/Rakefile
CHANGED
@@ -9,17 +9,28 @@ Rake::TestTask.new :test do |t|
|
|
9
9
|
end
|
10
10
|
|
11
11
|
namespace :gettext do
|
12
|
-
|
13
|
-
task :
|
14
|
-
require
|
15
|
-
require
|
16
|
-
require 'gettext/tools'
|
12
|
+
|
13
|
+
task :setup do
|
14
|
+
require "hammer_cli_foreman_remote_execution/version"
|
15
|
+
require "hammer_cli_foreman_remote_execution/i18n"
|
16
|
+
require 'gettext/tools/task'
|
17
17
|
|
18
18
|
domain = HammerCLIForemanRemoteExecution::I18n::LocaleDomain.new
|
19
|
-
GetText.
|
20
|
-
|
21
|
-
|
19
|
+
GetText::Tools::Task.define do |task|
|
20
|
+
task.package_name = domain.domain_name
|
21
|
+
task.package_version = HammerCLIForemanRemoteExecution.version.to_s
|
22
|
+
task.domain = domain.domain_name
|
23
|
+
task.mo_base_directory = domain.locale_dir
|
24
|
+
task.po_base_directory = domain.locale_dir
|
25
|
+
task.files = domain.translated_files
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
desc "Update pot file"
|
30
|
+
task :find => [:setup] do
|
31
|
+
Rake::Task["gettext:po:update"].invoke
|
22
32
|
end
|
33
|
+
|
23
34
|
end
|
24
35
|
|
25
36
|
namespace :pkg do
|
@@ -6,8 +6,8 @@ Gem::Specification.new do |s|
|
|
6
6
|
s.platform = Gem::Platform::RUBY
|
7
7
|
s.authors = ['Foreman Remote Execution team']
|
8
8
|
s.email = ['foreman-dev@googlegroups.com']
|
9
|
-
s.homepage = '
|
10
|
-
s.license = 'GPL
|
9
|
+
s.homepage = 'https://github.com/theforeman/hammer_cli_foreman_remote_execution'
|
10
|
+
s.license = 'GPL-3.0-or-later'
|
11
11
|
|
12
12
|
s.summary = 'CLI for the Foreman remote execution plugin'
|
13
13
|
s.description = 'CLI for the Foreman remote execution plugin'
|
@@ -16,6 +16,6 @@ Gem::Specification.new do |s|
|
|
16
16
|
s.test_files = `git ls-files test`.split("\n")
|
17
17
|
s.extra_rdoc_files = `git ls-files doc`.split("\n") + Dir['README*', 'LICENSE']
|
18
18
|
|
19
|
-
s.add_dependency 'hammer_cli_foreman', '>= 0.1.3', '<
|
19
|
+
s.add_dependency 'hammer_cli_foreman', '>= 0.1.3', '< 3.0.0'
|
20
20
|
s.add_dependency 'hammer_cli_foreman_tasks', '~> 0.0.3'
|
21
21
|
end
|
@@ -8,6 +8,7 @@ module HammerCLIForemanRemoteExecution
|
|
8
8
|
require 'hammer_cli_foreman_remote_execution/job_template'
|
9
9
|
require 'hammer_cli_foreman_remote_execution/template_input'
|
10
10
|
require 'hammer_cli_foreman_remote_execution/foreign_input_set'
|
11
|
+
require 'hammer_cli_foreman_remote_execution/remote_execution_feature'
|
11
12
|
|
12
13
|
def self.exception_handler_class
|
13
14
|
HammerCLIForeman::ExceptionHandler
|
@@ -5,8 +5,8 @@ module HammerCLIForemanRemoteExecution
|
|
5
5
|
|
6
6
|
class ListCommand < HammerCLIForeman::ListCommand
|
7
7
|
output do
|
8
|
-
field :id, _('
|
9
|
-
field :target_template_id, _('Target template
|
8
|
+
field :id, _('ID')
|
9
|
+
field :target_template_id, _('Target template ID')
|
10
10
|
field :target_template_name, _('Target template name')
|
11
11
|
end
|
12
12
|
|
@@ -15,9 +15,9 @@ module HammerCLIForemanRemoteExecution
|
|
15
15
|
|
16
16
|
class InfoCommand < HammerCLIForeman::InfoCommand
|
17
17
|
output do
|
18
|
-
field :id, _('
|
18
|
+
field :id, _('ID')
|
19
19
|
field :name, _('Name')
|
20
|
-
field :target_template_id, _('Target template
|
20
|
+
field :target_template_id, _('Target template ID')
|
21
21
|
field :target_template_name, _('Target template name')
|
22
22
|
field :include_all, _('Include all')
|
23
23
|
field :include, _('Include')
|
@@ -2,7 +2,9 @@ require 'hammer_cli/i18n'
|
|
2
2
|
|
3
3
|
module HammerCLIForemanRemoteExecution
|
4
4
|
module I18n
|
5
|
+
|
5
6
|
class LocaleDomain < HammerCLI::I18n::LocaleDomain
|
7
|
+
|
6
8
|
def translated_files
|
7
9
|
Dir.glob(File.join(File.dirname(__FILE__), '../**/*.rb'))
|
8
10
|
end
|
@@ -15,7 +17,17 @@ module HammerCLIForemanRemoteExecution
|
|
15
17
|
'hammer-cli-foreman-remote-execution'
|
16
18
|
end
|
17
19
|
end
|
20
|
+
|
21
|
+
class SystemLocaleDomain < LocaleDomain
|
22
|
+
|
23
|
+
def locale_dir
|
24
|
+
'/usr/share/locale'
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
|
18
29
|
end
|
19
30
|
end
|
20
31
|
|
21
|
-
|
32
|
+
domain = [HammerCLIForemanRemoteExecution::I18n::LocaleDomain.new, HammerCLIForemanRemoteExecution::I18n::SystemLocaleDomain.new].find { |d| d.available? }
|
33
|
+
HammerCLI::I18n.add_domain(domain) if domain
|
@@ -2,9 +2,15 @@ module HammerCLIForemanRemoteExecution
|
|
2
2
|
class JobInvocation < HammerCLIForeman::Command
|
3
3
|
resource :job_invocations
|
4
4
|
|
5
|
+
module WithoutNameOption
|
6
|
+
def create_option_builder
|
7
|
+
HammerCLI::Apipie::OptionBuilder.new(resource, resource.action(action), :require_options => false)
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
5
11
|
class ListCommand < HammerCLIForeman::ListCommand
|
6
12
|
output do
|
7
|
-
field :id, _('
|
13
|
+
field :id, _('ID')
|
8
14
|
field :description, _('Description')
|
9
15
|
field :status_label, _('Status')
|
10
16
|
field :succeeded, _('Success')
|
@@ -12,6 +18,7 @@ module HammerCLIForemanRemoteExecution
|
|
12
18
|
field :pending, _('Pending')
|
13
19
|
field :total, _('Total')
|
14
20
|
field :start_at, _('Start')
|
21
|
+
field :randomized_ordering, _('Randomized ordering')
|
15
22
|
end
|
16
23
|
|
17
24
|
def extend_data(invocation)
|
@@ -22,6 +29,7 @@ module HammerCLIForemanRemoteExecution
|
|
22
29
|
end
|
23
30
|
|
24
31
|
class InfoCommand < HammerCLIForeman::InfoCommand
|
32
|
+
extend WithoutNameOption
|
25
33
|
output ListCommand.output_definition do
|
26
34
|
field :job_category, _('Job Category')
|
27
35
|
field :mode, _('Mode')
|
@@ -54,17 +62,39 @@ module HammerCLIForemanRemoteExecution
|
|
54
62
|
puts line['output']
|
55
63
|
since = line['timestamp']
|
56
64
|
end
|
65
|
+
since
|
66
|
+
end
|
57
67
|
|
58
|
-
|
59
|
-
|
60
|
-
|
68
|
+
def execute
|
69
|
+
data = get_output
|
70
|
+
if data['delayed']
|
71
|
+
puts _('The job is scheduled to start at %{timestamp}') % { :timestamp => data['start_at'] }
|
72
|
+
return HammerCLI::EX_OK if option_async?
|
61
73
|
end
|
74
|
+
since = print_data(data)
|
75
|
+
|
76
|
+
output_loop(data, since)
|
77
|
+
return HammerCLI::EX_OK
|
62
78
|
end
|
63
79
|
|
64
80
|
build_options do |o|
|
65
81
|
o.expand(:all).except(:job_invocations)
|
66
82
|
o.without(:since)
|
67
83
|
end
|
84
|
+
|
85
|
+
private
|
86
|
+
|
87
|
+
def output_loop(data, since = nil)
|
88
|
+
while data['refresh'] && !option_async? do
|
89
|
+
sleep 1
|
90
|
+
data = get_output(since)
|
91
|
+
since = print_data(data)
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
def get_output(since = nil)
|
96
|
+
resource.call(action, request_params.merge(:since => since), request_headers, request_options)
|
97
|
+
end
|
68
98
|
end
|
69
99
|
|
70
100
|
class CreateCommand < HammerCLIForeman::CreateCommand
|
@@ -112,9 +142,11 @@ module HammerCLIForemanRemoteExecution
|
|
112
142
|
super(task)
|
113
143
|
end
|
114
144
|
|
145
|
+
alias original_option_async? option_async?
|
146
|
+
|
115
147
|
def option_async?
|
116
148
|
if immediate?
|
117
|
-
|
149
|
+
original_option_async?
|
118
150
|
else
|
119
151
|
true
|
120
152
|
end
|
@@ -129,9 +161,35 @@ module HammerCLIForemanRemoteExecution
|
|
129
161
|
end
|
130
162
|
end
|
131
163
|
|
164
|
+
class CancelCommand < HammerCLIForeman::Command
|
165
|
+
extend WithoutNameOption
|
166
|
+
|
167
|
+
action :cancel
|
168
|
+
command_name 'cancel'
|
169
|
+
desc _('Cancel the job')
|
170
|
+
success_message _('Job invocation %{id} cancelled')
|
171
|
+
failure_message _('Could not cancel the job invocation')
|
172
|
+
|
173
|
+
build_options { |o| o.expand(:none) }
|
174
|
+
end
|
175
|
+
|
176
|
+
class RerunCommand < HammerCLIForeman::CreateCommand
|
177
|
+
extend WithoutNameOption
|
178
|
+
|
179
|
+
action :rerun
|
180
|
+
command_name 'rerun'
|
181
|
+
desc _('Rerun the job')
|
182
|
+
success_message _('Job invocation was rerun as %{id}')
|
183
|
+
|
184
|
+
build_options { |o| o.expand(:none) }
|
185
|
+
end
|
186
|
+
|
132
187
|
def self.extend_data(invocation)
|
133
|
-
if invocation['targeting'] && invocation['targeting']['hosts']
|
134
|
-
invocation['
|
188
|
+
if (targeting = invocation['targeting']) && invocation['targeting']['hosts']
|
189
|
+
invocation['randomized_ordering'] = targeting['randomized_ordering']
|
190
|
+
if (hosts = targeting['hosts'])
|
191
|
+
invocation['hosts'] = "\n" + hosts.map { |host| " - #{host['name']}" }.join("\n")
|
192
|
+
end
|
135
193
|
end
|
136
194
|
|
137
195
|
if invocation['recurrence']
|
@@ -4,7 +4,7 @@ module HammerCLIForemanRemoteExecution
|
|
4
4
|
|
5
5
|
class ListCommand < HammerCLIForeman::ListCommand
|
6
6
|
output do
|
7
|
-
field :id, _('
|
7
|
+
field :id, _('ID')
|
8
8
|
field :name, _('Name')
|
9
9
|
field :job_category, _('Job Category')
|
10
10
|
field :provider_type, _('Provider')
|
@@ -20,6 +20,7 @@ module HammerCLIForemanRemoteExecution
|
|
20
20
|
|
21
21
|
class InfoCommand < HammerCLIForeman::InfoCommand
|
22
22
|
output ListCommand.output_definition do
|
23
|
+
field :description, _('Description'), Fields::Text
|
23
24
|
field :template_inputs, _('Inputs')
|
24
25
|
HammerCLIForeman::References.taxonomies(self)
|
25
26
|
end
|
@@ -55,6 +56,35 @@ module HammerCLIForemanRemoteExecution
|
|
55
56
|
end
|
56
57
|
end
|
57
58
|
|
59
|
+
class ImportCommand < HammerCLIForeman::CreateCommand
|
60
|
+
command_name 'import'
|
61
|
+
action :import
|
62
|
+
|
63
|
+
option '--file', 'TEMPLATE', N_('Path to a file that contains the template - must include ERB metadata'),
|
64
|
+
:attribute_name => :option_template, :required => true,
|
65
|
+
:format => HammerCLI::Options::Normalizers::File.new
|
66
|
+
|
67
|
+
success_message _('Job template imported')
|
68
|
+
failure_message _('Could not import the job template')
|
69
|
+
|
70
|
+
build_options do |o|
|
71
|
+
o.without(:template)
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
class ExportCommand < HammerCLIForeman::InfoCommand
|
76
|
+
command_name 'export'
|
77
|
+
action :export
|
78
|
+
|
79
|
+
desc _('Export a template including all metadata')
|
80
|
+
|
81
|
+
def print_data(template)
|
82
|
+
puts template
|
83
|
+
end
|
84
|
+
|
85
|
+
build_options
|
86
|
+
end
|
87
|
+
|
58
88
|
class UpdateCommand < HammerCLIForeman::UpdateCommand
|
59
89
|
option '--file', 'TEMPLATE', N_('Path to a file that contains the template'),
|
60
90
|
:attribute_name => :option_template,
|