foreman_remote_execution 0.1.2 → 0.2.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +3 -0
- data/.rubocop_todo.yml +0 -6
- data/app/assets/javascripts/template_input.js +5 -0
- data/app/assets/javascripts/template_invocation.js +44 -12
- data/app/controllers/api/v2/foreign_input_sets_controller.rb +80 -0
- data/app/controllers/api/v2/job_invocations_controller.rb +28 -14
- data/app/controllers/api/v2/job_templates_controller.rb +24 -20
- data/app/controllers/api/v2/template_inputs_controller.rb +10 -7
- data/app/controllers/job_invocations_controller.rb +18 -6
- data/app/controllers/job_templates_controller.rb +14 -4
- data/app/controllers/template_invocations_controller.rb +5 -3
- data/app/helpers/concerns/foreman_remote_execution/hosts_helper_extensions.rb +1 -1
- data/app/helpers/concerns/foreman_remote_execution/job_templates_extensions.rb +19 -0
- data/app/helpers/remote_execution_helper.rb +88 -39
- data/app/lib/actions/remote_execution/run_host_job.rb +11 -8
- data/app/lib/actions/remote_execution/run_hosts_job.rb +5 -2
- data/app/lib/actions/remote_execution/run_proxy_command.rb +9 -4
- data/app/models/concerns/foreman_remote_execution/errors_flattener.rb +2 -2
- data/app/models/concerns/foreman_remote_execution/host_extensions.rb +2 -2
- data/app/models/concerns/foreman_remote_execution/smart_proxy_extensions.rb +1 -1
- data/app/models/concerns/foreman_remote_execution/template_extensions.rb +9 -1
- data/app/models/foreign_input_set.rb +49 -0
- data/app/models/host_status/execution_status.rb +50 -5
- data/app/models/input_template_renderer.rb +52 -7
- data/app/models/job_invocation.rb +89 -32
- data/app/models/job_invocation_composer.rb +71 -55
- data/app/models/job_template.rb +43 -7
- data/app/models/remote_execution_provider.rb +1 -1
- data/app/models/setting/remote_execution.rb +7 -7
- data/app/models/ssh_execution_provider.rb +1 -1
- data/app/models/targeting.rb +1 -1
- data/app/models/template_invocation.rb +9 -4
- data/app/views/api/v2/foreign_input_sets/base.json.rabl +3 -0
- data/app/views/api/v2/foreign_input_sets/create.json.rabl +3 -0
- data/app/views/api/v2/foreign_input_sets/index.json.rabl +3 -0
- data/app/views/api/v2/foreign_input_sets/main.json.rabl +5 -0
- data/app/views/api/v2/foreign_input_sets/show.json.rabl +3 -0
- data/app/views/api/v2/job_invocations/base.json.rabl +10 -1
- data/app/views/api/v2/job_invocations/main.json.rabl +14 -1
- data/app/views/api/v2/job_templates/base.json.rabl +1 -1
- data/app/views/api/v2/job_templates/main.json.rabl +9 -1
- data/app/views/api/v2/job_templates/show.json.rabl +0 -10
- data/app/views/api/v2/template_inputs/main.json.rabl +2 -1
- data/app/views/job_invocation_task_groups/_job_invocation_task_group.html.erb +1 -1
- data/app/views/job_invocations/_description_fields.html.erb +4 -0
- data/app/views/job_invocations/_form.html.erb +73 -91
- data/app/views/job_invocations/_host_actions_td.html.erb +2 -2
- data/app/views/job_invocations/_host_name_td.html.erb +7 -0
- data/app/views/job_invocations/_tab_hosts.html.erb +6 -6
- data/app/views/job_invocations/_tab_overview.html.erb +3 -3
- data/app/views/job_invocations/index.html.erb +6 -4
- data/app/views/job_invocations/refresh.js.erb +1 -0
- data/app/views/job_invocations/show.html.erb +1 -1
- data/app/views/job_invocations/show.js.erb +6 -3
- data/app/views/job_templates/_custom_tabs.html.erb +24 -14
- data/app/views/job_templates/index.html.erb +3 -1
- data/app/views/template_inputs/_foreign_input_set_form.html.erb +12 -0
- data/app/views/template_inputs/_form.html.erb +11 -12
- data/app/views/template_invocations/show.html.erb +2 -2
- data/app/views/templates/package_action.erb +2 -2
- data/app/views/templates/puppet_run_once.erb +3 -3
- data/app/views/templates/run_command.erb +3 -3
- data/app/views/templates/service_action.erb +2 -2
- data/app/views/unattended/snippets/_remote_execution_ssh_keys.erb +1 -1
- data/config/routes.rb +5 -3
- data/db/migrate/20150616080015_create_template_input.rb +1 -1
- data/db/migrate/20150708133241_add_targeting.rb +7 -7
- data/db/migrate/20150708133242_add_invocation.rb +2 -2
- data/db/migrate/20150708133305_add_template_invocation.rb +6 -6
- data/db/migrate/20151215114631_add_host_id_to_template_invocation.rb +3 -3
- data/db/migrate/20151217092555_migrate_to_task_groups.rb +1 -1
- data/db/migrate/20160108134600_create_template_input_sets.rb +16 -0
- data/db/migrate/20160108141144_make_job_name_default_to_something.rb +9 -0
- data/db/migrate/20160111113032_upcase_ssh_feature.rb +19 -0
- data/db/migrate/20160113161916_add_run_host_job_task_id_to_template_invocation.rb +6 -0
- data/db/migrate/20160113162007_expand_all_template_invocations.rb +45 -0
- data/db/migrate/20160114120200_rename_job_categories.rb +20 -0
- data/db/migrate/20160114125628_rename_job_name_to_job_category.rb +19 -0
- data/db/seeds.d/60-ssh_proxy_feature.rb +1 -1
- data/db/seeds.d/80-provision_templates.rb +2 -2
- data/db/seeds.d/90-bookmarks.rb +19 -0
- data/doc/plugins/graphviz.rb +5 -5
- data/doc/plugins/plantuml.rb +6 -6
- data/doc/plugins/tags.rb +4 -4
- data/foreman_remote_execution.gemspec +3 -4
- data/lib/foreman_remote_execution/engine.rb +12 -9
- data/lib/foreman_remote_execution/version.rb +1 -1
- data/test/factories/foreman_remote_execution_factories.rb +11 -9
- data/test/functional/api/v2/foreign_input_sets_controller_test.rb +63 -0
- data/test/functional/api/v2/job_invocations_controller_test.rb +45 -13
- data/test/functional/api/v2/job_templates_controller_test.rb +6 -6
- data/test/functional/api/v2/template_inputs_controller_test.rb +3 -3
- data/test/unit/actions/run_hosts_job_test.rb +3 -4
- data/test/unit/actions/run_proxy_command_test.rb +7 -7
- data/test/unit/concerns/host_extensions_test.rb +1 -1
- data/test/unit/execution_task_status_mapper_test.rb +93 -0
- data/test/unit/input_template_renderer_test.rb +182 -9
- data/test/unit/job_invocation_composer_test.rb +144 -168
- data/test/unit/job_invocation_test.rb +67 -15
- data/test/unit/job_template_effective_user_test.rb +2 -2
- data/test/unit/job_template_test.rb +36 -12
- data/test/unit/remote_execution_provider_test.rb +6 -6
- data/test/unit/targeting_test.rb +2 -2
- metadata +27 -21
- data/app/models/concerns/foreman_remote_execution/template_relations.rb +0 -10
- data/app/views/job_invocations/_host_provider_td.html.erb +0 -3
- data/app/views/job_templates/auto_complete_job_name.json.erb +0 -3
@@ -1,18 +1,22 @@
|
|
1
1
|
<div class="tab-pane" id="template_job">
|
2
2
|
|
3
|
-
<%= field(f, :
|
4
|
-
<%= auto_complete_search(:
|
5
|
-
f.object.
|
6
|
-
:placeholder => _("Job
|
7
|
-
:name => 'job_template[
|
8
|
-
:id => 'search'
|
3
|
+
<%= field(f, :job_category, :label => _('Job category')) do %>
|
4
|
+
<%= auto_complete_search(:job_category,
|
5
|
+
f.object.job_category,
|
6
|
+
:placeholder => _("Job category") + ' ...',
|
7
|
+
:name => 'job_template[job_category]',
|
8
|
+
:id => 'search',
|
9
|
+
:disabled => @template.locked?) %>
|
9
10
|
<% end %>
|
10
11
|
|
11
12
|
<%= text_f f, :description_format,
|
12
|
-
:
|
13
|
-
|
13
|
+
:disabled => @template.locked?,
|
14
|
+
:help_inline => popover(_('Explanation'), _('This template is used to generate the description.
|
15
|
+
Input values can be used using the syntax %{package}.
|
16
|
+
You may also include the job category and template
|
17
|
+
name using %{job_category} and %{template_name}.')) %>
|
14
18
|
|
15
|
-
<%= select_f f, :provider_type, providers_options, :first, :last %>
|
19
|
+
<%= select_f f, :provider_type, providers_options, :first, :last, :disabled => @template.locked? %>
|
16
20
|
|
17
21
|
<div class="children_fields">
|
18
22
|
<%= new_child_fields_template(f, :template_inputs, { :partial => "template_inputs/form" }) %>
|
@@ -21,16 +25,23 @@
|
|
21
25
|
<%= render 'template_inputs/form', :f => ff %>
|
22
26
|
</div>
|
23
27
|
<% end %>
|
24
|
-
<%= add_child_link '+ ' + _("Add Input"), :template_inputs, { :title => _('add a input for this template')} %>
|
28
|
+
<%= add_child_link '+ ' + _("Add Input"), :template_inputs, { :title => _('add a input for this template')} unless @template.locked? %>
|
29
|
+
<%= new_child_fields_template(f, :foreign_input_sets, { :partial => "template_inputs/foreign_input_set_form" }) %>
|
30
|
+
<%= f.fields_for :foreign_input_sets do |ff| %>
|
31
|
+
<div class="template_input_form fields">
|
32
|
+
<%= render 'template_inputs/foreign_input_set_form', :f => ff %>
|
33
|
+
</div>
|
34
|
+
<% end %>
|
35
|
+
<%= add_child_link '+ ' + _("Add Foreign Input Set"), :foreign_input_sets, { :title => _('add an input set for this template to reference a different template inputs') } unless @template.locked? %>
|
25
36
|
</div>
|
26
37
|
|
27
38
|
<div class="children_fields">
|
28
39
|
<%= field_set_tag _("Effective user") do %>
|
29
40
|
<%= f.fields_for :effective_user, @template.effective_user do |ff| %>
|
30
41
|
<div class="effective_user_form fields">
|
31
|
-
<%= text_f ff, :value %>
|
32
|
-
<%= checkbox_f ff, :current_user %>
|
33
|
-
<%= checkbox_f ff, :overridable %>
|
42
|
+
<%= text_f ff, :value, :disabled => @template.locked? %>
|
43
|
+
<%= checkbox_f ff, :current_user, :disabled => @template.locked? %>
|
44
|
+
<%= checkbox_f ff, :overridable, :disabled => @template.locked? %>
|
34
45
|
</div>
|
35
46
|
<% end %>
|
36
47
|
<% end %>
|
@@ -38,7 +49,6 @@
|
|
38
49
|
|
39
50
|
</div>
|
40
51
|
|
41
|
-
|
42
52
|
<div class="tab-pane" id="template_type">
|
43
53
|
<%= checkbox_f f, :snippet, :onchange => "snippet_changed(this)", :label=>_('Snippet'), :disabled => @template.locked? %>
|
44
54
|
</div>
|
@@ -3,7 +3,9 @@
|
|
3
3
|
<%= javascript 'template_input' %>
|
4
4
|
|
5
5
|
<% title _("Job Templates") %>
|
6
|
-
<% title_actions
|
6
|
+
<% title_actions(documentation_button_rex('3.1JobTemplates'),
|
7
|
+
display_link_if_authorized(_("New Job Template"),
|
8
|
+
hash_for_new_job_template_path)) %>
|
7
9
|
|
8
10
|
<table class="table table-bordered table-striped table-two-pane">
|
9
11
|
<thead>
|
@@ -0,0 +1,12 @@
|
|
1
|
+
<div class="fields">
|
2
|
+
<div class="form-group">
|
3
|
+
<%= field_set_tag _("Foreign input set").html_safe +
|
4
|
+
' ' +
|
5
|
+
remove_child_link('x', f, {:rel => 'twipsy', "data-title" => _('remove template input set'), :'data-placement' => 'left', :class => 'fr badge badge-danger'}).html_safe do %>
|
6
|
+
<%= selectable_f f, :target_template_id, JobTemplate.all.map { |t| [ t.name, t.id ] }, {}, :class => 'input_type_selector without_select2' %>
|
7
|
+
<%= checkbox_f f, :include_all, :disabled => @template.locked?, :onchange => 'update_foreign_input_set_include(this)' %>
|
8
|
+
<%= text_f f, :include, :class => 'foreign_input_set_include', :disabled => (@template.locked? || f.object.include_all?), :help_inline => _("A comma separated list of input names to be included from the foreign template.") %>
|
9
|
+
<%= text_f f, :exclude, :disabled => @template.locked?, :help_inline => _("A comma separated list of input names to be excluded from the foreign template.") %>
|
10
|
+
<% end %>
|
11
|
+
</div>
|
12
|
+
</div>
|
@@ -1,25 +1,24 @@
|
|
1
1
|
<div class="fields">
|
2
2
|
<div class="form-group">
|
3
|
-
<%= field_set_tag
|
4
|
-
|
5
|
-
|
6
|
-
<%=
|
7
|
-
<%= checkbox_f f, :required %>
|
8
|
-
<%= selectable_f f, :input_type, template_input_types_options, {}, :class => 'input_type_selector without_select2' %>
|
3
|
+
<%= field_set_tag template_input_header(f, @template) do %>
|
4
|
+
<%= text_f f, :name, :disabled => @template.locked? %>
|
5
|
+
<%= checkbox_f f, :required, :disabled => @template.locked? %>
|
6
|
+
<%= selectable_f f, :input_type, template_input_types_options, {}, :class => 'input_type_selector without_select2', :disabled => @template.locked? %>
|
9
7
|
<div class="fact_input_type custom_input_type_fields" style="<%= f.object.fact_template_input? ? '' : 'display:none' %>">
|
10
|
-
<%= text_f f, :fact_name, :class => 'fact_input_type', :required => true %>
|
8
|
+
<%= text_f f, :fact_name, :class => 'fact_input_type', :required => true, :disabled => @template.locked? %>
|
11
9
|
</div>
|
12
10
|
<div class="variable_input_type custom_input_type_fields" style="<%= f.object.variable_template_input? ? '' : 'display:none' %>">
|
13
|
-
<%= text_f f, :variable_name, :class => 'variable_input_type', :required => true %>
|
11
|
+
<%= text_f f, :variable_name, :class => 'variable_input_type', :required => true, :disabled => @template.locked? %>
|
14
12
|
</div>
|
15
13
|
<div class="puppet_parameter_input_type custom_input_type_fields" style="<%= f.object.puppet_parameter_template_input? ? '' : 'display:none' %>">
|
16
|
-
<%= text_f f, :puppet_class_name, :class => 'puppet_parameter_input_type', :required => true %>
|
17
|
-
<%= text_f f, :puppet_parameter_name, :class => 'puppet_parameter_input_type', :required => true %>
|
14
|
+
<%= text_f f, :puppet_class_name, :class => 'puppet_parameter_input_type', :required => true, :disabled => @template.locked? %>
|
15
|
+
<%= text_f f, :puppet_parameter_name, :class => 'puppet_parameter_input_type', :required => true, :disabled => @template.locked? %>
|
18
16
|
</div>
|
19
17
|
<div class="user_input_type custom_input_type_fields" style="<%= (f.object.user_template_input? || f.object.new_record?) ? '' : 'display:none' %>">
|
20
|
-
<%= textarea_f f, :options, :rows => 3, :class => 'user_input_type', :help_inline => _("A list of options the user can select from. If not provided, the user will be given a free-form field")
|
18
|
+
<%= textarea_f f, :options, :rows => 3, :class => 'user_input_type', :help_inline => _("A list of options the user can select from. If not provided, the user will be given a free-form field"),
|
19
|
+
:disabled => @template.locked? %>
|
21
20
|
</div>
|
22
|
-
<%= textarea_f f, :description, :rows => 3 %>
|
21
|
+
<%= textarea_f f, :description, :rows => 3, :disabled => @template.locked? %>
|
23
22
|
<% end %>
|
24
23
|
</div>
|
25
24
|
</div>
|
@@ -1,4 +1,4 @@
|
|
1
|
-
<% title _('Detail of %s run') % @template_invocation.job_invocation.
|
1
|
+
<% title _('Detail of %s run') % @template_invocation.job_invocation.job_category %>
|
2
2
|
<% stylesheet 'template_invocation' %>
|
3
3
|
<% javascript 'template_invocation' %>
|
4
4
|
|
@@ -19,7 +19,7 @@
|
|
19
19
|
<%= preview_box(@template_invocation, @host) %>
|
20
20
|
</div>
|
21
21
|
|
22
|
-
<div class="terminal" data-refresh-url="<%= template_invocation_path(@
|
22
|
+
<div class="terminal" data-refresh-url="<%= template_invocation_path(@template_invocation) %>">
|
23
23
|
<% if @error %>
|
24
24
|
<div class="line error"><%= @error %></div>
|
25
25
|
<% else %>
|
@@ -1,9 +1,9 @@
|
|
1
1
|
<%#
|
2
2
|
kind: job_template
|
3
3
|
name: Package Action - SSH Default
|
4
|
-
|
4
|
+
job_category: Packages
|
5
5
|
description_format: "%{action} package(s) %{package}"
|
6
|
-
provider_type:
|
6
|
+
provider_type: SSH
|
7
7
|
template_inputs:
|
8
8
|
- name: pre_script
|
9
9
|
description: A script to run prior to the package action
|
@@ -1,9 +1,9 @@
|
|
1
1
|
<%#
|
2
2
|
kind: job_template
|
3
3
|
name: Puppet Run Once - SSH Default
|
4
|
-
|
5
|
-
description_format: '%{
|
6
|
-
provider_type:
|
4
|
+
job_category: Puppet
|
5
|
+
description_format: '%{job_category} with "%{puppet_options}"'
|
6
|
+
provider_type: SSH
|
7
7
|
template_inputs:
|
8
8
|
- name: puppet_options
|
9
9
|
description: Additional options to pass to puppet
|
@@ -1,9 +1,9 @@
|
|
1
1
|
<%#
|
2
2
|
kind: job_template
|
3
3
|
name: Run Command - SSH Default
|
4
|
-
|
5
|
-
description_format: "
|
6
|
-
provider_type:
|
4
|
+
job_category: Commands
|
5
|
+
description_format: "Run %{command}"
|
6
|
+
provider_type: SSH
|
7
7
|
template_inputs:
|
8
8
|
- name: command
|
9
9
|
description: Command to run on the host
|
@@ -1,9 +1,9 @@
|
|
1
1
|
<%#
|
2
2
|
kind: job_template
|
3
3
|
name: Service Action - SSH Default
|
4
|
-
|
4
|
+
job_category: Services
|
5
5
|
description_format: '%{action} service %{service}'
|
6
|
-
provider_type:
|
6
|
+
provider_type: SSH
|
7
7
|
template_inputs:
|
8
8
|
- name: action
|
9
9
|
description: Action to perform on the service
|
@@ -3,7 +3,7 @@
|
|
3
3
|
name: remote_execution_ssh_keys
|
4
4
|
%>
|
5
5
|
|
6
|
-
<% if
|
6
|
+
<% if !@host.params['remote_execution_ssh_keys'].blank? %>
|
7
7
|
<% ssh_user = @host.params['remote_execution_ssh_user'] || 'root' %>
|
8
8
|
<% ssh_path = "~#{ssh_user}/.ssh" %>
|
9
9
|
|
data/config/routes.rb
CHANGED
@@ -7,9 +7,10 @@ Rails.application.routes.draw do
|
|
7
7
|
post 'preview'
|
8
8
|
end
|
9
9
|
collection do
|
10
|
+
post 'preview'
|
10
11
|
get 'revision'
|
11
12
|
get 'auto_complete_search'
|
12
|
-
get '
|
13
|
+
get 'auto_complete_job_category'
|
13
14
|
end
|
14
15
|
end
|
15
16
|
|
@@ -32,7 +33,7 @@ Rails.application.routes.draw do
|
|
32
33
|
end
|
33
34
|
|
34
35
|
namespace :api, :defaults => {:format => 'json'} do
|
35
|
-
scope
|
36
|
+
scope '(:apiv)', :module => :v2, :defaults => {:apiv => 'v2'}, :apiv => /v1|v2/, :constraints => ApiConstraints.new(:version => 2, :default => true) do
|
36
37
|
resources :job_invocations, :except => [:new, :edit, :update, :destroy] do
|
37
38
|
resources :hosts, :only => :none do
|
38
39
|
get '/', :to => 'job_invocations#output'
|
@@ -49,7 +50,8 @@ Rails.application.routes.draw do
|
|
49
50
|
end
|
50
51
|
|
51
52
|
resources :templates, :only => :none do
|
52
|
-
resources :template_inputs, :only => [:index, :show, :create, :
|
53
|
+
resources :template_inputs, :only => [:index, :show, :create, :destroy, :update]
|
54
|
+
resources :foreign_input_sets, :only => [:index, :show, :create, :destroy, :update]
|
53
55
|
end
|
54
56
|
end
|
55
57
|
end
|
@@ -14,6 +14,6 @@ class CreateTemplateInput < ActiveRecord::Migration
|
|
14
14
|
t.timestamps
|
15
15
|
end
|
16
16
|
|
17
|
-
add_foreign_key :template_inputs, :templates, :name =>
|
17
|
+
add_foreign_key :template_inputs, :templates, :name => 'templates_template_id_fk', :column => 'template_id'
|
18
18
|
end
|
19
19
|
end
|
@@ -8,18 +8,18 @@ class AddTargeting < ActiveRecord::Migration
|
|
8
8
|
t.timestamps
|
9
9
|
end
|
10
10
|
|
11
|
-
add_index :targetings, [:bookmark_id], :name =>
|
12
|
-
add_index :targetings, [:user_id], :name =>
|
13
|
-
add_foreign_key :targetings, :bookmarks, :name =>
|
14
|
-
add_foreign_key :targetings, :users, :name =>
|
11
|
+
add_index :targetings, [:bookmark_id], :name => 'targetings_bookmark_id'
|
12
|
+
add_index :targetings, [:user_id], :name => 'targetings_user_id'
|
13
|
+
add_foreign_key :targetings, :bookmarks, :name => 'targetings_bookmark_id', :column => 'bookmark_id'
|
14
|
+
add_foreign_key :targetings, :users, :name => 'targetings_user_id', :column => 'user_id'
|
15
15
|
|
16
16
|
create_table :targeting_hosts do |t|
|
17
17
|
t.references :host, :null => false
|
18
18
|
t.references :targeting, :null => false
|
19
19
|
end
|
20
20
|
|
21
|
-
add_index :targeting_hosts, [:host_id, :targeting_id], :name =>
|
22
|
-
add_foreign_key :targeting_hosts, :hosts, :name =>
|
23
|
-
add_foreign_key :targeting_hosts, :targetings, :name =>
|
21
|
+
add_index :targeting_hosts, [:host_id, :targeting_id], :name => 'targeting_hosts_host_targeting_ids'
|
22
|
+
add_foreign_key :targeting_hosts, :hosts, :name => 'targeting_hosts_host_id', :column => 'host_id'
|
23
|
+
add_foreign_key :targeting_hosts, :targetings, :name => 'targeting_hosts_targeting_id', :column => 'targeting_id'
|
24
24
|
end
|
25
25
|
end
|
@@ -5,7 +5,7 @@ class AddInvocation< ActiveRecord::Migration
|
|
5
5
|
t.string :job_name, :null => false
|
6
6
|
end
|
7
7
|
|
8
|
-
add_index :job_invocations, [:targeting_id], :name =>
|
9
|
-
add_foreign_key :job_invocations, :targetings, :name =>
|
8
|
+
add_index :job_invocations, [:targeting_id], :name => 'job_invocations_targeting_id'
|
9
|
+
add_foreign_key :job_invocations, :targetings, :name => 'job_invocation_targeting_id', :column => 'targeting_id'
|
10
10
|
end
|
11
11
|
end
|
@@ -5,9 +5,9 @@ class AddTemplateInvocation < ActiveRecord::Migration
|
|
5
5
|
t.references :job_invocation, :null => false
|
6
6
|
end
|
7
7
|
|
8
|
-
add_index :template_invocations, [:template_id, :job_invocation_id], :name =>
|
9
|
-
add_foreign_key :template_invocations, :templates, :name =>
|
10
|
-
add_foreign_key :template_invocations, :job_invocations, :name =>
|
8
|
+
add_index :template_invocations, [:template_id, :job_invocation_id], :name => 'targeting_invocation_template_ji_ids'
|
9
|
+
add_foreign_key :template_invocations, :templates, :name => 'template_invoc_template_id', :column => 'template_id'
|
10
|
+
add_foreign_key :template_invocations, :job_invocations, :name => 'template_invoc_job_invocation_id', :column => 'job_invocation_id'
|
11
11
|
|
12
12
|
create_table :template_invocation_input_values do |t|
|
13
13
|
t.references :template_invocation, :null => false
|
@@ -15,8 +15,8 @@ class AddTemplateInvocation < ActiveRecord::Migration
|
|
15
15
|
t.string :value, :null => false
|
16
16
|
end
|
17
17
|
|
18
|
-
add_index :template_invocation_input_values, [:template_invocation_id, :template_input_id], :name =>
|
19
|
-
add_foreign_key :template_invocation_input_values, :template_invocations, :name =>
|
20
|
-
add_foreign_key :template_invocation_input_values, :template_inputs, :name =>
|
18
|
+
add_index :template_invocation_input_values, [:template_invocation_id, :template_input_id], :name => 'template_invocation_input_values_ti_ti_ids'
|
19
|
+
add_foreign_key :template_invocation_input_values, :template_invocations, :name => 'template_invoc_input_values_template_invoc_id', :column => 'template_invocation_id'
|
20
|
+
add_foreign_key :template_invocation_input_values, :template_inputs, :name => 'template_invoc_input_values_template_input_id', :column => 'template_input_id'
|
21
21
|
end
|
22
22
|
end
|
@@ -1,11 +1,11 @@
|
|
1
1
|
class AddHostIdToTemplateInvocation < ActiveRecord::Migration
|
2
2
|
class FakeTemplateInvocation < ActiveRecord::Base
|
3
|
-
|
3
|
+
self.table_name = 'template_invocations'
|
4
4
|
end
|
5
5
|
|
6
6
|
def up
|
7
7
|
add_column :template_invocations, :host_id, :integer
|
8
|
-
add_foreign_key
|
8
|
+
add_foreign_key 'template_invocations', 'hosts', :name => 'template_invocations_hosts_id_fk', :column => 'host_id'
|
9
9
|
FakeTemplateInvocation.reset_column_information
|
10
10
|
|
11
11
|
say 'Migrating existing execution locks to explicit relations, this may take a while'
|
@@ -23,7 +23,7 @@ class AddHostIdToTemplateInvocation < ActiveRecord::Migration
|
|
23
23
|
end
|
24
24
|
|
25
25
|
def down
|
26
|
-
remove_foreign_key
|
26
|
+
remove_foreign_key 'template_invocations', :name => 'template_invocations_hosts_id_fk'
|
27
27
|
remove_column :template_invocations, :host_id
|
28
28
|
end
|
29
29
|
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
class CreateTemplateInputSets < ActiveRecord::Migration
|
2
|
+
def change
|
3
|
+
create_table :foreign_input_sets do |t|
|
4
|
+
t.integer :template_id, :null => false
|
5
|
+
t.integer :target_template_id, :null => false
|
6
|
+
t.boolean :include_all, :null => false, :default => true
|
7
|
+
t.text :include
|
8
|
+
t.text :exclude
|
9
|
+
end
|
10
|
+
add_index :foreign_input_sets, :template_id
|
11
|
+
add_foreign_key :foreign_input_sets, :templates
|
12
|
+
|
13
|
+
add_index :foreign_input_sets, :target_template_id
|
14
|
+
add_foreign_key :foreign_input_sets, :templates, :column => :target_template_id
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
class UpcaseSshFeature < ActiveRecord::Migration
|
2
|
+
class FakeFeature < ActiveRecord::Base
|
3
|
+
self.table_name = 'features'
|
4
|
+
end
|
5
|
+
|
6
|
+
def up
|
7
|
+
f = FakeFeature.where(:name => 'Ssh').first
|
8
|
+
f.update_attribute :name, 'SSH' if f.present?
|
9
|
+
|
10
|
+
JobTemplate.where(:provider_type => 'Ssh').update_all("provider_type = 'SSH'")
|
11
|
+
end
|
12
|
+
|
13
|
+
def down
|
14
|
+
f = FakeFeature.where(:name => 'SSH').first
|
15
|
+
f.update_attribute :name, 'Ssh' if f.present?
|
16
|
+
|
17
|
+
JobTemplate.where(:provider_type => 'SSH').update_all("provider_type = 'Ssh'")
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,6 @@
|
|
1
|
+
class AddRunHostJobTaskIdToTemplateInvocation < ActiveRecord::Migration
|
2
|
+
def change
|
3
|
+
add_column :template_invocations, :run_host_job_task_id, :string
|
4
|
+
add_index :template_invocations, [:run_host_job_task_id], :name => 'template_invocations_run_host_job_task_id'
|
5
|
+
end
|
6
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
class ExpandAllTemplateInvocations < ActiveRecord::Migration
|
2
|
+
class FakeTemplateInvocation < ActiveRecord::Base
|
3
|
+
self.table_name = 'template_invocations'
|
4
|
+
|
5
|
+
has_many :input_values, :class_name => 'FakeInputValue', :foreign_key => 'template_invocation_id'
|
6
|
+
end
|
7
|
+
|
8
|
+
class FakeInputValue < ActiveRecord::Base
|
9
|
+
self.table_name = 'template_invocation_input_values'
|
10
|
+
end
|
11
|
+
|
12
|
+
def up
|
13
|
+
# make all template invocations pattern
|
14
|
+
FakeTemplateInvocation.update_all 'host_id = NULL'
|
15
|
+
|
16
|
+
# expand all pattern template invocations and link RunHostJob
|
17
|
+
JobInvocation.joins(:targeting).where("#{Targeting.table_name}.resolved_at IS NOT NULL").includes([ :pattern_template_invocations, :targeting, :sub_tasks => :locks ]).each do |job_invocation|
|
18
|
+
job_invocation.pattern_template_invocations.each do |pattern_template_invocation|
|
19
|
+
job_invocation.targeting.hosts.each do |host|
|
20
|
+
task = job_invocation.sub_tasks.find do |sub_task|
|
21
|
+
sub_task.locks.find { |lock| lock.resource_type == 'Host::Managed' && lock.resource_id == host.id && lock.name == 'link_resource'}.present?
|
22
|
+
end
|
23
|
+
next if task.nil? # job invocations with static targeting that failed too early
|
24
|
+
|
25
|
+
expanded_template_invocation = FakeTemplateInvocation.new
|
26
|
+
expanded_template_invocation.attributes = pattern_template_invocation.dup.attributes
|
27
|
+
pattern_template_invocation.input_values.each do |input_value|
|
28
|
+
input_value = input_value.dup
|
29
|
+
expanded_template_invocation.input_values.build(input_value.attributes.except('template_invocation_id'))
|
30
|
+
end
|
31
|
+
expanded_template_invocation.host_id = host.id
|
32
|
+
expanded_template_invocation.run_host_job_task_id = task.id
|
33
|
+
expanded_template_invocation.save!
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def down
|
40
|
+
# we can't determine the last host for pattern, but keeping template invocations as pattern is safe
|
41
|
+
JobInvocation.joins(:targeting).where("#{Targeting.table_name}.resolved_at IS NOT NULL").includes(:template_invocations).each do |job_invocation|
|
42
|
+
job_invocation.template_invocations.delete_all
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|