foreman_remote_execution 0.1.2 → 0.2.1
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/.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
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: fdc605ffe45ecda6a6b4689598d5a445884f023a
|
|
4
|
+
data.tar.gz: 44a2f051b425edf500e4aca917c835484a5b7af3
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 8d8cda76fef2487397ca8a59433b5ef526c04b5a44ebe6604cf2c9b12b21f05d28a32d2d313cf72eb13cca83b2f05809839099847f68b0a6f750dd85168312e1
|
|
7
|
+
data.tar.gz: f142c1067294ff125544b699528d24f4036ebc2d748d817ccf6b43428a22e0f8880fca4dea57d27d04b7651a9088480c69df559c755b81453d0490fedc31a034
|
data/.rubocop.yml
CHANGED
data/.rubocop_todo.yml
CHANGED
|
@@ -195,12 +195,6 @@ Style/SpaceInsideBrackets:
|
|
|
195
195
|
Style/SpaceInsideHashLiteralBraces:
|
|
196
196
|
Enabled: false
|
|
197
197
|
|
|
198
|
-
# Offense count: 19
|
|
199
|
-
# Cop supports --auto-correct.
|
|
200
|
-
# Configuration parameters: EnforcedStyle, SupportedStyles.
|
|
201
|
-
Style/StringLiterals:
|
|
202
|
-
Enabled: false
|
|
203
|
-
|
|
204
198
|
# Offense count: 1
|
|
205
199
|
# Cop supports --auto-correct.
|
|
206
200
|
# Configuration parameters: IgnoredMethods.
|
|
@@ -7,3 +7,8 @@ function update_visibility_after_input_type_change(select){
|
|
|
7
7
|
fieldset.find('div.custom_input_type_fields').hide();
|
|
8
8
|
fieldset.find('div.' + select.val() + '_input_type').show();
|
|
9
9
|
}
|
|
10
|
+
|
|
11
|
+
function update_foreign_input_set_include(include_all_checkbox) {
|
|
12
|
+
fieldset = $(include_all_checkbox.closest('fieldset'));
|
|
13
|
+
fieldset.find('input.foreign_input_set_include').prop('disabled', include_all_checkbox.checked);
|
|
14
|
+
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
$(function() { job_invocation_form_binds() });
|
|
2
2
|
|
|
3
|
-
function refresh_execution_form() {
|
|
3
|
+
function refresh_execution_form(perform_description_reset) {
|
|
4
4
|
var form = $('form#job_invocation_form');
|
|
5
5
|
var data = form.serializeArray();
|
|
6
6
|
|
|
@@ -15,6 +15,11 @@ function refresh_execution_form() {
|
|
|
15
15
|
password_caps_lock_hint();
|
|
16
16
|
form.find('a[rel="popover-modal"]').popover({html: true});
|
|
17
17
|
form.find('select').select2({allowClear: true});
|
|
18
|
+
if(perform_description_reset == true) {
|
|
19
|
+
var fieldset = $('fieldset#job_template_' + $('select.job_template_selector').val());
|
|
20
|
+
reset_description(fieldset);
|
|
21
|
+
}
|
|
22
|
+
template_change($('select.job_template_selector'));
|
|
18
23
|
job_invocation_form_binds();
|
|
19
24
|
});
|
|
20
25
|
}
|
|
@@ -52,13 +57,15 @@ function close_preview_hosts_modal() {
|
|
|
52
57
|
}
|
|
53
58
|
|
|
54
59
|
function job_invocation_form_binds() {
|
|
55
|
-
$('
|
|
56
|
-
|
|
57
|
-
$(
|
|
60
|
+
$('select.job_template_selector').on('click', function () {
|
|
61
|
+
provider_fieldset = $('#provider_' + $(this).data('providerType'));
|
|
62
|
+
$(provider_fieldset).find('fieldset.job_template_form').hide();
|
|
58
63
|
$('#job_template_' + $(this).val()).show();
|
|
59
64
|
});
|
|
60
65
|
|
|
61
|
-
$('select#
|
|
66
|
+
$('select#job_invocation_job_category').on('change', function() {
|
|
67
|
+
refresh_execution_form(true);
|
|
68
|
+
});
|
|
62
69
|
|
|
63
70
|
$('button#refresh_execution_form').on('click', refresh_execution_form);
|
|
64
71
|
|
|
@@ -85,8 +92,8 @@ function delayed_refresh(url, data){
|
|
|
85
92
|
function job_invocation_refresh_data(){
|
|
86
93
|
return {
|
|
87
94
|
hosts_needs_refresh: $("div#hosts").data('refresh_required'),
|
|
95
|
+
host_ids_needing_name_update: fetch_ids_of_hosts('name'),
|
|
88
96
|
host_ids_needing_status_update: fetch_ids_of_hosts('status'),
|
|
89
|
-
host_ids_needing_provider_update: fetch_ids_of_hosts('provider'),
|
|
90
97
|
host_ids_needing_actions_update: fetch_ids_of_hosts('actions')
|
|
91
98
|
}
|
|
92
99
|
}
|
|
@@ -98,26 +105,27 @@ function fetch_ids_of_hosts(attribute){
|
|
|
98
105
|
function regenerate_description(thing) {
|
|
99
106
|
var fieldset = $(thing).closest('fieldset');
|
|
100
107
|
var dict = load_keys(fieldset);
|
|
101
|
-
var format = fieldset.find('
|
|
102
|
-
fieldset.find('
|
|
108
|
+
var format = fieldset.find('.description_format').val();
|
|
109
|
+
fieldset.find('.description').val(String.format(format, dict));
|
|
103
110
|
}
|
|
104
111
|
|
|
105
112
|
function load_keys(parent) {
|
|
106
113
|
var dict = {};
|
|
107
|
-
var pattern = $(parent).find("
|
|
114
|
+
var pattern = $(parent).find(".description_format").val();
|
|
108
115
|
var re = new RegExp("%\\{([^\\}]+)\\}", "gm");
|
|
109
116
|
var match = re.exec(pattern);
|
|
110
117
|
while(match != null) {
|
|
111
118
|
dict[match[1]] = $(parent).find("#" + match[1]).val();
|
|
112
119
|
match = re.exec(pattern);
|
|
113
120
|
}
|
|
114
|
-
dict['
|
|
121
|
+
dict['job_category'] = $('#job_invocation_job_category').val();
|
|
122
|
+
dict['template_name'] = $('.job_template_selector:visible span.select2-chosen').html();
|
|
115
123
|
return dict;
|
|
116
124
|
}
|
|
117
125
|
|
|
118
126
|
function description_override(source) {
|
|
119
|
-
var description_format_container = $(source).closest('fieldset').find('
|
|
120
|
-
var description_format = $(description_format_container).find('
|
|
127
|
+
var description_format_container = $(source).closest('fieldset').find('.description_format_container');
|
|
128
|
+
var description_format = $(description_format_container).find('.description_format');
|
|
121
129
|
var old_value = $(source).val();
|
|
122
130
|
if($(source).is(':checked')) {
|
|
123
131
|
$(description_format_container).hide();
|
|
@@ -129,6 +137,30 @@ function description_override(source) {
|
|
|
129
137
|
regenerate_description(description_format);
|
|
130
138
|
}
|
|
131
139
|
|
|
140
|
+
function template_change(source) {
|
|
141
|
+
var template_forms = $('fieldset.job_template_form');
|
|
142
|
+
for(i = 0; i < template_forms.length; i++) {
|
|
143
|
+
set_description_disable(template_forms[i], true);
|
|
144
|
+
}
|
|
145
|
+
var id = $(source).val();
|
|
146
|
+
var template_fieldset = $(source).closest('form').find('fieldset#job_template_' + id);
|
|
147
|
+
set_description_disable(template_fieldset, false);
|
|
148
|
+
regenerate_description(template_fieldset.find('.description'));
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
function set_description_disable(thing, value) {
|
|
152
|
+
$(thing).find('.description').prop('disabled', value);
|
|
153
|
+
$(thing).find('.description_format').prop('disabled', value);
|
|
154
|
+
$(thing).find('.description_format_override').prop('disabled', value);
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
function reset_description(fieldset) {
|
|
158
|
+
var checkbox = $(fieldset).find('.description_format_override');
|
|
159
|
+
$(fieldset).find('.description_format').val($(checkbox).val());
|
|
160
|
+
$(checkbox).prop('checked', true);
|
|
161
|
+
$(fieldset).find('.description_format_container').hide();
|
|
162
|
+
}
|
|
163
|
+
|
|
132
164
|
String.format = function (pattern, dict) {
|
|
133
165
|
if(pattern == undefined) {
|
|
134
166
|
return "";
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
module Api
|
|
2
|
+
module V2
|
|
3
|
+
class ForeignInputSetsController < ::Api::V2::BaseController
|
|
4
|
+
include ::Api::Version2
|
|
5
|
+
include ::Foreman::Renderer
|
|
6
|
+
|
|
7
|
+
before_filter :find_required_nested_object
|
|
8
|
+
before_filter :find_resource, :only => %w{show update destroy}
|
|
9
|
+
|
|
10
|
+
api :GET, '/templates/:template_id/foreign_input_sets', N_('List foreign input sets')
|
|
11
|
+
param :template_id, :identifier, :required => true
|
|
12
|
+
param_group :search_and_pagination, ::Api::V2::BaseController
|
|
13
|
+
def index
|
|
14
|
+
@foreign_input_sets = nested_obj.foreign_input_sets.search_for(*search_options).paginate(paginate_options)
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
api :GET, '/templates/:template_id/foreign_input_sets/:id', N_('Show foreign input set details')
|
|
18
|
+
param :template_id, :identifier, :required => true
|
|
19
|
+
param :id, :identifier, :required => true
|
|
20
|
+
def show
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def_param_group :foreign_input_set do
|
|
24
|
+
param :foreign_input_set, Hash, :required => true, :action_aware => true do
|
|
25
|
+
param :target_template_id, :identifier, :required => true, :desc => N_('Target template id')
|
|
26
|
+
param :include_all, :bool, :desc => N_('Include all inputs form the foreign template')
|
|
27
|
+
param :include, String, :desc => N_('A comma separated list of input names to be included from the foreign template.')
|
|
28
|
+
param :exclude, String, :desc => N_('A comma separated list of input names to be included from the foreign template.')
|
|
29
|
+
param :description, String, :required => false, :desc => N_('Input set description')
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
api :POST, '/templates/:template_id/foreign_input_sets/', N_('Create a foreign input set')
|
|
34
|
+
param :template_id, :identifier, :required => true
|
|
35
|
+
param_group :foreign_input_set, :as => :create
|
|
36
|
+
def create
|
|
37
|
+
@foreign_input_set = resource_class.new(params[:foreign_input_set].merge(:template_id => @nested_obj.id))
|
|
38
|
+
process_response @foreign_input_set.save
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
api :DELETE, '/templates/:template_id/foreign_input_sets/:id', N_('Delete a foreign input set')
|
|
42
|
+
param :template_id, :identifier, :required => true
|
|
43
|
+
param :id, :identifier, :required => true
|
|
44
|
+
def destroy
|
|
45
|
+
process_response @foreign_input_set.destroy
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
api :PUT, '/templates/:template_id/foreign_input_sets/:id', N_('Update a foreign input set')
|
|
49
|
+
param :template_id, :identifier, :required => true
|
|
50
|
+
param :id, :identifier, :required => true
|
|
51
|
+
param_group :foreign_input_set
|
|
52
|
+
def update
|
|
53
|
+
process_response @foreign_input_set.update_attributes(params[:foreign_input_set])
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def resource_name(nested_resource = nil)
|
|
57
|
+
nested_resource || 'foreign_input_set'
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def controller_permission
|
|
61
|
+
'templates'
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def action_permission
|
|
65
|
+
case params[:action]
|
|
66
|
+
when :create, :edit, :destroy
|
|
67
|
+
'edit'
|
|
68
|
+
else
|
|
69
|
+
super
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
private
|
|
74
|
+
|
|
75
|
+
def resource_class
|
|
76
|
+
ForeignInputSet
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
end
|
|
@@ -12,44 +12,58 @@ module Api
|
|
|
12
12
|
|
|
13
13
|
wrap_parameters JobInvocation, :include => (JobInvocation.attribute_names + [:ssh])
|
|
14
14
|
|
|
15
|
-
api :GET,
|
|
15
|
+
api :GET, '/job_invocations/', N_('List job invocations')
|
|
16
16
|
param_group :search_and_pagination, ::Api::V2::BaseController
|
|
17
17
|
def index
|
|
18
18
|
@job_invocations = resource_scope_for_index
|
|
19
19
|
end
|
|
20
20
|
|
|
21
|
-
api :GET,
|
|
21
|
+
api :GET, '/job_invocations/:id', N_('Show job invocation')
|
|
22
22
|
param :id, :identifier, :required => true
|
|
23
23
|
def show
|
|
24
24
|
end
|
|
25
25
|
|
|
26
26
|
def_param_group :job_invocation do
|
|
27
27
|
param :job_invocation, Hash, :required => true, :action_aware => true do
|
|
28
|
-
param :
|
|
29
|
-
param :job_template_id, String, :required => false, :desc => N_(
|
|
30
|
-
param :targeting_type, String, :required => true, :desc => N_(
|
|
31
|
-
param :inputs, Hash, :required => false, :desc => N_(
|
|
32
|
-
param :ssh, Hash, :desc => N_(
|
|
28
|
+
param :job_category, String, :required => true, :desc => N_('Job category')
|
|
29
|
+
param :job_template_id, String, :required => false, :desc => N_('If using a specific template, the id of that template.')
|
|
30
|
+
param :targeting_type, String, :required => true, :desc => N_('Invocation type, one of %s') % Targeting::TYPES
|
|
31
|
+
param :inputs, Hash, :required => false, :desc => N_('Inputs to use')
|
|
32
|
+
param :ssh, Hash, :desc => N_('SSH provider specific options') do
|
|
33
33
|
param :effective_user, String,
|
|
34
34
|
:required => false,
|
|
35
|
-
:desc => N_(
|
|
35
|
+
:desc => N_('What user should be used to run the script (using sudo-like mechanisms). Defaults to a template parameter or global setting.')
|
|
36
36
|
end
|
|
37
|
+
|
|
38
|
+
param :recurrence, Hash, :desc => N_('Create a recurring job') do
|
|
39
|
+
param :cron_line, String, :required => false, :desc => N_('How often the job should occur, in the cron format')
|
|
40
|
+
param :max_iteration, :number, :required => false, :desc => N_('Repeat a maximum of N times')
|
|
41
|
+
param :end_time, DateTime, :required => false, :desc => N_('Perform no more executions after this time')
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
param :scheduling, Hash, :desc => N_('Schedule the job to start at a later time') do
|
|
45
|
+
param :start_at, DateTime, :required => false, :desc => N_('Schedule the job for a future time')
|
|
46
|
+
param :start_before, DateTime, :required => false, :desc => N_('Indicates that the action should be cancelled if it cannot be started before this time.')
|
|
47
|
+
end
|
|
48
|
+
|
|
37
49
|
param :bookmark_id, Integer, :required => false
|
|
38
50
|
param :search_query, Integer, :required => false
|
|
51
|
+
param :description_format, String, :required => false, :desc => N_('Override the description format from the template for this invocation only')
|
|
39
52
|
end
|
|
40
53
|
end
|
|
41
54
|
|
|
42
|
-
api :POST,
|
|
55
|
+
api :POST, '/job_invocations/', N_('Create a job invocation')
|
|
43
56
|
param_group :job_invocation, :as => :create
|
|
44
57
|
def create
|
|
45
58
|
composer = JobInvocationComposer.from_api_params(job_invocation_params)
|
|
46
59
|
composer.save!
|
|
47
|
-
ForemanTasks.async_task(::Actions::RemoteExecution::RunHostsJob, composer.job_invocation)
|
|
48
60
|
@job_invocation = composer.job_invocation
|
|
61
|
+
@job_invocation.generate_description! if @job_invocation.description.blank?
|
|
62
|
+
composer.triggering.trigger(::Actions::RemoteExecution::RunHostsJob, @job_invocation)
|
|
49
63
|
process_response @job_invocation
|
|
50
64
|
end
|
|
51
65
|
|
|
52
|
-
api :GET,
|
|
66
|
+
api :GET, '/job_invocations/:id/hosts/:host_id', N_('Get output for a host')
|
|
53
67
|
param :id, :identifier, :required => true
|
|
54
68
|
param :host_id, :identifier, :required => true
|
|
55
69
|
param :since, String, :required => false
|
|
@@ -90,13 +104,13 @@ module Api
|
|
|
90
104
|
if job_invocation_params[:job_template_id]
|
|
91
105
|
templates << JobTemplate.find(job_invocation_params[:job_template_id])
|
|
92
106
|
else
|
|
93
|
-
templates = JobTemplate.where(:
|
|
107
|
+
templates = JobTemplate.where(:job_category => job_invocation_params[:job_category])
|
|
94
108
|
if templates.pluck(:provider_type).uniq.length != templates.length
|
|
95
|
-
raise Foreman::Exception, _(
|
|
109
|
+
raise Foreman::Exception, _('Duplicate remote execution providers found for specified Job, please specify a single job_template_id.')
|
|
96
110
|
end
|
|
97
111
|
end
|
|
98
112
|
|
|
99
|
-
raise Foreman::Exception, _(
|
|
113
|
+
raise Foreman::Exception, _('No templates associated with specified Job Name') if templates.empty?
|
|
100
114
|
end
|
|
101
115
|
|
|
102
116
|
def job_invocation_params
|
|
@@ -13,62 +13,66 @@ module Api
|
|
|
13
13
|
|
|
14
14
|
wrap_parameters JobTemplate, :include => (JobTemplate.attribute_names + [:ssh])
|
|
15
15
|
|
|
16
|
-
api :GET,
|
|
17
|
-
api :GET,
|
|
18
|
-
api :GET,
|
|
16
|
+
api :GET, '/job_templates/', N_('List job templates')
|
|
17
|
+
api :GET, '/locations/:location_id/job_templates/', N_('List job templates per location')
|
|
18
|
+
api :GET, '/organizations/:organization_id/job_templates/', N_('List job templates per organization')
|
|
19
19
|
param_group :taxonomy_scope, ::Api::V2::BaseController
|
|
20
20
|
param_group :search_and_pagination, ::Api::V2::BaseController
|
|
21
21
|
def index
|
|
22
22
|
@job_templates = resource_scope_for_index
|
|
23
23
|
end
|
|
24
24
|
|
|
25
|
-
api :GET,
|
|
25
|
+
api :GET, '/job_templates/:id', N_('Show job template details')
|
|
26
26
|
param :id, :identifier, :required => true
|
|
27
27
|
def show
|
|
28
28
|
end
|
|
29
29
|
|
|
30
30
|
def_param_group :job_template do
|
|
31
31
|
param :job_template, Hash, :required => true, :action_aware => true do
|
|
32
|
-
param :name, String, :required => true, :desc => N_(
|
|
33
|
-
param :
|
|
32
|
+
param :name, String, :required => true, :desc => N_('Template name')
|
|
33
|
+
param :job_category, String, :required => true, :desc => N_('Job category')
|
|
34
|
+
param :description_format, String, :required => false, :desc => N_('This template is used to generate the description. ' +
|
|
35
|
+
'Input values can be used using the syntax %{package}. ' +
|
|
36
|
+
'You may also include the job category and template ' +
|
|
37
|
+
'name using %{job_category} and %{template_name}.')
|
|
34
38
|
param :template, String, :required => true
|
|
35
|
-
param :provider_type, RemoteExecutionProvider.provider_names, :required => true, :desc => N_(
|
|
39
|
+
param :provider_type, RemoteExecutionProvider.provider_names, :required => true, :desc => N_('Provider type')
|
|
36
40
|
param :snippet, :bool, :allow_nil => true
|
|
37
41
|
param :audit_comment, String, :allow_nil => true
|
|
38
|
-
param :locked, :bool, :desc => N_(
|
|
39
|
-
param :ssh, Hash, :desc => N_(
|
|
40
|
-
param :effective_user, Hash, :desc => N_(
|
|
41
|
-
param :value, String, :desc => N_(
|
|
42
|
-
param :overridable, :bool, :desc => N_(
|
|
43
|
-
param :current_user, :bool, :desc => N_(
|
|
42
|
+
param :locked, :bool, :desc => N_('Whether or not the template is locked for editing')
|
|
43
|
+
param :ssh, Hash, :desc => N_('SSH provider specific options') do
|
|
44
|
+
param :effective_user, Hash, :desc => N_('Effective user options') do
|
|
45
|
+
param :value, String, :desc => N_('What user should be used to run the script (using sudo-like mechanisms)'), :allowed_nil => true
|
|
46
|
+
param :overridable, :bool, :desc => N_('Whether it should be allowed to override the effective user from the invocation form.')
|
|
47
|
+
param :current_user, :bool, :desc => N_('Whether the current user login should be used as the effective user')
|
|
44
48
|
end
|
|
45
49
|
end
|
|
46
50
|
param_group :taxonomies, ::Api::V2::BaseController
|
|
47
51
|
end
|
|
48
52
|
end
|
|
49
53
|
|
|
50
|
-
api :POST,
|
|
54
|
+
api :POST, '/job_templates/', N_('Create a job template')
|
|
51
55
|
param_group :job_template, :as => :create
|
|
52
56
|
def create
|
|
53
57
|
@job_template = JobTemplate.new(job_template_params)
|
|
54
58
|
process_response @job_template.save
|
|
55
59
|
end
|
|
56
60
|
|
|
57
|
-
api :PUT,
|
|
61
|
+
api :PUT, '/job_templates/:id', N_('Update a job template')
|
|
58
62
|
param :id, :identifier, :required => true
|
|
59
63
|
param_group :job_template
|
|
60
64
|
def update
|
|
61
65
|
process_response @job_template.update_attributes(job_template_params)
|
|
62
66
|
end
|
|
63
67
|
|
|
64
|
-
api :GET,
|
|
65
|
-
param :version, String, :desc => N_(
|
|
68
|
+
api :GET, '/job_templates/revision'
|
|
69
|
+
param :version, String, :desc => N_('Template version')
|
|
66
70
|
def revision
|
|
67
71
|
audit = Audit.authorized(:view_audit_logs).find(params[:version])
|
|
68
72
|
render :json => audit.revision.template
|
|
69
73
|
end
|
|
70
74
|
|
|
71
|
-
api :DELETE,
|
|
75
|
+
api :DELETE, '/job_templates/:id', N_('Delete a job template')
|
|
72
76
|
param :id, :identifier, :required => true
|
|
73
77
|
def destroy
|
|
74
78
|
process_response @job_template.destroy
|
|
@@ -76,11 +80,11 @@ module Api
|
|
|
76
80
|
|
|
77
81
|
def_param_group :job_template_clone do
|
|
78
82
|
param :job_template, Hash, :required => true, :action_aware => true do
|
|
79
|
-
param :name, String, :required => true, :desc => N_(
|
|
83
|
+
param :name, String, :required => true, :desc => N_('Template name')
|
|
80
84
|
end
|
|
81
85
|
end
|
|
82
86
|
|
|
83
|
-
api :POST,
|
|
87
|
+
api :POST, '/job_templates/:id/clone', N_('Clone a provision template')
|
|
84
88
|
param :id, :identifier, :required => true
|
|
85
89
|
param_group :job_template_clone, :as => :create
|
|
86
90
|
def clone
|
|
@@ -5,17 +5,17 @@ module Api
|
|
|
5
5
|
include ::Foreman::Renderer
|
|
6
6
|
|
|
7
7
|
before_filter :find_required_nested_object
|
|
8
|
-
before_filter :find_resource, :only => %w{show update destroy
|
|
8
|
+
before_filter :find_resource, :only => %w{show update destroy}
|
|
9
9
|
before_filter :normalize_options, :only => %w{create update}
|
|
10
10
|
|
|
11
|
-
api :GET,
|
|
11
|
+
api :GET, '/templates/:template_id/template_inputs', N_('List template inputs')
|
|
12
12
|
param :template_id, :identifier, :required => true
|
|
13
13
|
param_group :search_and_pagination, ::Api::V2::BaseController
|
|
14
14
|
def index
|
|
15
15
|
@template_inputs = nested_obj.template_inputs.search_for(*search_options).paginate(paginate_options)
|
|
16
16
|
end
|
|
17
17
|
|
|
18
|
-
api :GET,
|
|
18
|
+
api :GET, '/templates/:template_id/template_inputs/:id', N_('Show template input details')
|
|
19
19
|
param :template_id, :identifier, :required => true
|
|
20
20
|
param :id, :identifier, :required => true
|
|
21
21
|
def show
|
|
@@ -24,30 +24,33 @@ module Api
|
|
|
24
24
|
def_param_group :template_input do
|
|
25
25
|
param :template_input, Hash, :required => true, :action_aware => true do
|
|
26
26
|
param :name, String, :required => true, :desc => N_('Input name')
|
|
27
|
+
param :description, String, :required => false, :desc => N_('Input description')
|
|
28
|
+
param :required, :bool, :allow_nil => true, :desc => N_('Input is required')
|
|
27
29
|
param :input_type, TemplateInput::TYPES.keys.map(&:to_s), :required => true, :desc => N_('Input type')
|
|
28
30
|
param :fact_name, String, :required => false, :desc => N_('Fact name, used when input type is fact')
|
|
29
31
|
param :variable_name, String, :required => false, :desc => N_('Variable name, used when input type is variable')
|
|
32
|
+
param :puppet_parameter_class, String, :required => false, :desc => N_('Puppet class name, used when input type is puppet_parameter')
|
|
30
33
|
param :puppet_parameter_name, String, :required => false, :desc => N_('Puppet parameter name, used when input type is puppet_parameter')
|
|
31
34
|
param :options, Array, :required => false, :desc => N_('Selectable values for user inputs')
|
|
32
35
|
end
|
|
33
36
|
end
|
|
34
37
|
|
|
35
|
-
api :POST,
|
|
38
|
+
api :POST, '/templates/:template_id/template_inputs/', N_('Create a template input')
|
|
36
39
|
param :template_id, :identifier, :required => true
|
|
37
40
|
param_group :template_input, :as => :create
|
|
38
41
|
def create
|
|
39
|
-
@template_input =
|
|
42
|
+
@template_input = resource_class.new(params[:template_input].merge(:template_id => @nested_obj.id))
|
|
40
43
|
process_response @template_input.save
|
|
41
44
|
end
|
|
42
45
|
|
|
43
|
-
api :DELETE,
|
|
46
|
+
api :DELETE, '/templates/:template_id/template_inputs/:id', N_('Delete a template input')
|
|
44
47
|
param :template_id, :identifier, :required => true
|
|
45
48
|
param :id, :identifier, :required => true
|
|
46
49
|
def destroy
|
|
47
50
|
process_response @template_input.destroy
|
|
48
51
|
end
|
|
49
52
|
|
|
50
|
-
api :PUT,
|
|
53
|
+
api :PUT, '/templates/:template_id/template_inputs/:id', N_('Update a template input')
|
|
51
54
|
param :template_id, :identifier, :required => true
|
|
52
55
|
param :id, :identifier, :required => true
|
|
53
56
|
param_group :template_input
|