foreman_remote_execution 3.1.0 → 3.3.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 (94) hide show
  1. checksums.yaml +4 -4
  2. data/.eslintrc +5 -30
  3. data/.github/workflows/ci.yml +100 -0
  4. data/.gitignore +1 -0
  5. data/.rubocop_todo.yml +3 -0
  6. data/Gemfile +1 -0
  7. data/app/controllers/api/v2/job_invocations_controller.rb +22 -1
  8. data/app/controllers/api/v2/template_invocations_controller.rb +4 -1
  9. data/app/helpers/job_invocations_chart_helper.rb +2 -0
  10. data/app/helpers/job_invocations_helper.rb +6 -1
  11. data/app/helpers/remote_execution_helper.rb +39 -30
  12. data/app/lib/actions/remote_execution/run_host_job.rb +3 -2
  13. data/app/lib/proxy_api/remote_execution_ssh.rb +6 -0
  14. data/app/models/concerns/foreman_remote_execution/host_extensions.rb +1 -1
  15. data/app/models/concerns/foreman_remote_execution/orchestration/ssh.rb +63 -0
  16. data/app/models/concerns/foreman_remote_execution/smart_proxy_extensions.rb +4 -0
  17. data/app/models/host_status/execution_status.rb +9 -1
  18. data/app/models/remote_execution_provider.rb +5 -0
  19. data/app/services/default_proxy_proxy_selector.rb +18 -0
  20. data/app/views/api/v2/job_invocations/main.json.rabl +8 -2
  21. data/app/views/job_invocations/_card_results.html.erb +1 -0
  22. data/app/views/job_invocations/_card_user_input.html.erb +1 -1
  23. data/app/views/job_invocations/_tab_hosts.html.erb +3 -23
  24. data/app/views/job_invocations/_tab_overview.html.erb +1 -1
  25. data/app/views/job_invocations/_user_input.html.erb +1 -1
  26. data/app/views/job_invocations/show.html.erb +1 -7
  27. data/app/views/job_invocations/show.json.erb +4 -0
  28. data/config/routes.rb +2 -1
  29. data/db/seeds.d/70-job_templates.rb +1 -1
  30. data/foreman_remote_execution.gemspec +5 -6
  31. data/lib/foreman_remote_execution/engine.rb +2 -0
  32. data/lib/foreman_remote_execution/version.rb +1 -1
  33. data/locale/action_names.rb +3 -3
  34. data/locale/de/LC_MESSAGES/foreman_remote_execution.mo +0 -0
  35. data/locale/de/foreman_remote_execution.po +65 -16
  36. data/locale/en/foreman_remote_execution.po +63 -15
  37. data/locale/en_GB/LC_MESSAGES/foreman_remote_execution.mo +0 -0
  38. data/locale/en_GB/foreman_remote_execution.po +64 -15
  39. data/locale/es/LC_MESSAGES/foreman_remote_execution.mo +0 -0
  40. data/locale/es/foreman_remote_execution.po +66 -17
  41. data/locale/foreman_remote_execution.pot +193 -148
  42. data/locale/fr/LC_MESSAGES/foreman_remote_execution.mo +0 -0
  43. data/locale/fr/foreman_remote_execution.po +66 -17
  44. data/locale/ja/LC_MESSAGES/foreman_remote_execution.mo +0 -0
  45. data/locale/ja/foreman_remote_execution.po +66 -17
  46. data/locale/ko/LC_MESSAGES/foreman_remote_execution.mo +0 -0
  47. data/locale/ko/foreman_remote_execution.po +65 -15
  48. data/locale/pt_BR/LC_MESSAGES/foreman_remote_execution.mo +0 -0
  49. data/locale/pt_BR/foreman_remote_execution.po +66 -17
  50. data/locale/ru/LC_MESSAGES/foreman_remote_execution.mo +0 -0
  51. data/locale/ru/foreman_remote_execution.po +65 -18
  52. data/locale/zh_CN/LC_MESSAGES/foreman_remote_execution.mo +0 -0
  53. data/locale/zh_CN/foreman_remote_execution.po +66 -17
  54. data/locale/zh_TW/LC_MESSAGES/foreman_remote_execution.mo +0 -0
  55. data/locale/zh_TW/foreman_remote_execution.po +65 -16
  56. data/package.json +16 -33
  57. data/test/functional/api/v2/job_invocations_controller_test.rb +42 -14
  58. data/test/functional/job_invocations_controller_test.rb +12 -0
  59. data/test/models/orchestration/ssh_test.rb +56 -0
  60. data/test/unit/concerns/host_extensions_test.rb +7 -0
  61. data/test/unit/remote_execution_provider_test.rb +4 -1
  62. data/webpack/__mocks__/foremanReact/common/I18n.js +1 -0
  63. data/webpack/__mocks__/foremanReact/components/common/ActionButtons/ActionButtons.js +3 -0
  64. data/webpack/__mocks__/foremanReact/constants.js +3 -0
  65. data/webpack/index.js +9 -22
  66. data/webpack/react_app/components/TargetingHosts/TargetingHosts.js +52 -0
  67. data/webpack/react_app/components/TargetingHosts/TargetingHostsActions.js +8 -0
  68. data/webpack/react_app/components/TargetingHosts/TargetingHostsConsts.js +1 -0
  69. data/webpack/react_app/components/TargetingHosts/TargetingHostsSelectors.js +12 -0
  70. data/webpack/react_app/components/TargetingHosts/__tests__/HostItem.test.js +6 -0
  71. data/webpack/react_app/components/TargetingHosts/__tests__/HostStatus.test.js +6 -0
  72. data/webpack/react_app/components/TargetingHosts/__tests__/TargetingHosts.test.js +6 -0
  73. data/webpack/react_app/components/TargetingHosts/__tests__/__snapshots__/HostItem.test.js.snap +31 -0
  74. data/webpack/react_app/components/TargetingHosts/__tests__/__snapshots__/HostStatus.test.js.snap +12 -0
  75. data/webpack/react_app/components/TargetingHosts/__tests__/__snapshots__/TargetingHosts.test.js.snap +81 -0
  76. data/webpack/react_app/components/TargetingHosts/__tests__/fixtures.js +43 -0
  77. data/webpack/react_app/components/TargetingHosts/components/HostItem.js +39 -0
  78. data/webpack/react_app/components/TargetingHosts/components/HostStatus.js +54 -0
  79. data/webpack/react_app/components/TargetingHosts/index.js +37 -0
  80. data/webpack/react_app/components/jobInvocations/AggregateStatus/index.js +10 -0
  81. data/webpack/react_app/components/jobInvocations/AggregateStatus/index.test.js +6 -3
  82. data/webpack/react_app/components/jobInvocations/index.js +19 -7
  83. data/webpack/react_app/redux/actions/jobInvocations/index.js +12 -8
  84. data/webpack/react_app/redux/consts.js +1 -2
  85. data/webpack/react_app/redux/reducers/jobInvocations/index.fixtures.js +8 -40
  86. data/webpack/react_app/redux/reducers/jobInvocations/index.test.js +17 -11
  87. data/webpack/test_setup.js +2 -1
  88. metadata +31 -14
  89. data/.hound.yml +0 -19
  90. data/.travis.yml +0 -6
  91. data/app/views/job_invocations/_host_actions_td.html.erb +0 -3
  92. data/app/views/job_invocations/_host_name_td.html.erb +0 -8
  93. data/app/views/job_invocations/_host_status_td.html.erb +0 -1
  94. data/app/views/job_invocations/show.js.erb +0 -23
@@ -12,6 +12,10 @@ module ForemanRemoteExecution
12
12
  key
13
13
  end
14
14
 
15
+ def drop_host_from_known_hosts(host)
16
+ ::ProxyAPI::RemoteExecutionSSH.new(:url => url).drop_from_known_hosts(host)
17
+ end
18
+
15
19
  def refresh
16
20
  errors = super
17
21
  update_pubkey
@@ -7,8 +7,10 @@ class HostStatus::ExecutionStatus < HostStatus::Status
7
7
  QUEUED = 2
8
8
  # execution is in progress, dynflow task was created
9
9
  RUNNING = 3
10
+ # execution has been cancelled
11
+ CANCELLED = 4
10
12
  # mapping to string representation
11
- STATUS_NAMES = { OK => 'succeeded', ERROR => 'failed', QUEUED => 'queued', RUNNING => 'running' }.freeze
13
+ STATUS_NAMES = { OK => 'succeeded', ERROR => 'failed', QUEUED => 'queued', RUNNING => 'running', CANCELLED => 'cancelled' }.freeze
12
14
 
13
15
  def relevant?(*args)
14
16
  execution_tasks.present?
@@ -38,6 +40,8 @@ class HostStatus::ExecutionStatus < HostStatus::Status
38
40
  case to_status(options)
39
41
  when OK
40
42
  execution_tasks.present? ? N_('Last execution succeeded') : N_('No execution finished yet')
43
+ when CANCELLED
44
+ N_('Last execution cancelled')
41
45
  when ERROR
42
46
  N_('Last execution failed')
43
47
  else
@@ -54,6 +58,8 @@ class HostStatus::ExecutionStatus < HostStatus::Status
54
58
  case status
55
59
  when OK
56
60
  [ "state = 'stopped' AND result = 'success'" ]
61
+ when CANCELLED
62
+ [ "state = 'stopped' AND result = 'cancelled'" ]
57
63
  when ERROR
58
64
  [ "state = 'stopped' AND (result = 'error' OR result = 'warning')" ]
59
65
  when QUEUED
@@ -74,6 +80,8 @@ class HostStatus::ExecutionStatus < HostStatus::Status
74
80
  QUEUED
75
81
  elsif task.state == 'stopped' && task.result == 'success'
76
82
  OK
83
+ elsif task.state == 'stopped' && task.result == 'cancelled'
84
+ CANCELLED
77
85
  elsif task.pending?
78
86
  RUNNING
79
87
  else
@@ -98,5 +98,10 @@ class RemoteExecutionProvider
98
98
  def proxy_action_class
99
99
  ForemanRemoteExecutionCore::Actions::RunScript
100
100
  end
101
+
102
+ # Return a specific proxy selector to use for running a given template
103
+ # Returns either nil to use the default selector or an instance of a (sub)class of ::ForemanTasks::ProxySelector
104
+ def required_proxy_selector_for(_template)
105
+ end
101
106
  end
102
107
  end
@@ -0,0 +1,18 @@
1
+ class DefaultProxyProxySelector < ::RemoteExecutionProxySelector
2
+ def initialize
3
+ # TODO: Remove this once we have a reliable way of determining the internal proxy without katello
4
+ # Tracked as https://projects.theforeman.org/issues/29840
5
+ raise _('Internal proxy selector can only be used if Katello is enabled') unless defined?(::Katello)
6
+
7
+ super
8
+ end
9
+
10
+ def available_proxies(host, provider)
11
+ # TODO: Once we have a internal proxy marker/feature on the proxy, we can
12
+ # swap the implementation
13
+ internal_proxy = ::Katello.default_capsule
14
+ super.reduce({}) do |acc, (key, proxies)|
15
+ acc.merge(key => proxies.select { |proxy| proxy == internal_proxy })
16
+ end
17
+ end
18
+ end
@@ -19,8 +19,14 @@ child :targeting do
19
19
  attributes :bookmark_id, :search_query, :targeting_type, :user_id, :status, :status_label,
20
20
  :randomized_ordering
21
21
 
22
- child :hosts do
22
+ child @hosts do
23
23
  extends 'api/v2/hosts/base'
24
+
25
+ if params[:host_status]
26
+ node :job_status do |host|
27
+ @host_statuses[host.id]
28
+ end
29
+ end
24
30
  end
25
31
  end
26
32
 
@@ -28,7 +34,7 @@ child :task do
28
34
  attributes :id, :state
29
35
  end
30
36
 
31
- child :template_invocations do
37
+ child @template_invocations do
32
38
  attributes :template_id, :template_name
33
39
  child :input_values do
34
40
  attributes :template_input_name, :template_input_id
@@ -5,6 +5,7 @@
5
5
  </h2>
6
6
  <div class="card-pf-body">
7
7
  <div id='status_chart'>
8
+ <%= react_component('JobInvocationContainer', data: { url: "/job_invocations/chart?id=#{job_invocation.id}" }) %>
8
9
  </div>
9
10
  </div>
10
11
  </div>
@@ -8,7 +8,7 @@
8
8
  <p>
9
9
  <ul>
10
10
  <% template_invocation.input_values.joins(:template_input).each do |input_value| %>
11
- <li><b><%= input_value.template_input.name %></b>: <%= input_value.template_input.hidden_value ? '*' * 5 : trunc_with_tooltip(input_value.value, 255) %></li>
11
+ <li><b><%= input_value.template_input.name %></b>: <%= trunc_with_tooltip(input_safe_value(input_value), 255) %></li>
12
12
  <% end %>
13
13
  </ul>
14
14
  </p>
@@ -15,29 +15,9 @@
15
15
  <% end %>
16
16
  <br>
17
17
 
18
- <table class="<%= table_css_classes('table-condensed') %>">
19
- <thead>
20
- <tr>
21
- <th><%= sort :name, :as => _('Host') %></th>
22
- <th><%= _('Status') %></th>
23
- <th><%= _('Actions') %></th>
24
- </tr>
25
- </thead>
26
-
27
- <tbody>
28
- <% hosts.each do |host| %>
29
- <% template_invocation = job_invocation.template_invocations.find { |template_invocation| template_invocation.host_id == host.id } %>
30
- <% task = template_invocation.try(:run_host_job_task) %>
31
- <tr>
32
- <% options = { :host => host, :task => task, :job_invocation => job_invocation, :template_invocation => template_invocation } %>
33
- <%= render 'host_name_td', options %>
34
- <%= render 'host_status_td', options %>
35
- <%= render 'host_actions_td', options %>
36
- </tr>
37
- <% end %>
38
- </tbody>
39
- </table>
40
-
18
+ <div id="targeting_hosts">
19
+ <%= mount_react_component('TargetingHosts', '#targeting_hosts') %>
20
+ </div>
41
21
  <%= will_paginate_with_info @hosts, :container => true %>
42
22
  <% else %>
43
23
  <div class="alert alert-warning">
@@ -1,7 +1,7 @@
1
1
  <% template_invocations = job_invocation.pattern_template_invocations %>
2
2
  <div class='row'>
3
3
  <div class="col-xs-6 col-sm-6 col-md-6">
4
- <%= render :partial => 'card_results' %>
4
+ <%= render :partial => 'card_results', :locals => { :job_invocation => job_invocation } %>
5
5
  <%= render :partial => 'card_schedule', :locals => { :job_invocation => job_invocation } %>
6
6
  </div>
7
7
  <div class='col-xs-12 col-sm-6 col-md-6'>
@@ -12,7 +12,7 @@
12
12
  <% template_invocation.input_values.joins(:template_input).each do |input_value| %>
13
13
  <tr>
14
14
  <td><b><%= input_value.template_input.name %></b></td>
15
- <td><%= input_value.template_input.hidden_value? ? '*' * 5 : input_value.value %></td>
15
+ <td><%= input_safe_value(input_value) %></td>
16
16
  </tr>
17
17
  <% end %>
18
18
  </tbody>
@@ -1,7 +1,7 @@
1
1
  <% title @job_invocation.description %>
2
2
  <% stylesheet 'foreman_remote_execution/foreman_remote_execution' %>
3
3
  <% javascript 'charts', 'foreman_remote_execution/template_invocation' %>
4
- <%= javascript_include_tag *webpack_asset_paths('foreman_remote_execution', :extension => 'js'), "data-turbolinks-track" => true, 'defer' => 'defer' %>
4
+ <% javascript *webpack_asset_paths('foreman_remote_execution', :extension => 'js') %>
5
5
 
6
6
  <%= breadcrumbs name_field: 'description' %>
7
7
 
@@ -41,9 +41,3 @@
41
41
  <% end %>
42
42
  <%= render_tab_content_for(:main_tabs, subject: @job_invocation) %>
43
43
  </div>
44
-
45
- <script id="job_invocation_refresh" data-refresh-url="<%= job_invocation_path(@job_invocation) %>">
46
- <% if @auto_refresh %>
47
- delayed_refresh($('script#job_invocation_refresh').data('refresh-url'), job_invocation_refresh_data());
48
- <% end %>
49
- </script>
@@ -0,0 +1,4 @@
1
+ {
2
+ "autoRefresh": "<%= @auto_refresh %>",
3
+ "hosts": <%= targeting_hosts(@job_invocation, @hosts).to_json.html_safe %>
4
+ }
@@ -16,7 +16,8 @@ Rails.application.routes.draw do
16
16
  end
17
17
  end
18
18
 
19
- resources :job_invocations, :only => [:new, :create, :show, :index] do
19
+ match 'job_invocations/new', to: 'job_invocations#new', via: [:get, :post], as: 'new_job_invocation'
20
+ resources :job_invocations, :only => [:create, :show, :index] do
20
21
  collection do
21
22
  post 'refresh'
22
23
  get 'chart'
@@ -4,7 +4,7 @@ User.as_anonymous_admin do
4
4
  JobTemplate.without_auditing do
5
5
  Dir[File.join("#{ForemanRemoteExecution::Engine.root}/app/views/templates/**/*.erb")].each do |template|
6
6
  sync = !Rails.env.test? && Setting[:remote_execution_sync_templates]
7
- template = JobTemplate.import_raw!(File.read(template), :default => true, :locked => true, :update => sync)
7
+ template = JobTemplate.import_raw!(File.read(template), :default => true, :lock => true, :update => sync)
8
8
  template.organizations = organizations if template.present?
9
9
  template.locations = locations if template.present?
10
10
  end
@@ -15,21 +15,20 @@ Gem::Specification.new do |s|
15
15
  s.description = 'A plugin bringing remote execution to the Foreman, completing the config ' +
16
16
  'management functionality with remote management functionality.'
17
17
 
18
- s.files = `git ls-files`.split("\n").reject do |file|
19
- file =~ /^scripts/ ||
20
- file.start_with?('lib/foreman_remote_execution_core') ||
21
- file == 'foreman_remote_execution_core.gemspec'
18
+ s.files = `git ls-files`.split("\n").reject do |file|
19
+ file.start_with?('scripts', 'lib/foreman_remote_execution_core') ||
20
+ file == 'foreman_remote_execution_core.gemspec'
22
21
  end
23
22
 
24
23
  s.test_files = `git ls-files test`.split("\n")
25
24
  s.extra_rdoc_files = Dir['README*', 'LICENSE']
26
25
 
27
26
  s.add_dependency 'deface'
28
- s.add_dependency 'dynflow', '>= 1.0.1', '< 2.0.0'
27
+ s.add_dependency 'dynflow', '>= 1.0.2', '< 2.0.0'
29
28
  s.add_dependency 'foreman_remote_execution_core'
30
29
  s.add_dependency 'foreman-tasks', '>= 0.15.1'
31
30
 
32
31
  s.add_development_dependency 'factory_bot_rails', '~> 4.8.0'
33
- s.add_development_dependency 'rubocop'
32
+ s.add_development_dependency 'rubocop', '~> 0.80.0'
34
33
  s.add_development_dependency 'rdoc'
35
34
  end
@@ -166,10 +166,12 @@ module ForemanRemoteExecution
166
166
 
167
167
  Host::Managed.prepend ForemanRemoteExecution::HostExtensions
168
168
  Host::Managed.include ForemanTasks::Concerns::HostActionSubject
169
+ Host::Managed.include ForemanRemoteExecution::Orchestration::SSH
169
170
 
170
171
  (Nic::Base.descendants + [Nic::Base]).each do |klass|
171
172
  klass.send(:include, ForemanRemoteExecution::NicExtensions)
172
173
  end
174
+ Nic::Managed.include ForemanRemoteExecution::Orchestration::SSH
173
175
 
174
176
  Bookmark.include ForemanRemoteExecution::BookmarkExtensions
175
177
  HostsHelper.prepend ForemanRemoteExecution::HostsHelperExtensions
@@ -1,3 +1,3 @@
1
1
  module ForemanRemoteExecution
2
- VERSION = '3.1.0'.freeze
2
+ VERSION = '3.3.2'.freeze
3
3
  end
@@ -1,5 +1,5 @@
1
1
  # Autogenerated!
2
- _("Remote action:")
3
- _("Import Puppet classes")
4
- _("Import facts")
5
2
  _("Action with sub plans")
3
+ _("Import facts")
4
+ _("Import Puppet classes")
5
+ _("Remote action:")
@@ -27,11 +27,6 @@ msgstr "vor %s"
27
27
  msgid "%{description} on %{host}"
28
28
  msgstr "%{description} auf %{host}"
29
29
 
30
- msgid "...and %{count} more"
31
- msgid_plural "...and %{count} more"
32
- msgstr[0] "...und %{count} weiteren"
33
- msgstr[1] "...und %{count} weiteren"
34
-
35
30
  msgid "A comma separated list of input names to be excluded from the foreign template."
36
31
  msgstr "Kommagetrennte Liste von Eingabenamen, die aus der Fremdvorlage auszuschließen ist"
37
32
 
@@ -59,12 +54,21 @@ msgstr "Aktionen"
59
54
  msgid "Add Foreign Input Set"
60
55
  msgstr "Fremdeingabe-Satz hinzufügen"
61
56
 
57
+ msgid "Alphabetical"
58
+ msgstr ""
59
+
62
60
  msgid "Amount of workers in the pool to handle the execution of the remote execution jobs. Restart of the dynflowd/foreman-tasks service is required."
63
61
  msgstr ""
64
62
 
65
63
  msgid "Another interface is already set as execution. Are you sure you want to use this one instead?"
66
64
  msgstr "Es ist bereits eine andere Schnittstelle für die Ausführung bestimmt. Sind Sie sicher, dass Sie stattdessen diese Schnittstelle verwenden möchten?"
67
65
 
66
+ msgid "Any Location"
67
+ msgstr ""
68
+
69
+ msgid "Any Organization"
70
+ msgstr ""
71
+
68
72
  msgid "Back to Job"
69
73
  msgstr "Zurück zum Job"
70
74
 
@@ -92,6 +96,9 @@ msgstr "bookmark_id und search_query konnte nicht angegeben werden"
92
96
  msgid "Cannot specify both recurrence and scheduling"
93
97
  msgstr "Wiederholung und Planung konnten nicht angegeben werden"
94
98
 
99
+ msgid "Choose a job template that is pre-selected in job invocation form"
100
+ msgstr ""
101
+
95
102
  msgid "Circular dependency detected in foreign input set '%{template}' -> '%{target_template}'. Templates stack: %{templates_stack}"
96
103
  msgstr "Zirkuläre Abhängigkeit im Fremdeingabe-Satz gefunden '%{template}' -> '%{target_template}'. Vorlagen-Stack: %{templates_stack}"
97
104
 
@@ -146,6 +153,12 @@ msgstr "Job-Vorlage erstellen"
146
153
  msgid "Create a recurring job"
147
154
  msgstr "Wiederholten Job erstellen"
148
155
 
156
+ msgid "Current location %{loc_c} is different from job's location %{loc_j}."
157
+ msgstr ""
158
+
159
+ msgid "Current organization %{org_c} is different from job's organization %{org_j}."
160
+ msgstr ""
161
+
149
162
  msgid "Default SSH key passphrase"
150
163
  msgstr ""
151
164
 
@@ -179,8 +192,8 @@ msgstr "Beschreibungsvorlage"
179
192
  msgid "Display advanced fields"
180
193
  msgstr "Erweiterte Felder einblenden"
181
194
 
182
- msgid "Distribute execution over N seconds"
183
- msgstr "Ausführung über n Sekunden verteilen"
195
+ msgid "Distribute execution over N seconds. If this is set and proxy batch triggering is enabled, then tasks are triggered on the smart proxy in batches of size 1."
196
+ msgstr ""
184
197
 
185
198
  msgid "Distribute tasks over N seconds"
186
199
  msgstr "Aufgaben über n Sekunden verteilen"
@@ -224,9 +237,21 @@ msgstr "Fehler die Daten vom Proxy zu laden."
224
237
  msgid "Evaluated at:"
225
238
  msgstr "Evaluiert an:"
226
239
 
240
+ msgid "Execute the jobs on hosts in randomized order"
241
+ msgstr ""
242
+
227
243
  msgid "Execution"
228
244
  msgstr "Ausführung"
229
245
 
246
+ msgid "Execution order"
247
+ msgstr ""
248
+
249
+ msgid "Execution ordering"
250
+ msgstr ""
251
+
252
+ msgid "Execution ordering determines whether the jobs should be executed on hosts in alphabetical order or in randomized order.<br><ul><li><b>Ordered</b> - executes the jobs on hosts in alphabetical order</li><li><b>Randomized</b> - randomizes the order in which jobs are executed on hosts</li></ul>"
253
+ msgstr ""
254
+
230
255
  msgid "Exit status: %s"
231
256
  msgstr "Exit-Status: %s"
232
257
 
@@ -257,6 +282,9 @@ msgstr "Fremdeingabe-Satz"
257
282
  msgid "Foreman can run arbitrary commands on remote hosts using different providers, such as SSH or Ansible. Communication goes through the Smart Proxy so Foreman does not have to have direct access to the target hosts and can scale to control many hosts."
258
283
  msgstr ""
259
284
 
285
+ msgid "Form Job Template"
286
+ msgstr ""
287
+
260
288
  msgid "Get output for a host"
261
289
  msgstr "Ausgabe für einen Host abfragen"
262
290
 
@@ -377,6 +405,9 @@ msgstr ""
377
405
  msgid "Label"
378
406
  msgstr "Kennung"
379
407
 
408
+ msgid "Last execution cancelled"
409
+ msgstr ""
410
+
380
411
  msgid "Last execution failed"
381
412
  msgstr "Letzte Ausführung fehlgeschlagen"
382
413
 
@@ -407,6 +438,9 @@ msgstr "Entfernte Ausführungsfunktionen auflisten"
407
438
  msgid "List template invocations belonging to job invocation"
408
439
  msgstr ""
409
440
 
441
+ msgid "Location"
442
+ msgstr ""
443
+
410
444
  msgid "Manual selection"
411
445
  msgstr "Manuelle Auswahl"
412
446
 
@@ -425,15 +459,15 @@ msgstr "Neue Job-Vorlage"
425
459
  msgid "No execution finished yet"
426
460
  msgstr "Noch keine Ausführung abgeschlossen"
427
461
 
428
- msgid "No hosts found."
429
- msgstr "Keine Hosts gefunden"
430
-
431
462
  msgid "No template mapped to feature %{feature_name}"
432
463
  msgstr "Der Funktion %{feature_name} wurde keine Vorlage zugewiesen"
433
464
 
434
465
  msgid "Not all required inputs have values. Missing inputs: %s"
435
466
  msgstr "Nicht alle erforderlichen Eingaben haben Werte. Fehlende Eingaben: %s"
436
467
 
468
+ msgid "Organization"
469
+ msgstr ""
470
+
437
471
  msgid "Override the description format from the template for this invocation only"
438
472
  msgstr "Beschreibungsformat der Vorlage nur für diesen Aufruf außer Kraft setzen "
439
473
 
@@ -458,6 +492,9 @@ msgstr ""
458
492
  msgid "Pending"
459
493
  msgstr "Ausstehend"
460
494
 
495
+ msgid "Perform a single Puppet run"
496
+ msgstr ""
497
+
461
498
  msgid "Perform no more executions after this time"
462
499
  msgstr "Danach nicht mehr ausführen"
463
500
 
@@ -487,6 +524,9 @@ msgstr "Anbieter und Vorlagen"
487
524
  msgid "Proxies"
488
525
  msgstr "Proxys"
489
526
 
527
+ msgid "Randomized"
528
+ msgstr ""
529
+
490
530
  msgid "Recurring logic"
491
531
  msgstr "Wiederholungslogik"
492
532
 
@@ -511,6 +551,9 @@ msgstr "Entfernte Ausführung"
511
551
  msgid "Remote execution feature label that should be triggered, job template assigned to this feature will be used"
512
552
  msgstr ""
513
553
 
554
+ msgid "Remove SSH known hosts for %s"
555
+ msgstr ""
556
+
514
557
  msgid "Repeat a maximum of N times"
515
558
  msgstr "Maximal n-mal wiederholen"
516
559
 
@@ -544,9 +587,15 @@ msgstr "Ausführen"
544
587
  msgid "Run Job"
545
588
  msgstr "Job ausführen"
546
589
 
590
+ msgid "Run Puppet Once"
591
+ msgstr ""
592
+
547
593
  msgid "Run at most N tasks at a time"
548
594
  msgstr "Höchstens n Aufgaben gleichzeitig ausführen"
549
595
 
596
+ msgid "Run at most N tasks at a time. If this is set and proxy batch triggering is enabled, then tasks are triggered on the smart proxy in batches of size 1."
597
+ msgstr ""
598
+
550
599
  msgid "SSH"
551
600
  msgstr "SSH"
552
601
 
@@ -589,8 +638,8 @@ msgstr "Suchen"
589
638
  msgid "Search Query"
590
639
  msgstr ""
591
640
 
592
- msgid "Search for remote execution proxy outside of the proxies assigned to the host. If locations or organizations are enabled, the search will be limited to the host's organization or location."
593
- msgstr "Außerhalb der dem Host zugewiesenen Proxys nach Proxy mit entfernter Ausführung suchen. Wenn Standorte oder Organisationen aktiviert sind, wird die Suche auf Organisation oder Standort des Hosts begrenzt."
641
+ msgid "Search for remote execution proxy outside of the proxies assigned to the host. The search will be limited to the host's organization and location."
642
+ msgstr ""
594
643
 
595
644
  msgid "Search the host for any proxy with Remote Execution, useful when the host has no subnet or the subnet does not have an execution proxy"
596
645
  msgstr "Den Host nach einem Proxy mit entfernter Ausführung durchsuchen. Dies ist nützlich, wenn der Host kein Subnetz hat oder das Subnetz keinen Proxy für die Ausführung hat."
@@ -610,7 +659,7 @@ msgstr "Wählen Sie so viele Proxys für entfernte Ausführung aus, wie es für
610
659
  msgid "Set to distribute over"
611
660
  msgstr ""
612
661
 
613
- msgid "Should the ip addresses on host interfaces be preferred over the fqdn? It is useful, when DNS not resolving the fqdns properly. You may override this per host by setting a parameter called remote_execution_connect_by_ip."
662
+ msgid "Should the ip addresses on host interfaces be preferred over the fqdn? It is useful when DNS not resolving the fqdns properly. You may override this per host by setting a parameter called remote_execution_connect_by_ip. This setting only applies to IPv4. When the host has only an IPv6 address on the interface used for remote execution, hostname will be used even if this setting is set to true."
614
663
  msgstr ""
615
664
 
616
665
  msgid "Show foreign input set details"
@@ -682,9 +731,6 @@ msgstr "Vorlagenversion"
682
731
  msgid "Template with id '%{id}' was not found"
683
732
  msgstr "Vorlage mit ID '%{id}' nicht gefunden"
684
733
 
685
- msgid "The dynamic query '#{job_invocation.targeting.search_query}' was not resolved yet. The list of hosts to which it would resolve now can be seen"
686
- msgstr ""
687
-
688
734
  msgid "The dynamic query '%{query}' was not resolved yet. The list of hosts to which it would resolve now can be seen %{here}."
689
735
  msgstr "Die dynamische Anfrage '%{query}' wurde noch nicht aufgelöst. Die Liste von Hosts, zu denen sie sich auflösen würde, ist jetzt %{here} zu sehen."
690
736
 
@@ -786,6 +832,9 @@ msgstr "Anfragetyp"
786
832
  msgid "Unable to fetch public key"
787
833
  msgstr "Öffentlicher Schlüssel konnte nicht abgerufen werden"
788
834
 
835
+ msgid "Unable to remove host from known hosts"
836
+ msgstr ""
837
+
789
838
  msgid "Unable to save template. Correct highlighted errors"
790
839
  msgstr "Vorlage kann nicht gespeichert werden. Bitte korrigieren Sie die markierten Fehler"
791
840