foreman_ansible 6.0.0 → 6.2.0
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/app/controllers/api/v2/ansible_inventories_controller.rb +2 -2
- data/app/helpers/foreman_ansible/ansible_reports_helper.rb +2 -5
- data/app/models/concerns/foreman_ansible/host_managed_extensions.rb +3 -3
- data/app/models/concerns/foreman_ansible/hostgroup_extensions.rb +12 -0
- data/app/models/foreman_ansible/ansible_provider.rb +1 -9
- data/app/services/foreman_ansible/operating_system_parser.rb +8 -2
- data/app/services/foreman_ansible/variables_importer.rb +9 -4
- data/app/views/ansible_roles/welcome.html.erb +1 -1
- data/app/views/foreman_ansible/ansible_roles/_select_tab_content.html.erb +8 -16
- data/app/views/foreman_ansible/job_templates/ansible_roles_-_install_from_galaxy.erb +1 -1
- data/app/views/foreman_ansible/job_templates/capsule_upgrade_-_ansible_default.erb +2 -3
- data/app/views/foreman_ansible/job_templates/configure_cloud_connector_-_ansible_default.erb +1 -0
- data/app/views/foreman_ansible/job_templates/service_action_-_enable_web_console.erb +16 -0
- data/lib/foreman_ansible/remote_execution.rb +8 -1
- data/lib/foreman_ansible/version.rb +1 -1
- data/package.json +11 -42
- data/test/unit/ansible_provider_test.rb +1 -1
- data/test/unit/lib/foreman_ansible_core/ansible_runner_test.rb +3 -3
- data/test/unit/lib/foreman_ansible_core/playbook_runner_test.rb +3 -3
- data/test/unit/services/ansible_variables_importer_test.rb +13 -0
- data/test/unit/services/inventory_creator_test.rb +1 -1
- data/webpack/components/AnsibleRolesSwitcher/AnsibleRolesSwitcher.js +11 -9
- data/webpack/components/AnsibleRolesSwitcher/AnsibleRolesSwitcherActions.js +14 -14
- data/webpack/components/AnsibleRolesSwitcher/__tests__/AnsibleRolesSwitcher.test.js +4 -4
- data/webpack/components/AnsibleRolesSwitcher/__tests__/AnsibleRolesSwitcherReducer.test.js +1 -1
- data/webpack/components/AnsibleRolesSwitcher/__tests__/AnsibleRolesSwitcherSelectors.test.js +1 -1
- data/webpack/components/AnsibleRolesSwitcher/__tests__/__snapshots__/AnsibleRolesSwitcher.test.js.snap +1 -0
- data/webpack/components/AnsibleRolesSwitcher/components/AnsiblePermissionDenied.test.js +1 -1
- data/webpack/components/AnsibleRolesSwitcher/components/AnsibleRole.test.js +1 -1
- data/webpack/components/AnsibleRolesSwitcher/components/AssignedRolesList.test.js +1 -1
- data/webpack/components/AnsibleRolesSwitcher/components/AvailableRolesList.test.js +1 -1
- data/webpack/components/AnsibleRolesSwitcher/index.js +1 -1
- data/webpack/index.js +0 -13
- metadata +20 -20
- data/webpack/test_setup.js +0 -12
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d95899e15050cbf3f25d75a8f3c9bc5a3059a9dd0ffa90f4690ce84cf49d3408
|
4
|
+
data.tar.gz: 466754ac90d1e80046fca70ca8db372e90d2b61a0d26a726f0807f7e81227728
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9f79b560e9e01e8719c6e705ff5fef6a9f9e7b91bc9ec1b9b79c81750b572c4de6929d2ab07049caefdf4f555a5087c31eb76543d52b87622038107a1e02ea63
|
7
|
+
data.tar.gz: 357b61ffdb94b61a37ecf87afba07f7e0c2158d4af14d39b701fb31152803692a8feaac09294bb2bc8c0ae8fe8d9daa66eb8eb6f0869c4901315dca688f06dab
|
@@ -72,8 +72,8 @@ module Api
|
|
72
72
|
process_resource_error(:resource => @ansible_inventory)
|
73
73
|
end
|
74
74
|
rescue StandardError => e
|
75
|
-
render_error
|
76
|
-
|
75
|
+
render_error :custom_error, :status => :unprocessable_entity,
|
76
|
+
:locals => { :message => _("Scheduling Report template failed for: #{e.message}") }
|
77
77
|
end
|
78
78
|
|
79
79
|
def action_permission
|
@@ -42,10 +42,7 @@ module ForemanAnsible
|
|
42
42
|
end
|
43
43
|
|
44
44
|
def report_json_viewer(json)
|
45
|
-
|
46
|
-
viewer = content_tag :div, '', :id => uid
|
47
|
-
viewer << mount_react_component('ReportJsonViewer',
|
48
|
-
"##{uid}", json.to_json)
|
45
|
+
react_component('ReportJsonViewer', data: json)
|
49
46
|
end
|
50
47
|
|
51
48
|
private
|
@@ -68,7 +65,7 @@ module ForemanAnsible
|
|
68
65
|
prettyp.gsub!(/^(\[|\])/, '')
|
69
66
|
prettyp.gsub!(/^[\s]*$\n/, '')
|
70
67
|
paragraph_style = 'white-space:pre;padding: 2em 0'
|
71
|
-
|
68
|
+
tag(:p, prettyp, :style => paragraph_style)
|
72
69
|
end
|
73
70
|
|
74
71
|
def hash_with_keys_removed(hash)
|
@@ -68,9 +68,9 @@ end
|
|
68
68
|
module Host
|
69
69
|
class Managed
|
70
70
|
apipie :class do
|
71
|
-
property :all_ansible_roles, array_of: 'AnsibleRole', desc: 'Returns all ansible roles assigned to the host, both its own and inherited'
|
72
|
-
property :ansible_roles, array_of: 'AnsibleRole', desc: 'Returns ansible roles assigned to the host'
|
73
|
-
property :inherited_ansible_roles, array_of: 'AnsibleRole', desc: 'Returns
|
71
|
+
property :all_ansible_roles, array_of: 'AnsibleRole', desc: 'Returns all ansible roles assigned to the host, both its own and inherited from the host group and its parents'
|
72
|
+
property :ansible_roles, array_of: 'AnsibleRole', desc: 'Returns ansible roles directly assigned to the host'
|
73
|
+
property :inherited_ansible_roles, array_of: 'AnsibleRole', desc: 'Returns only ansible roles assigned to the host\'s host group and its parents'
|
74
74
|
end
|
75
75
|
# Methods to be allowed in any template with safemode enabled
|
76
76
|
class Jail < Safemode::Jail
|
@@ -36,3 +36,15 @@ module ForemanAnsible
|
|
36
36
|
end
|
37
37
|
end
|
38
38
|
end
|
39
|
+
|
40
|
+
class Hostgroup
|
41
|
+
apipie :class do
|
42
|
+
property :all_ansible_roles, array_of: 'AnsibleRole', desc: 'Returns all ansible roles assigned to the host group, both its own and inherited from parent host groups'
|
43
|
+
property :ansible_roles, array_of: 'AnsibleRole', desc: 'Returns ansible roles directly assigned to the host group'
|
44
|
+
property :inherited_ansible_roles, array_of: 'AnsibleRole', desc: 'Returns only the inherited ansible roles assigned to the host group\'s parents'
|
45
|
+
end
|
46
|
+
# Methods to be allowed in any template with safemode enabled
|
47
|
+
class Jail < Safemode::Jail
|
48
|
+
allow :all_ansible_roles, :ansible_roles, :inherited_ansible_roles
|
49
|
+
end
|
50
|
+
end
|
@@ -35,7 +35,7 @@ if defined? ForemanRemoteExecution
|
|
35
35
|
{
|
36
36
|
'per-host' => {
|
37
37
|
host.name => {
|
38
|
-
'
|
38
|
+
'ansible_password' => rex_ssh_password(host),
|
39
39
|
'ansible_become_password' => rex_effective_user_password(host)
|
40
40
|
}
|
41
41
|
}
|
@@ -66,14 +66,6 @@ if defined? ForemanRemoteExecution
|
|
66
66
|
'ForemanAnsibleCore::TaskLauncher::Playbook::PlaybookRunnerAction'
|
67
67
|
end
|
68
68
|
|
69
|
-
def required_proxy_selector_for(template)
|
70
|
-
if template.remote_execution_features.where(:label => 'ansible_run_capsule_upgrade').any?
|
71
|
-
::DefaultProxyProxySelector.new
|
72
|
-
else
|
73
|
-
super
|
74
|
-
end
|
75
|
-
end
|
76
|
-
|
77
69
|
private
|
78
70
|
|
79
71
|
def ansible_command?(template)
|
@@ -80,8 +80,14 @@ module ForemanAnsible
|
|
80
80
|
facts[:ansible_os_name].tr(" \n\t", '') ||
|
81
81
|
facts[:ansible_distribution].tr(" \n\t", '')
|
82
82
|
else
|
83
|
-
facts[:
|
84
|
-
|
83
|
+
distribution = facts[:ansible_lsb].try(:[], 'id') || facts[:ansible_distribution]
|
84
|
+
|
85
|
+
if distribution == 'RedHat' &&
|
86
|
+
facts[:ansible_lsb].try(:[], 'id') == 'RedHatEnterpriseWorkstation'
|
87
|
+
distribution += '_Workstation'
|
88
|
+
end
|
89
|
+
|
90
|
+
distribution
|
85
91
|
end
|
86
92
|
end
|
87
93
|
|
@@ -51,7 +51,8 @@ module ForemanAnsible
|
|
51
51
|
:key => variable_name,
|
52
52
|
:ansible_role_id => role.id
|
53
53
|
)
|
54
|
-
variable.assign_attributes(:
|
54
|
+
variable.assign_attributes(:hidden_value => false,
|
55
|
+
:default_value => variable_default,
|
55
56
|
:key_type => infer_key_type(variable_default))
|
56
57
|
variable.imported = true if variable.new_record?
|
57
58
|
variable.valid? ? variable : nil
|
@@ -78,8 +79,10 @@ module ForemanAnsible
|
|
78
79
|
def create_new_variables(variables)
|
79
80
|
iterate_over_variables(variables) do |role, memo, attrs|
|
80
81
|
variable = AnsibleVariable.new(
|
81
|
-
JSON.parse(attrs)
|
82
|
+
JSON.parse(attrs)
|
82
83
|
)
|
84
|
+
# Make sure, newly created variables are not hidden
|
85
|
+
variable.hidden_value = false
|
83
86
|
variable.ansible_role = ::AnsibleRole.find_by(:name => role)
|
84
87
|
variable.save
|
85
88
|
memo << variable
|
@@ -88,7 +91,9 @@ module ForemanAnsible
|
|
88
91
|
|
89
92
|
def update_variables(variables)
|
90
93
|
iterate_over_variables(variables) do |_role, memo, attrs|
|
91
|
-
attributes = JSON.parse(attrs)
|
94
|
+
attributes = JSON.parse(attrs)
|
95
|
+
# Make sure to let the flag if a variable is hidden untouched
|
96
|
+
attributes.delete('hidden_value')
|
92
97
|
var = AnsibleVariable.find attributes['id']
|
93
98
|
var.update(attributes)
|
94
99
|
memo << var
|
@@ -98,7 +103,7 @@ module ForemanAnsible
|
|
98
103
|
def delete_old_variables(variables)
|
99
104
|
iterate_over_variables(variables) do |_role, memo, attrs|
|
100
105
|
variable = AnsibleVariable.find(
|
101
|
-
JSON.parse(attrs)['
|
106
|
+
JSON.parse(attrs)['id']
|
102
107
|
)
|
103
108
|
memo << variable.key
|
104
109
|
variable.destroy
|
@@ -4,7 +4,7 @@
|
|
4
4
|
<%= icon_text("play", "", :kind => "fa") %>
|
5
5
|
</div>
|
6
6
|
<h1><%= _('Ansible Roles') %></h1>
|
7
|
-
<p><%= _('No
|
7
|
+
<p><%= _('No Ansible Roles were found in Foreman. If you want to assign roles to your hosts,
|
8
8
|
you have to import them first.').html_safe %>
|
9
9
|
</p>
|
10
10
|
<p><%= link_to(_('Learn more about this in the documentation.'), documentation_url('#4.1ImportingRoles', :root_url => ansible_doc_url), target: '_blank') %></p>
|
@@ -4,20 +4,12 @@
|
|
4
4
|
<div class='tab-pane' id='ansible_roles'>
|
5
5
|
<% roles = f.object.is_a?(Hostgroup) ? roles_attrs(f.object.inherited_and_own_ansible_roles) : roles_attrs(f.object.all_ansible_roles) %>
|
6
6
|
<% class_name = f.object.is_a?(Hostgroup) ? 'Hostgroup' : 'Host' %>
|
7
|
-
<%=
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
:canView => User.current.can?(:view_ansible_roles)
|
16
|
-
}.to_json
|
17
|
-
) %>
|
18
|
-
<% unless request.xhr? %>
|
19
|
-
<script type="text/javascript">
|
20
|
-
tfm.initAnsibleRoleSwitcher();
|
21
|
-
</script>
|
22
|
-
<% end %>
|
7
|
+
<%= react_component('AnsibleRolesSwitcher', {
|
8
|
+
:initialAssignedRoles => roles,
|
9
|
+
:inheritedRoleIds => f.object.inherited_ansible_roles.map(&:id),
|
10
|
+
:availableRolesUrl => ui_ansible_roles_path,
|
11
|
+
:resourceId => f.object.id,
|
12
|
+
:resourceName => class_name,
|
13
|
+
:canView => User.current.can?(:view_ansible_roles)
|
14
|
+
}) %>
|
23
15
|
</div>
|
@@ -25,7 +25,7 @@ model: JobTemplate
|
|
25
25
|
---
|
26
26
|
- hosts: all
|
27
27
|
tasks:
|
28
|
-
- command: ansible-galaxy install {{ item }}
|
28
|
+
- command: ansible-galaxy install {{ item }} -p <%= input('location').present? ? input('location') : '/etc/ansible/roles' %>
|
29
29
|
register: out
|
30
30
|
with_items:
|
31
31
|
- <%= input('ansible_roles_list') %>
|
@@ -34,11 +34,10 @@ feature: ansible_run_capsule_upgrade
|
|
34
34
|
msg: "This playbook cannot be executed on a Satellite server. Use only on a Capsule server."
|
35
35
|
when: "'satellite' in ansible_facts.packages"
|
36
36
|
|
37
|
-
- name: Install satellite-maintain if not present
|
37
|
+
- name: Install|Update satellite-maintain if not present
|
38
38
|
package:
|
39
39
|
name: rubygem-foreman_maintain
|
40
|
-
state:
|
41
|
-
when: "'rubygem-foreman_maintain' not in ansible_facts.packages"
|
40
|
+
state: latest
|
42
41
|
|
43
42
|
- block:
|
44
43
|
<%- whitelist_option = if input('whitelist_options').present?
|
@@ -0,0 +1,16 @@
|
|
1
|
+
<%#
|
2
|
+
name: Service Action - Enable Web Console
|
3
|
+
job_category: Ansible Services
|
4
|
+
snippet: false
|
5
|
+
provider_type: Ansible
|
6
|
+
kind: job_template
|
7
|
+
model: JobTemplate
|
8
|
+
feature: ansible_enable_web_console
|
9
|
+
%>
|
10
|
+
---
|
11
|
+
- hosts: all
|
12
|
+
tasks:
|
13
|
+
- name: ensure cockpit is installed
|
14
|
+
package:
|
15
|
+
name: "cockpit-system"
|
16
|
+
state: present
|
@@ -45,7 +45,14 @@ module ForemanAnsible
|
|
45
45
|
RemoteExecutionFeature.register(
|
46
46
|
:ansible_run_capsule_upgrade,
|
47
47
|
N_('Upgrade Capsules on given hosts'),
|
48
|
-
:description => N_('Upgrade Capsules on given Capsule server hosts')
|
48
|
+
:description => N_('Upgrade Capsules on given Capsule server hosts'),
|
49
|
+
:proxy_selector_override => ::RemoteExecutionProxySelector::INTERNAL_PROXY
|
50
|
+
)
|
51
|
+
RemoteExecutionFeature.register(
|
52
|
+
:ansible_configure_cloud_connector,
|
53
|
+
N_('Configure Cloud Connector on given hosts'),
|
54
|
+
:description => N_('Configure Cloud Connector on given hosts'),
|
55
|
+
:proxy_selector_override => ::RemoteExecutionProxySelector::INTERNAL_PROXY
|
49
56
|
)
|
50
57
|
end
|
51
58
|
end
|
data/package.json
CHANGED
@@ -7,33 +7,24 @@
|
|
7
7
|
"test": "test"
|
8
8
|
},
|
9
9
|
"peerDependencies": {
|
10
|
-
"@theforeman/vendor": ">=
|
10
|
+
"@theforeman/vendor": ">= 6.0.0"
|
11
11
|
},
|
12
12
|
"dependencies": {
|
13
13
|
"react-json-tree": "^0.11.0"
|
14
14
|
},
|
15
15
|
"devDependencies": {
|
16
16
|
"@babel/core": "^7.7.0",
|
17
|
-
"@theforeman/builder": "^
|
18
|
-
"@theforeman/
|
19
|
-
"
|
20
|
-
"
|
21
|
-
"
|
22
|
-
"
|
23
|
-
"
|
24
|
-
"eslint": "^6.0.0",
|
25
|
-
"eslint-plugin-patternfly-react": "^0.2.1",
|
26
|
-
"identity-obj-proxy": "^3.0.0",
|
27
|
-
"jest": "^24.9.0",
|
28
|
-
"prettier": "^1.19.0",
|
29
|
-
"react-redux": "^5.0.7",
|
30
|
-
"react-redux-test-utils": "^0.1.1",
|
31
|
-
"redux": "^3.7.2",
|
32
|
-
"redux-thunk": "^2.3.0"
|
17
|
+
"@theforeman/builder": "^6.0.0",
|
18
|
+
"@theforeman/eslint-plugin-foreman": "6.0.0",
|
19
|
+
"@theforeman/test": "^6.0.0",
|
20
|
+
"@theforeman/vendor-dev": "^6.0.0",
|
21
|
+
"babel-eslint": "^10.0.3",
|
22
|
+
"eslint": "^6.7.2",
|
23
|
+
"prettier": "^1.13.5"
|
33
24
|
},
|
34
25
|
"scripts": {
|
35
|
-
"test": "
|
36
|
-
"lint": "
|
26
|
+
"test": "tfm-test --plugin",
|
27
|
+
"lint": "tfm-lint --plugin -d webpack"
|
37
28
|
},
|
38
29
|
"repository": {
|
39
30
|
"type": "git",
|
@@ -44,27 +35,5 @@
|
|
44
35
|
"bugs": {
|
45
36
|
"url": "https://projects.theforeman.org/projects/ansible"
|
46
37
|
},
|
47
|
-
"homepage": "https://theforeman.org/plugins/foreman_ansible/"
|
48
|
-
"jest": {
|
49
|
-
"verbose": true,
|
50
|
-
"moduleDirectories": [
|
51
|
-
"node_modules/@theforeman/vendor-core/node_modules",
|
52
|
-
"node_modules",
|
53
|
-
"webpack"
|
54
|
-
],
|
55
|
-
"transform": {
|
56
|
-
"^.+\\.js$": "babel-jest"
|
57
|
-
},
|
58
|
-
"setupFiles": [
|
59
|
-
"raf/polyfill",
|
60
|
-
"./webpack/test_setup.js"
|
61
|
-
],
|
62
|
-
"testPathIgnorePatterns": [
|
63
|
-
"/node_modules/",
|
64
|
-
"<rootDir>/foreman/"
|
65
|
-
],
|
66
|
-
"moduleNameMapper": {
|
67
|
-
"^.+\\.(css|scss)$": "identity-obj-proxy"
|
68
|
-
}
|
69
|
-
}
|
38
|
+
"homepage": "https://theforeman.org/plugins/foreman_ansible/"
|
70
39
|
}
|
@@ -40,7 +40,7 @@ class AnsibleProviderTest < ActiveSupport::TestCase
|
|
40
40
|
host.expects(:params).twice.returns(params)
|
41
41
|
secrets = ForemanAnsible::AnsibleProvider.secrets(host)
|
42
42
|
host_secrets = secrets['per-host'][host.name]
|
43
|
-
assert_equal host_secrets['
|
43
|
+
assert_equal host_secrets['ansible_password'], 'password'
|
44
44
|
assert_equal host_secrets['ansible_become_password'], 'letmein'
|
45
45
|
end
|
46
46
|
end
|
@@ -24,7 +24,7 @@ module ForemanAnsibleCore
|
|
24
24
|
'_meta' => { 'hostvars' => { 'foreman.example.com' => {} } } }
|
25
25
|
end
|
26
26
|
let(:input) do
|
27
|
-
host_secrets = { '
|
27
|
+
host_secrets = { 'ansible_password' => 'letmein', 'ansible_become_password' => 'iamroot' }
|
28
28
|
secrets = { 'per-host' => { 'foreman.example.com' => host_secrets } }
|
29
29
|
host_input = { 'input' => { 'action_input' => { 'secrets' => secrets } } }
|
30
30
|
{ 'foreman.example.com' => host_input }
|
@@ -35,14 +35,14 @@ module ForemanAnsibleCore
|
|
35
35
|
test_inventory = inventory.merge('ssh_password' => 'sshpass', 'effective_user_password' => 'mypass')
|
36
36
|
rebuilt = runner.send(:rebuild_secrets, test_inventory, input)
|
37
37
|
host_vars = rebuilt.dig('_meta', 'hostvars', 'foreman.example.com')
|
38
|
-
assert_equal 'sshpass', host_vars['
|
38
|
+
assert_equal 'sshpass', host_vars['ansible_password']
|
39
39
|
assert_equal 'mypass', host_vars['ansible_become_password']
|
40
40
|
end
|
41
41
|
|
42
42
|
test 'host secrets are used when not overriden by inventory secrest' do
|
43
43
|
rebuilt = runner.send(:rebuild_secrets, inventory, input)
|
44
44
|
host_vars = rebuilt.dig('_meta', 'hostvars', 'foreman.example.com')
|
45
|
-
assert_equal 'letmein', host_vars['
|
45
|
+
assert_equal 'letmein', host_vars['ansible_password']
|
46
46
|
assert_equal 'iamroot', host_vars['ansible_become_password']
|
47
47
|
end
|
48
48
|
end
|
@@ -87,7 +87,7 @@ class PlaybookRunnerTest < ActiveSupport::TestCase
|
|
87
87
|
'_meta' => { 'hostvars' => { 'foreman.example.com' => {} } } }
|
88
88
|
end
|
89
89
|
let(:secrets) do
|
90
|
-
host_secrets = { '
|
90
|
+
host_secrets = { 'ansible_password' => 'letmein', 'ansible_become_password' => 'iamroot' }
|
91
91
|
{ 'per-host' => { 'foreman.example.com' => host_secrets } }
|
92
92
|
end
|
93
93
|
let(:runner) { ForemanAnsibleCore::Runner::Playbook.allocate }
|
@@ -96,14 +96,14 @@ class PlaybookRunnerTest < ActiveSupport::TestCase
|
|
96
96
|
test_inventory = inventory.merge('ssh_password' => 'sshpass', 'effective_user_password' => 'mypass')
|
97
97
|
rebuilt = runner.send(:rebuild_secrets, test_inventory, secrets)
|
98
98
|
host_vars = rebuilt.dig('_meta', 'hostvars', 'foreman.example.com')
|
99
|
-
assert_equal 'sshpass', host_vars['
|
99
|
+
assert_equal 'sshpass', host_vars['ansible_password']
|
100
100
|
assert_equal 'mypass', host_vars['ansible_become_password']
|
101
101
|
end
|
102
102
|
|
103
103
|
test 'host secrets are used when not overriden by inventory secrest' do
|
104
104
|
rebuilt = runner.send(:rebuild_secrets, inventory, secrets)
|
105
105
|
host_vars = rebuilt.dig('_meta', 'hostvars', 'foreman.example.com')
|
106
|
-
assert_equal 'letmein', host_vars['
|
106
|
+
assert_equal 'letmein', host_vars['ansible_password']
|
107
107
|
assert_equal 'iamroot', host_vars['ansible_become_password']
|
108
108
|
end
|
109
109
|
end
|
@@ -59,6 +59,19 @@ class AnsibleVariablesImporterTest < ActiveSupport::TestCase
|
|
59
59
|
assert_empty changes['update']
|
60
60
|
end
|
61
61
|
|
62
|
+
test 'sets hidden value to false by default' do
|
63
|
+
role = FactoryBot.create(:ansible_role)
|
64
|
+
variable = FactoryBot.create(:ansible_variable)
|
65
|
+
api_response = {
|
66
|
+
role.name => { variable.key => 'new value' }
|
67
|
+
}
|
68
|
+
changes = importer.import_variables(api_response, [role.name])
|
69
|
+
assert_empty changes['update']
|
70
|
+
assert_not_empty changes['new']
|
71
|
+
assert_equal variable.key, changes['new'].first.key
|
72
|
+
assert_not changes['new'].first.hidden_value?
|
73
|
+
end
|
74
|
+
|
62
75
|
test 'reimports variable with same key for different role' do
|
63
76
|
role = FactoryBot.create(:ansible_role)
|
64
77
|
variable = FactoryBot.create(:ansible_variable)
|
@@ -69,7 +69,7 @@ module ForemanAnsible
|
|
69
69
|
connection_params['ansible_winrm_server_cert_validation']
|
70
70
|
assert_equal Setting['remote_execution_effective_user_method'],
|
71
71
|
connection_params['ansible_become_method']
|
72
|
-
refute connection_params.key?('
|
72
|
+
refute connection_params.key?('ansible_password')
|
73
73
|
refute connection_params.key?('ansible_become_password')
|
74
74
|
end
|
75
75
|
|
@@ -17,7 +17,7 @@ class AnsibleRolesSwitcher extends React.Component {
|
|
17
17
|
inheritedRoleIds,
|
18
18
|
resourceId,
|
19
19
|
resourceName,
|
20
|
-
} = this.props
|
20
|
+
} = this.props;
|
21
21
|
|
22
22
|
this.props.getAnsibleRoles(
|
23
23
|
availableRolesUrl,
|
@@ -52,7 +52,7 @@ class AnsibleRolesSwitcher extends React.Component {
|
|
52
52
|
inheritedRoleIds,
|
53
53
|
resourceId,
|
54
54
|
resourceName,
|
55
|
-
} = this.props
|
55
|
+
} = this.props;
|
56
56
|
|
57
57
|
const onListingChange = paginationArgs =>
|
58
58
|
getAnsibleRoles(
|
@@ -104,13 +104,11 @@ class AnsibleRolesSwitcher extends React.Component {
|
|
104
104
|
}
|
105
105
|
|
106
106
|
AnsibleRolesSwitcher.propTypes = {
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
resourceName: PropTypes.string,
|
113
|
-
}).isRequired,
|
107
|
+
initialAssignedRoles: PropTypes.arrayOf(PropTypes.object),
|
108
|
+
availableRolesUrl: PropTypes.string.isRequired,
|
109
|
+
inheritedRoleIds: PropTypes.arrayOf(PropTypes.number),
|
110
|
+
resourceId: PropTypes.number,
|
111
|
+
resourceName: PropTypes.string,
|
114
112
|
getAnsibleRoles: PropTypes.func.isRequired,
|
115
113
|
loading: PropTypes.bool.isRequired,
|
116
114
|
pagination: PropTypes.shape({
|
@@ -137,6 +135,10 @@ AnsibleRolesSwitcher.propTypes = {
|
|
137
135
|
|
138
136
|
AnsibleRolesSwitcher.defaultProps = {
|
139
137
|
error: {},
|
138
|
+
resourceId: null,
|
139
|
+
resourceName: '',
|
140
|
+
initialAssignedRoles: [],
|
141
|
+
inheritedRoleIds: [],
|
140
142
|
};
|
141
143
|
|
142
144
|
export default AnsibleRolesSwitcher;
|
@@ -21,7 +21,7 @@ export const getAnsibleRoles = (
|
|
21
21
|
resourceName,
|
22
22
|
pagination,
|
23
23
|
search
|
24
|
-
) => dispatch => {
|
24
|
+
) => async dispatch => {
|
25
25
|
dispatch({ type: ANSIBLE_ROLES_REQUEST });
|
26
26
|
|
27
27
|
const params = {
|
@@ -30,19 +30,19 @@ export const getAnsibleRoles = (
|
|
30
30
|
...propsToSnakeCase({ resourceId, resourceName }),
|
31
31
|
};
|
32
32
|
|
33
|
-
|
34
|
-
.get(url, {}, params)
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
)
|
45
|
-
|
33
|
+
try {
|
34
|
+
const res = await api.get(url, {}, params);
|
35
|
+
return dispatch({
|
36
|
+
type: ANSIBLE_ROLES_SUCCESS,
|
37
|
+
payload: {
|
38
|
+
initialAssignedRoles,
|
39
|
+
inheritedRoleIds,
|
40
|
+
...propsToCamelCase(res.data),
|
41
|
+
},
|
42
|
+
});
|
43
|
+
} catch (error) {
|
44
|
+
return dispatch(errorHandler(ANSIBLE_ROLES_FAILURE, error));
|
45
|
+
}
|
46
46
|
};
|
47
47
|
|
48
48
|
const errorHandler = (msg, err) => {
|
@@ -1,4 +1,4 @@
|
|
1
|
-
import { testComponentSnapshotsWithFixtures } from '
|
1
|
+
import { testComponentSnapshotsWithFixtures } from '@theforeman/test';
|
2
2
|
|
3
3
|
import AnsibleRolesSwitcher from '../AnsibleRolesSwitcher';
|
4
4
|
|
@@ -19,10 +19,10 @@ const fixtures = {
|
|
19
19
|
assignedRolesCount: 2,
|
20
20
|
assignedRoles: [],
|
21
21
|
unassignedRoles: [],
|
22
|
-
|
23
|
-
initialAssignedRoles: [],
|
24
|
-
},
|
22
|
+
initialAssignedRoles: [],
|
25
23
|
error: { statusText: '', errorMsg: '' },
|
24
|
+
allAssignedRoles: [],
|
25
|
+
availableRolesUrl: 'http://test/roles',
|
26
26
|
},
|
27
27
|
};
|
28
28
|
|
@@ -1,4 +1,4 @@
|
|
1
|
-
import { testReducerSnapshotWithFixtures } from '
|
1
|
+
import { testReducerSnapshotWithFixtures } from '@theforeman/test';
|
2
2
|
|
3
3
|
import reducer, { initialState } from '../AnsibleRolesSwitcherReducer';
|
4
4
|
import { ansibleRolesLong } from '../__fixtures__/ansibleRolesData.fixtures';
|
@@ -1,4 +1,4 @@
|
|
1
|
-
import { testComponentSnapshotsWithFixtures } from '
|
1
|
+
import { testComponentSnapshotsWithFixtures } from '@theforeman/test';
|
2
2
|
import AnsiblePermissionDenied from './AnsiblePermissionDenied';
|
3
3
|
|
4
4
|
jest.mock('foremanReact/components/common/EmptyState');
|
data/webpack/index.js
CHANGED
@@ -1,12 +1,9 @@
|
|
1
|
-
import $ from 'jquery';
|
2
1
|
import componentRegistry from 'foremanReact/components/componentRegistry';
|
3
2
|
import injectReducer from 'foremanReact/redux/reducers/registerReducer';
|
4
3
|
import ReportJsonViewer from './components/ReportJsonViewer';
|
5
4
|
import AnsibleRolesSwitcher from './components/AnsibleRolesSwitcher';
|
6
5
|
import reducer from './reducer';
|
7
6
|
|
8
|
-
const { tfm } = window;
|
9
|
-
|
10
7
|
componentRegistry.register({
|
11
8
|
name: 'ReportJsonViewer',
|
12
9
|
type: ReportJsonViewer,
|
@@ -17,13 +14,3 @@ componentRegistry.register({
|
|
17
14
|
});
|
18
15
|
|
19
16
|
injectReducer('foremanAnsible', reducer);
|
20
|
-
|
21
|
-
tfm.initAnsibleRoleSwitcher = () => {
|
22
|
-
$(document).on('ContentLoad', evt => {
|
23
|
-
tfm.reactMounter.mount(
|
24
|
-
'AnsibleRolesSwitcher',
|
25
|
-
'#ansible_roles_switcher',
|
26
|
-
$('#ansible_roles_switcher').data('roles')
|
27
|
-
);
|
28
|
-
});
|
29
|
-
};
|
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: 6.
|
4
|
+
version: 6.2.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:
|
11
|
+
date: 2021-02-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: foreman_ansible_core
|
@@ -44,14 +44,14 @@ dependencies:
|
|
44
44
|
requirements:
|
45
45
|
- - ">="
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: 4.
|
47
|
+
version: 4.2.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: 4.
|
54
|
+
version: 4.2.0
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: ipaddress
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -182,6 +182,7 @@ files:
|
|
182
182
|
- app/views/foreman_ansible/job_templates/run_command_-_ansible_default.erb
|
183
183
|
- app/views/foreman_ansible/job_templates/run_playbook-ansible_default.erb
|
184
184
|
- app/views/foreman_ansible/job_templates/service_action_-_ansible_default.erb
|
185
|
+
- app/views/foreman_ansible/job_templates/service_action_-_enable_web_console.erb
|
185
186
|
- app/views/ui_ansible_roles/index.json.rabl
|
186
187
|
- app/views/ui_ansible_roles/main.json.rabl
|
187
188
|
- app/views/ui_ansible_roles/show.json.rabl
|
@@ -327,7 +328,6 @@ files:
|
|
327
328
|
- webpack/components/ReportJsonViewer.js
|
328
329
|
- webpack/index.js
|
329
330
|
- webpack/reducer.js
|
330
|
-
- webpack/test_setup.js
|
331
331
|
homepage: https://github.com/theforeman/foreman_ansible
|
332
332
|
licenses:
|
333
333
|
- GPL-3.0
|
@@ -347,28 +347,31 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
347
347
|
- !ruby/object:Gem::Version
|
348
348
|
version: '0'
|
349
349
|
requirements: []
|
350
|
-
rubygems_version: 3.
|
350
|
+
rubygems_version: 3.1.2
|
351
351
|
signing_key:
|
352
352
|
specification_version: 4
|
353
353
|
summary: Ansible integration with Foreman (theforeman.org)
|
354
354
|
test_files:
|
355
355
|
- test/factories/ansible_proxy.rb
|
356
|
-
- test/factories/ansible_roles.rb
|
357
356
|
- test/factories/ansible_variables.rb
|
357
|
+
- test/factories/ansible_roles.rb
|
358
358
|
- test/fixtures/insights_playbook.yaml
|
359
|
-
- test/fixtures/sample_facts.json
|
360
359
|
- test/fixtures/report.json
|
360
|
+
- test/fixtures/sample_facts.json
|
361
|
+
- test/functional/ansible_roles_controller_test.rb
|
362
|
+
- test/functional/api/v2/ansible_inventories_controller_test.rb
|
361
363
|
- test/functional/api/v2/ansible_roles_controller_test.rb
|
364
|
+
- test/functional/api/v2/ansible_variables_controller_test.rb
|
362
365
|
- test/functional/api/v2/hostgroups_controller_test.rb
|
363
366
|
- test/functional/api/v2/hosts_controller_test.rb
|
364
|
-
- test/functional/api/v2/ansible_inventories_controller_test.rb
|
365
|
-
- test/functional/api/v2/ansible_variables_controller_test.rb
|
366
|
-
- test/functional/ansible_roles_controller_test.rb
|
367
|
-
- test/functional/ansible_variables_controller_test.rb
|
368
367
|
- test/functional/ui_ansible_roles_controller_test.rb
|
368
|
+
- test/functional/ansible_variables_controller_test.rb
|
369
369
|
- test/functional/hosts_controller_test.rb
|
370
|
+
- test/test_plugin_helper.rb
|
370
371
|
- test/unit/actions/run_ansible_job_test.rb
|
371
372
|
- test/unit/actions/run_proxy_ansible_command_test.rb
|
373
|
+
- test/unit/ansible_role_test.rb
|
374
|
+
- test/unit/ansible_variable_test.rb
|
372
375
|
- test/unit/concerns/config_reports_extensions_test.rb
|
373
376
|
- test/unit/concerns/host_managed_extensions_test.rb
|
374
377
|
- test/unit/concerns/hostgroup_extensions_test.rb
|
@@ -377,20 +380,17 @@ test_files:
|
|
377
380
|
- test/unit/lib/foreman_ansible_core/ansible_runner_test.rb
|
378
381
|
- test/unit/lib/foreman_ansible_core/playbook_runner_test.rb
|
379
382
|
- test/unit/lib/proxy_api/ansible_test.rb
|
383
|
+
- test/unit/services/ansible_report_importer_test.rb
|
380
384
|
- test/unit/services/api_roles_importer_test.rb
|
385
|
+
- test/unit/services/fact_importer_test.rb
|
386
|
+
- test/unit/services/fact_parser_test.rb
|
381
387
|
- test/unit/services/fact_sparser_test.rb
|
382
388
|
- test/unit/services/insights_plan_runner_test.rb
|
383
389
|
- test/unit/services/roles_importer_test.rb
|
384
390
|
- test/unit/services/structured_fact_importer_test.rb
|
385
|
-
- test/unit/services/ui_roles_importer_test.rb
|
386
|
-
- test/unit/services/ansible_report_importer_test.rb
|
387
|
-
- test/unit/services/fact_importer_test.rb
|
388
|
-
- test/unit/services/fact_parser_test.rb
|
389
391
|
- test/unit/services/ansible_variables_importer_test.rb
|
390
392
|
- test/unit/services/inventory_creator_test.rb
|
391
|
-
- test/unit/
|
393
|
+
- test/unit/services/ui_roles_importer_test.rb
|
394
|
+
- test/unit/ansible_provider_test.rb
|
392
395
|
- test/unit/host_ansible_role_test.rb
|
393
396
|
- test/unit/hostgroup_ansible_role_test.rb
|
394
|
-
- test/unit/ansible_variable_test.rb
|
395
|
-
- test/unit/ansible_provider_test.rb
|
396
|
-
- test/test_plugin_helper.rb
|
data/webpack/test_setup.js
DELETED
@@ -1,12 +0,0 @@
|
|
1
|
-
import 'core-js/shim';
|
2
|
-
import 'regenerator-runtime/runtime';
|
3
|
-
|
4
|
-
import { configure } from 'enzyme';
|
5
|
-
import Adapter from 'enzyme-adapter-react-16';
|
6
|
-
|
7
|
-
configure({ adapter: new Adapter() });
|
8
|
-
|
9
|
-
// Mocking translation function
|
10
|
-
global.__ = str => str;
|
11
|
-
global.n__ = str => str;
|
12
|
-
global.Jed = { sprintf: str => str };
|