foreman_ansible 10.0.0 → 10.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/graphql/types/ansible_variable_override.rb +1 -1
- data/app/helpers/foreman_ansible/smart_proxies_helper.rb +38 -0
- data/app/views/foreman/smart_proxies/_update_smart_proxy.html.erb +1 -0
- data/app/views/foreman_ansible/job_templates/capsule_upgrade_-_ansible_default.erb +39 -3
- data/db/migrate/20221031114720_rename_capsule_upgrade_playbook.rb +21 -0
- data/lib/foreman_ansible/register.rb +14 -1
- data/lib/foreman_ansible/version.rb +1 -1
- data/test/graphql/mutations/hosts/assign_ansible_roles_mutation_test.rb +7 -7
- data/test/graphql/queries/host_ansible_roles_query_test.rb +11 -8
- data/test/unit/ansible_provider_test.rb +3 -6
- data/test/unit/concerns/host_managed_extensions_test.rb +6 -6
- data/test/unit/concerns/hostgroup_extensions_test.rb +8 -8
- data/webpack/components/AnsibleHostDetail/components/AnsibleVariableOverrides/AnsibleVariableOverridesTableHelper.js +1 -0
- data/webpack/components/AnsibleHostDetail/components/AnsibleVariableOverrides/EditableValue.js +4 -2
- data/webpack/components/AnsibleHostDetail/components/JobsTab/NewRecurringJobHelper.js +4 -4
- data/webpack/components/AnsibleHostDetail/components/JobsTab/NewRecurringJobModal.js +30 -4
- data/webpack/components/AnsibleHostDetail/components/JobsTab/NewRecurringJobModal.scss +9 -2
- data/webpack/components/AnsibleHostDetail/components/RolesTab/AllRolesModal/index.js +1 -1
- data/webpack/components/AnsibleHostDetail/components/RolesTab/EditRolesModal/index.js +1 -1
- metadata +14 -15
- data/test/unit/actions/run_ansible_job_test.rb +0 -0
- data/test/unit/actions/run_proxy_ansible_command_test.rb +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f66c95bc367d1265d1be106e25a63a8fcfae2b95fd8d209f683c260c8d0d3647
|
4
|
+
data.tar.gz: cfad57982a9e2cf39324caf14f656df50148cd451dba92e963cbd54dd22a8875
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 340ab3cb55ecc5c54eb76f483e5e6b24e677831488dad250fd4c4b58ac33f37c7cdd27445246a95594d5f17db091e2df3445f3266c97dbd26dba34ecc88879ab
|
7
|
+
data.tar.gz: f50cb95108f5809cc30b8fdb6627b041d3261949c98fe15e149cef799e5e98ddea3955b39d642de6f1625817ce5e2e1e7e3314b3e59c6e6cb7788e8c59ad0fe3
|
@@ -0,0 +1,38 @@
|
|
1
|
+
module ForemanAnsible
|
2
|
+
module SmartProxiesHelper
|
3
|
+
def can_update_proxy?(proxy)
|
4
|
+
hosts = proxy.smart_proxy_hosts
|
5
|
+
|
6
|
+
return if !can_schedule_jobs? ||
|
7
|
+
hosts.empty? ||
|
8
|
+
!hosts.all? { |host| can_execute_on_host?(host) }
|
9
|
+
|
10
|
+
begin
|
11
|
+
version = proxy.statuses[:version].version
|
12
|
+
rescue Foreman::Exception
|
13
|
+
return false
|
14
|
+
end
|
15
|
+
|
16
|
+
foreman_version = Foreman::Version.new
|
17
|
+
proxy_version = Foreman::Version.new(version['version'])
|
18
|
+
|
19
|
+
foreman_major = foreman_version.major.to_i
|
20
|
+
foreman_minor = foreman_version.minor.to_i
|
21
|
+
|
22
|
+
proxy_major = proxy_version.major.to_i
|
23
|
+
proxy_minor = proxy_version.minor.to_i
|
24
|
+
|
25
|
+
foreman_major > proxy_major ||
|
26
|
+
(foreman_major == proxy_major && foreman_minor > proxy_minor)
|
27
|
+
end
|
28
|
+
|
29
|
+
def proxy_update_button(proxy)
|
30
|
+
feature = RemoteExecutionFeature.feature(:ansible_run_capsule_upgrade)
|
31
|
+
return if feature.nil?
|
32
|
+
|
33
|
+
path = new_job_invocation_path(:host_ids => proxy.infrastructure_host_facets.pluck(:host_id),
|
34
|
+
:feature => feature.label)
|
35
|
+
link_to(_('Upgrade'), path)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
<%= proxy_update_button(subject) %>
|
@@ -1,9 +1,9 @@
|
|
1
1
|
<%#
|
2
|
-
name:
|
2
|
+
name: Smart Proxy Upgrade Playbook
|
3
3
|
snippet: false
|
4
4
|
template_inputs:
|
5
5
|
- name: target_version
|
6
|
-
required:
|
6
|
+
required: false
|
7
7
|
input_type: user
|
8
8
|
advanced: false
|
9
9
|
value_type: plain
|
@@ -24,6 +24,9 @@ feature: ansible_run_capsule_upgrade
|
|
24
24
|
|
25
25
|
---
|
26
26
|
- hosts: all
|
27
|
+
vars:
|
28
|
+
target_version: "<%= input('target_version').present? ? input('target_version') : product_short_version %>"
|
29
|
+
<% if plugin_present?('foreman_theme_satellite') -%>
|
27
30
|
tasks:
|
28
31
|
- name: Gather the rpm package facts
|
29
32
|
package_facts:
|
@@ -44,7 +47,7 @@ feature: ansible_run_capsule_upgrade
|
|
44
47
|
"--whitelist=#{input('whitelist_options')}"
|
45
48
|
end -%>
|
46
49
|
- name: Upgrade Capsule server using satellite-maintain
|
47
|
-
shell: satellite-maintain upgrade run --assumeyes --target-version
|
50
|
+
shell: satellite-maintain upgrade run --assumeyes --target-version={{ target_version }} <%= whitelist_option %>
|
48
51
|
register: result
|
49
52
|
|
50
53
|
- name: Re-Gather the rpm package facts after the upgrade
|
@@ -71,3 +74,36 @@ feature: ansible_run_capsule_upgrade
|
|
71
74
|
- name: satellite-maintain upgrade return code is non-zero
|
72
75
|
fail:
|
73
76
|
msg: "Failed! Capsule server upgrade failed. See /var/log/foreman-installer/capsule.log in the Capsule server for more information"
|
77
|
+
<% else -%>
|
78
|
+
tasks:
|
79
|
+
- name: Gather the rpm package facts
|
80
|
+
package_facts:
|
81
|
+
manager: auto
|
82
|
+
|
83
|
+
- name: Fail if the target server is a Foreman server
|
84
|
+
fail:
|
85
|
+
msg: "This playbook cannot be executed on a Foreman server. Use only on a Smart Proxy server."
|
86
|
+
when: "'foreman' in ansible_facts.packages"
|
87
|
+
|
88
|
+
- name: Install foreman release gpg key
|
89
|
+
rpm_key:
|
90
|
+
state: present
|
91
|
+
key: http://yum.theforeman.org/releases/{{ target_version }}/RPM-GPG-KEY-foreman
|
92
|
+
when: target_version != "nightly"
|
93
|
+
|
94
|
+
- name: Update foreman repositories
|
95
|
+
package:
|
96
|
+
name: https://yum.theforeman.org/releases/{{ target_version }}/el{{ ansible_distribution_major_version }}/{{ ansible_architecture }}/foreman-release.rpm
|
97
|
+
state: installed
|
98
|
+
|
99
|
+
- name: Clean yum metadata
|
100
|
+
command: yum clean all
|
101
|
+
|
102
|
+
- name: Update all packages
|
103
|
+
package:
|
104
|
+
name: '*'
|
105
|
+
state: latest
|
106
|
+
|
107
|
+
- name: Run the installer
|
108
|
+
shell: foreman-installer
|
109
|
+
<% end -%>
|
@@ -0,0 +1,21 @@
|
|
1
|
+
class RenameCapsuleUpgradePlaybook < ActiveRecord::Migration[6.0]
|
2
|
+
MAPPING = {
|
3
|
+
'Capsule Upgrade Playbook' => 'Smart Proxy Upgrade Playbook'
|
4
|
+
}.freeze
|
5
|
+
|
6
|
+
def up
|
7
|
+
rename(MAPPING)
|
8
|
+
end
|
9
|
+
|
10
|
+
def down
|
11
|
+
rename(MAPPING.invert)
|
12
|
+
end
|
13
|
+
|
14
|
+
private
|
15
|
+
|
16
|
+
def rename(mapping)
|
17
|
+
mapping.each do |old, new|
|
18
|
+
Template.where(name: old).update_all(name: new)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -188,7 +188,7 @@ Foreman::Plugin.register :foreman_ansible do
|
|
188
188
|
register_global_js_file 'global'
|
189
189
|
|
190
190
|
extend_graphql_type :type => '::Types::Host' do
|
191
|
-
field :all_ansible_roles, ::Types::InheritedAnsibleRole.connection_type, :null => true, :
|
191
|
+
field :all_ansible_roles, ::Types::InheritedAnsibleRole.connection_type, :null => true, :resolver_method => :present_all_ansible_roles
|
192
192
|
field :own_ansible_roles, ::Types::AnsibleRole.connection_type, :null => true
|
193
193
|
field :available_ansible_roles, ::Types::AnsibleRole.connection_type, :null => true
|
194
194
|
field :ansible_variables_with_overrides, Types::OverridenAnsibleVariable.connection_type, :null => false
|
@@ -244,4 +244,17 @@ Foreman::Plugin.register :foreman_ansible do
|
|
244
244
|
describe_hostgroup do
|
245
245
|
hostgroup_actions_provider :ansible_hostgroups_actions
|
246
246
|
end
|
247
|
+
|
248
|
+
extend_page('smart_proxies/show') do |context|
|
249
|
+
context.add_pagelet :smart_proxy_title_actions,
|
250
|
+
:name => _('Update Smart Proxy'),
|
251
|
+
:partial => 'foreman/smart_proxies/update_smart_proxy',
|
252
|
+
:onlyif => ->(proxy, view) { view.can_update_proxy?(proxy) }
|
253
|
+
end
|
254
|
+
extend_page('smart_proxies/index') do |context|
|
255
|
+
context.add_pagelet :smart_proxy_title_actions,
|
256
|
+
:name => _('Update Smart Proxy'),
|
257
|
+
:partial => 'foreman/smart_proxies/update_smart_proxy',
|
258
|
+
:onlyif => ->(proxy, view) { view.can_update_proxy?(proxy) }
|
259
|
+
end
|
247
260
|
end
|
@@ -3,15 +3,15 @@ require 'test_plugin_helper'
|
|
3
3
|
module Mutations
|
4
4
|
module Hosts
|
5
5
|
class CreateMutationTest < GraphQLQueryTestCase
|
6
|
-
let(:tax_location) { FactoryBot.create(:location) }
|
6
|
+
let(:tax_location) { as_admin { FactoryBot.create(:location) } }
|
7
7
|
let(:location_id) { Foreman::GlobalId.for(tax_location) }
|
8
|
-
let(:organization) { FactoryBot.create(:organization) }
|
8
|
+
let(:organization) { as_admin { FactoryBot.create(:organization) } }
|
9
9
|
let(:organization_id) { Foreman::GlobalId.for(organization) }
|
10
10
|
|
11
|
-
let(:role1) { FactoryBot.create(:ansible_role) }
|
12
|
-
let(:role2) { FactoryBot.create(:ansible_role) }
|
13
|
-
let(:role3) { FactoryBot.create(:ansible_role) }
|
14
|
-
let(:host) { FactoryBot.create(:host, :ansible_roles => [role1, role2, role3], :organization => organization, :location => tax_location) }
|
11
|
+
let(:role1) { as_admin { FactoryBot.create(:ansible_role) } }
|
12
|
+
let(:role2) { as_admin { FactoryBot.create(:ansible_role) } }
|
13
|
+
let(:role3) { as_admin { FactoryBot.create(:ansible_role) } }
|
14
|
+
let(:host) { as_admin { FactoryBot.create(:host, :ansible_roles => [role1, role2, role3], :organization => organization, :location => tax_location) } }
|
15
15
|
|
16
16
|
let(:variables) { { id: Foreman::GlobalId.for(host), ansibleRoleIds: [role3.id, role2.id, role1.id] } }
|
17
17
|
let(:query) do
|
@@ -37,7 +37,7 @@ module Mutations
|
|
37
37
|
end
|
38
38
|
|
39
39
|
context 'with admin permissions' do
|
40
|
-
let(:context_user) { FactoryBot.create(:user, :admin) }
|
40
|
+
let(:context_user) { as_admin { FactoryBot.create(:user, :admin) } }
|
41
41
|
let(:data) { result['data']['assignAnsibleRoles']['host'] }
|
42
42
|
|
43
43
|
it 'reorderes ansible roles' do
|
@@ -37,13 +37,15 @@ module Queries
|
|
37
37
|
let(:data) { result['data']['host']['allAnsibleRoles'] }
|
38
38
|
|
39
39
|
it 'allows to fetch inherited roles' do
|
40
|
-
|
40
|
+
assert_equal 2, data['totalCount']
|
41
|
+
|
41
42
|
r1_data = data['nodes'].first
|
42
43
|
r2_data = data['nodes'].second
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
44
|
+
|
45
|
+
assert_equal role1.name, r1_data['name']
|
46
|
+
assert r1_data['inherited']
|
47
|
+
assert_equal role2.name, r2_data['name']
|
48
|
+
assert_not r2_data['inherited']
|
47
49
|
end
|
48
50
|
|
49
51
|
it 'allow fetching variables' do
|
@@ -52,9 +54,10 @@ module Queries
|
|
52
54
|
FactoryBot.create(:ansible_variable, ansible_role: role2, override: true)
|
53
55
|
r1_vars = data['nodes'].first['ansibleVariables']
|
54
56
|
r2_vars = data['nodes'].second['ansibleVariables']
|
55
|
-
|
56
|
-
|
57
|
-
|
57
|
+
|
58
|
+
assert_equal 2, r1_vars['totalCount']
|
59
|
+
assert_equal 1, r2_vars['totalCount']
|
60
|
+
assert_equal var1.key, r1_vars['nodes'].first['key']
|
58
61
|
end
|
59
62
|
end
|
60
63
|
end
|
@@ -19,11 +19,8 @@ class AnsibleProviderTest < ActiveSupport::TestCase
|
|
19
19
|
end
|
20
20
|
|
21
21
|
context 'when it is using the ansible_run_host feature' do
|
22
|
-
let(:rex_feature) do
|
23
|
-
RemoteExecutionFeature.where(:label => 'ansible_run_host').first
|
24
|
-
end
|
25
|
-
|
26
22
|
it 'has remote_execution_command false' do
|
23
|
+
rex_feature = RemoteExecutionFeature.where(:label => 'ansible_run_host', :name => 'Run Ansible roles').first_or_create
|
27
24
|
template_invocation.template.remote_execution_features << rex_feature
|
28
25
|
assert_not command_options[:remote_execution_command]
|
29
26
|
end
|
@@ -51,12 +48,12 @@ class AnsibleProviderTest < ActiveSupport::TestCase
|
|
51
48
|
describe '#proxy_batch_size' do
|
52
49
|
it 'returns integer if setting is string' do
|
53
50
|
Setting.expects(:[]).with('foreman_ansible_proxy_batch_size').returns('10')
|
54
|
-
|
51
|
+
assert_equal 10, ForemanAnsible::AnsibleProvider.proxy_batch_size
|
55
52
|
end
|
56
53
|
|
57
54
|
it 'returns nil if setting is empty' do
|
58
55
|
Setting.expects(:[]).with('foreman_ansible_proxy_batch_size').returns('')
|
59
|
-
|
56
|
+
assert_nil ForemanAnsible::AnsibleProvider.proxy_batch_size
|
60
57
|
end
|
61
58
|
end
|
62
59
|
end
|
@@ -18,23 +18,23 @@ class HostManagedExtensionsTest < ActiveSupport::TestCase
|
|
18
18
|
|
19
19
|
describe '#all_ansible_roles' do
|
20
20
|
test 'returns assigned roles for host without a hostgroup' do
|
21
|
-
|
21
|
+
assert_equal [@role1], @host.all_ansible_roles
|
22
22
|
end
|
23
23
|
|
24
24
|
test 'returns assigned and inherited roles for host with a hostgroup' do
|
25
25
|
@host.hostgroup = @hostgroup
|
26
|
-
|
26
|
+
assert_equal [@role2, @role1], @host.all_ansible_roles
|
27
27
|
end
|
28
28
|
end
|
29
29
|
|
30
30
|
describe '#inherited_ansible_roles' do
|
31
31
|
test 'returns empty array for host without hostgroup' do
|
32
|
-
@host.inherited_ansible_roles
|
32
|
+
assert_equal [], @host.inherited_ansible_roles
|
33
33
|
end
|
34
34
|
|
35
35
|
test 'returns roles inherited from a hostgroup' do
|
36
36
|
@host.hostgroup = @hostgroup
|
37
|
-
|
37
|
+
assert_equal [@role2], @host.inherited_ansible_roles
|
38
38
|
end
|
39
39
|
end
|
40
40
|
|
@@ -54,13 +54,13 @@ class HostManagedExtensionsTest < ActiveSupport::TestCase
|
|
54
54
|
FactoryBot.create(:host_ansible_role, :ansible_role_id => @role1.id, :position => 1, :host_id => host.id)
|
55
55
|
FactoryBot.create(:host_ansible_role, :ansible_role_id => @role2.id, :position => 2, :host_id => host.id)
|
56
56
|
FactoryBot.create(:host_ansible_role, :ansible_role_id => @role3.id, :position => 0, :host_id => host.id)
|
57
|
-
|
57
|
+
assert_equal [@role3, @role1, @role2], host.ansible_roles
|
58
58
|
end
|
59
59
|
|
60
60
|
test 'should order hostgroup roles before host roles' do
|
61
61
|
host = FactoryBot.create(:host, :hostgroup => @hostgroup)
|
62
62
|
FactoryBot.create(:host_ansible_role, :ansible_role_id => @role1.id, :position => 0, :host_id => host.id)
|
63
|
-
|
63
|
+
assert_equal [@role2, @role1], host.all_ansible_roles
|
64
64
|
end
|
65
65
|
|
66
66
|
test 'should find hosts with role2' do
|
@@ -20,45 +20,45 @@ class HostgroupExtensionsTest < ActiveSupport::TestCase
|
|
20
20
|
describe '#all_ansible_roles' do
|
21
21
|
test 'returns assigned roles without any parent hostgroup' do
|
22
22
|
@hostgroup.host_ansible_roles
|
23
|
-
|
23
|
+
assert_equal [@role1, @role3], @hostgroup.all_ansible_roles
|
24
24
|
end
|
25
25
|
|
26
26
|
test 'returns assigned and inherited roles with from parent hostgroup' do
|
27
27
|
@hostgroup.parent = @hostgroup_parent
|
28
|
-
|
28
|
+
assert_equal [@role2, @role1, @role3], @hostgroup.all_ansible_roles
|
29
29
|
end
|
30
30
|
end
|
31
31
|
|
32
32
|
describe '#inherited_ansible_roles' do
|
33
33
|
test 'returns empty array for hostgroup without any parent' do
|
34
|
-
@hostgroup.inherited_ansible_roles
|
34
|
+
assert_equal [], @hostgroup.inherited_ansible_roles
|
35
35
|
end
|
36
36
|
|
37
37
|
test 'returns roles inherited from a chain of parents' do
|
38
38
|
@hostgroup.parent = @hostgroup_parent
|
39
|
-
|
39
|
+
assert_equal [@role2], @hostgroup.inherited_ansible_roles
|
40
40
|
end
|
41
41
|
end
|
42
42
|
|
43
43
|
describe '#inherited_and_own_ansible_roles' do
|
44
44
|
test 'returns only hostgroup roles' do
|
45
|
-
|
45
|
+
assert_equal [@role2], @hostgroup_parent.inherited_and_own_ansible_roles
|
46
46
|
end
|
47
47
|
|
48
48
|
test 'returns only hostgroup roles including inheritance' do
|
49
49
|
@hostgroup.parent = @hostgroup_parent
|
50
|
-
|
50
|
+
assert_equal [@role2, @role1], @hostgroup.inherited_and_own_ansible_roles
|
51
51
|
end
|
52
52
|
end
|
53
53
|
|
54
54
|
test 'should return ordered roles for hostgroup' do
|
55
55
|
@hostgroup.parent = @hostgroup_parent
|
56
|
-
|
56
|
+
assert_equal [@role2, @role1], @hostgroup.inherited_and_own_ansible_roles
|
57
57
|
end
|
58
58
|
|
59
59
|
describe '#cloned_ansibe_roles' do
|
60
60
|
test 'clone ansible roles from hostgroup parent' do
|
61
|
-
@hostgroup_parent.
|
61
|
+
assert_equal @hostgroup_parent.all_ansible_roles, @hostgroup_parent.clone.all_ansible_roles
|
62
62
|
end
|
63
63
|
end
|
64
64
|
|
data/webpack/components/AnsibleHostDetail/components/AnsibleVariableOverrides/EditableValue.js
CHANGED
@@ -17,11 +17,12 @@ const EditableValue = props => {
|
|
17
17
|
|
18
18
|
const type = props.variable.parameterType;
|
19
19
|
|
20
|
-
if (
|
20
|
+
if (['json', 'yaml', 'array', 'hash'].includes(type)) {
|
21
21
|
return (
|
22
22
|
<TextAreaField
|
23
|
+
aria-label="Edit override field"
|
23
24
|
onChange={props.onChange}
|
24
|
-
value={props.value}
|
25
|
+
value={JSON.stringify(props.value)}
|
25
26
|
validation={props.validation}
|
26
27
|
isDisabled={props.working}
|
27
28
|
/>
|
@@ -31,6 +32,7 @@ const EditableValue = props => {
|
|
31
32
|
if (type === 'boolean') {
|
32
33
|
return (
|
33
34
|
<SelectField
|
35
|
+
aria-label="Edit override field"
|
34
36
|
selectItems={[
|
35
37
|
{ id: 'trueSelectOpt', value: true, name: __('true') },
|
36
38
|
{ id: 'falseSelectOpt', value: false, name: __('false') },
|
@@ -19,12 +19,12 @@ export const rangeValidator = date => {
|
|
19
19
|
};
|
20
20
|
|
21
21
|
export const createValidationSchema = () => {
|
22
|
-
const
|
22
|
+
const required = __('Required field');
|
23
23
|
|
24
24
|
return Yup.object().shape({
|
25
|
-
repeat: Yup.string().required(
|
26
|
-
startTime: Yup.string().required(
|
27
|
-
startDate: Yup.string().required(
|
25
|
+
repeat: Yup.string().required(required),
|
26
|
+
startTime: Yup.string().required(required),
|
27
|
+
startDate: Yup.string().required(required),
|
28
28
|
});
|
29
29
|
};
|
30
30
|
|
@@ -1,5 +1,7 @@
|
|
1
1
|
import React from 'react';
|
2
2
|
import PropTypes from 'prop-types';
|
3
|
+
import { useDispatch } from 'react-redux';
|
4
|
+
import { push } from 'connected-react-router';
|
3
5
|
import { Formik, Field as FormikField } from 'formik';
|
4
6
|
import { useMutation } from '@apollo/client';
|
5
7
|
import { translate as __ } from 'foremanReact/common/I18n';
|
@@ -33,6 +35,7 @@ import jobsQuery from '../../../../graphql/queries/recurringJobs.gql';
|
|
33
35
|
|
34
36
|
const NewRecurringJobModal = props => {
|
35
37
|
const { onClose, resourceId, resourceName } = props;
|
38
|
+
const dispatch = useDispatch();
|
36
39
|
|
37
40
|
const [callMutation] = useMutation(createJobInvocation, {
|
38
41
|
refetchQueries: [
|
@@ -81,10 +84,31 @@ const NewRecurringJobModal = props => {
|
|
81
84
|
actions.push(<Spinner key="spinner" size="lg" />);
|
82
85
|
}
|
83
86
|
|
87
|
+
const modalDescription = (
|
88
|
+
<>
|
89
|
+
{__('This job will run all the assigned Ansible roles.')}
|
90
|
+
<br />
|
91
|
+
{__('For more advanced scheduling options')}{' '}
|
92
|
+
<Button
|
93
|
+
variant="link"
|
94
|
+
isInline
|
95
|
+
onClick={() =>
|
96
|
+
dispatch(
|
97
|
+
push(`/job_invocations/new?host_ids%5B%5D=${resourceId}`)
|
98
|
+
)
|
99
|
+
}
|
100
|
+
key="schedule-job-action"
|
101
|
+
>
|
102
|
+
{__('view remote execution page.')}
|
103
|
+
</Button>
|
104
|
+
</>
|
105
|
+
);
|
106
|
+
|
84
107
|
return (
|
85
108
|
<Modal
|
86
|
-
variant={ModalVariant.
|
87
|
-
title=
|
109
|
+
variant={ModalVariant.small}
|
110
|
+
title={__('Schedule recurring Ansible roles job')}
|
111
|
+
description={modalDescription}
|
88
112
|
ouiaId="modal-recurring-ansible-run"
|
89
113
|
isOpen={props.isOpen}
|
90
114
|
className="foreman-modal modal-high"
|
@@ -103,14 +127,16 @@ const NewRecurringJobModal = props => {
|
|
103
127
|
<FormikField
|
104
128
|
name="startTime"
|
105
129
|
component={TimePickerField}
|
106
|
-
label="Start
|
130
|
+
label="Start time"
|
107
131
|
isRequired
|
108
132
|
is24Hour
|
133
|
+
width="250px"
|
134
|
+
menuAppendTo={() => document.body}
|
109
135
|
/>
|
110
136
|
<FormikField
|
111
137
|
name="startDate"
|
112
138
|
component={DatePickerField}
|
113
|
-
label="Start
|
139
|
+
label="Start date"
|
114
140
|
isRequired
|
115
141
|
validators={[rangeValidator]}
|
116
142
|
/>
|
@@ -2,6 +2,13 @@
|
|
2
2
|
z-index: 1040;
|
3
3
|
}
|
4
4
|
|
5
|
-
.modal-high {
|
6
|
-
height:
|
5
|
+
.foreman-modal.modal-high {
|
6
|
+
height: 50vh;
|
7
|
+
@media only screen and (max-height: 960px) {
|
8
|
+
height: 70vh;
|
9
|
+
}
|
10
|
+
|
11
|
+
.pf-c-form-control, .pf-c-date-picker, .pf-c-date-picker__input {
|
12
|
+
width: 250px
|
13
|
+
}
|
7
14
|
}
|
@@ -24,7 +24,7 @@ const AllRolesModal = ({ hostGlobalId, onClose, history }) => {
|
|
24
24
|
title: __('All assigned Ansible roles'),
|
25
25
|
disableFocusTrap: true,
|
26
26
|
description: __(
|
27
|
-
'This list consists of host assigned roles and group assigned roles. Group assigned roles will always be executed prior to host assigned roles'
|
27
|
+
'This list consists of host assigned roles and group assigned roles. Group assigned roles will always be executed prior to host assigned roles.'
|
28
28
|
),
|
29
29
|
};
|
30
30
|
|
@@ -28,7 +28,7 @@ const EditRolesModal = ({
|
|
28
28
|
title: __('Edit Ansible Roles'),
|
29
29
|
disableFocusTrap: true,
|
30
30
|
description: __(
|
31
|
-
'Add, remove or reorder host assigned Ansible roles. This host has also group assigned roles that are not displayed here and will always be executed prior to host assigned roles'
|
31
|
+
'Add, remove or reorder host assigned Ansible roles. This host has also group assigned roles that are not displayed here and will always be executed prior to host assigned roles.'
|
32
32
|
),
|
33
33
|
};
|
34
34
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: foreman_ansible
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 10.
|
4
|
+
version: 10.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Daniel Lobato Garcia
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-09
|
11
|
+
date: 2022-11-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: acts_as_list
|
@@ -42,30 +42,30 @@ dependencies:
|
|
42
42
|
name: foreman_remote_execution
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- - "
|
45
|
+
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: 8.0
|
47
|
+
version: '8.0'
|
48
48
|
type: :runtime
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- - "
|
52
|
+
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: 8.0
|
54
|
+
version: '8.0'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: foreman-tasks
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
|
-
- - "
|
59
|
+
- - "~>"
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version: 7.0
|
61
|
+
version: '7.0'
|
62
62
|
type: :runtime
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
|
-
- - "
|
66
|
+
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version: 7.0
|
68
|
+
version: '7.0'
|
69
69
|
description: Ansible integration with Foreman
|
70
70
|
email:
|
71
71
|
- elobatocs@gmail.com
|
@@ -115,6 +115,7 @@ files:
|
|
115
115
|
- app/helpers/foreman_ansible/ansible_roles_data_preparations.rb
|
116
116
|
- app/helpers/foreman_ansible/ansible_roles_helper.rb
|
117
117
|
- app/helpers/foreman_ansible/hosts_helper.rb
|
118
|
+
- app/helpers/foreman_ansible/smart_proxies_helper.rb
|
118
119
|
- app/jobs/sync_playbooks.rb
|
119
120
|
- app/jobs/sync_roles_and_variables.rb
|
120
121
|
- app/lib/actions/foreman_ansible/helpers/play_roles_description.rb
|
@@ -171,6 +172,7 @@ files:
|
|
171
172
|
- app/views/api/v2/ansible_variables/show.json.rabl
|
172
173
|
- app/views/api/v2/hostgroups/ansible_roles.json.rabl
|
173
174
|
- app/views/api/v2/hosts/ansible_roles.json.rabl
|
175
|
+
- app/views/foreman/smart_proxies/_update_smart_proxy.html.erb
|
174
176
|
- app/views/foreman_ansible/ansible_roles/_select_tab_content.html.erb
|
175
177
|
- app/views/foreman_ansible/ansible_roles/_select_tab_title.html.erb
|
176
178
|
- app/views/foreman_ansible/api/v2/ansible_roles/import.json.rabl
|
@@ -215,6 +217,7 @@ files:
|
|
215
217
|
- db/migrate/20200421201839_update_ansible_inv_template_name.rb
|
216
218
|
- db/migrate/20210120150019_add_position_to_ansible_role.rb
|
217
219
|
- db/migrate/20210818083407_fix_ansible_setting_category_to_dsl.rb
|
220
|
+
- db/migrate/20221031114720_rename_capsule_upgrade_playbook.rb
|
218
221
|
- db/seeds.d/100_common_parameters.rb
|
219
222
|
- db/seeds.d/62_ansible_proxy_feature.rb
|
220
223
|
- db/seeds.d/75_job_templates.rb
|
@@ -290,8 +293,6 @@ files:
|
|
290
293
|
- test/graphql/queries/host_ansible_roles_query_test.rb
|
291
294
|
- test/integration/hostgroup_js_test.rb
|
292
295
|
- test/test_plugin_helper.rb
|
293
|
-
- test/unit/actions/run_ansible_job_test.rb
|
294
|
-
- test/unit/actions/run_proxy_ansible_command_test.rb
|
295
296
|
- test/unit/ansible_provider_test.rb
|
296
297
|
- test/unit/ansible_role_test.rb
|
297
298
|
- test/unit/ansible_variable_test.rb
|
@@ -487,9 +488,6 @@ test_files:
|
|
487
488
|
- test/graphql/queries/ansible_roles_query_test.rb
|
488
489
|
- test/graphql/queries/host_ansible_roles_query_test.rb
|
489
490
|
- test/test_plugin_helper.rb
|
490
|
-
- test/unit/actions/run_ansible_job_test.rb
|
491
|
-
- test/unit/actions/run_proxy_ansible_command_test.rb
|
492
|
-
- test/unit/ansible_provider_test.rb
|
493
491
|
- test/unit/ansible_role_test.rb
|
494
492
|
- test/unit/ansible_variable_test.rb
|
495
493
|
- test/unit/concerns/config_reports_extensions_test.rb
|
@@ -510,4 +508,5 @@ test_files:
|
|
510
508
|
- test/unit/services/override_resolver_test.rb
|
511
509
|
- test/unit/services/roles_importer_test.rb
|
512
510
|
- test/unit/services/ui_roles_importer_test.rb
|
511
|
+
- test/unit/ansible_provider_test.rb
|
513
512
|
- test/integration/hostgroup_js_test.rb
|
File without changes
|
File without changes
|