foreman_ansible 6.2.0 → 6.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (131) hide show
  1. checksums.yaml +4 -4
  2. data/app/controllers/ansible_roles_controller.rb +12 -8
  3. data/app/controllers/ansible_variables_controller.rb +4 -0
  4. data/app/controllers/api/v2/ansible_roles_controller.rb +32 -11
  5. data/app/controllers/api/v2/ansible_variables_controller.rb +6 -4
  6. data/app/controllers/foreman_ansible/concerns/import_controller_helper.rb +3 -3
  7. data/app/helpers/foreman_ansible/ansible_reports_helper.rb +8 -0
  8. data/app/helpers/foreman_ansible/ansible_roles_data_preparations.rb +95 -0
  9. data/app/helpers/foreman_ansible/ansible_roles_helper.rb +20 -1
  10. data/app/jobs/sync_roles_and_variables.rb +20 -0
  11. data/app/models/concerns/foreman_ansible/host_managed_extensions.rb +7 -4
  12. data/app/models/concerns/foreman_ansible/hostgroup_extensions.rb +7 -4
  13. data/app/models/foreman_ansible/ansible_provider.rb +2 -1
  14. data/app/models/host_ansible_role.rb +1 -0
  15. data/app/models/hostgroup_ansible_role.rb +1 -0
  16. data/app/models/setting/ansible.rb +9 -0
  17. data/app/services/foreman_ansible/ansible_report_importer.rb +4 -0
  18. data/app/services/foreman_ansible/ansible_report_scanner.rb +15 -1
  19. data/app/services/foreman_ansible/api_roles_importer.rb +23 -11
  20. data/app/services/foreman_ansible/fact_parser.rb +21 -1
  21. data/app/services/foreman_ansible/import_roles_and_variables_error_notification.rb +31 -0
  22. data/app/services/foreman_ansible/import_roles_and_variables_success_notification.rb +26 -0
  23. data/app/services/foreman_ansible/inventory_creator.rb +3 -7
  24. data/app/services/foreman_ansible/roles_importer.rb +3 -2
  25. data/app/services/foreman_ansible/ui_roles_importer.rb +2 -2
  26. data/app/services/foreman_ansible/variables_importer.rb +32 -2
  27. data/app/views/ansible_roles/import.html.erb +10 -50
  28. data/app/views/ansible_variables/index.html.erb +1 -2
  29. data/app/views/api/v2/ansible_roles/sync.json.rabl +5 -0
  30. data/app/views/foreman_ansible/ansible_roles/_select_tab_content.html.erb +1 -2
  31. data/app/views/foreman_ansible/config_reports/_ansible.html.erb +13 -6
  32. data/app/views/foreman_ansible/job_templates/ansible_collections_-_install_from_galaxy.erb +28 -0
  33. data/app/views/foreman_ansible/job_templates/convert_to_rhel.erb +44 -0
  34. data/config/routes.rb +5 -4
  35. data/db/migrate/20210120150019_add_position_to_ansible_role.rb +27 -0
  36. data/db/seeds.d/100_common_parameters.rb +7 -0
  37. data/db/seeds.d/90_notification_blueprints.rb +19 -1
  38. data/lib/foreman_ansible/engine.rb +1 -0
  39. data/lib/foreman_ansible/register.rb +5 -5
  40. data/lib/foreman_ansible/version.rb +1 -1
  41. data/locale/ca/LC_MESSAGES/foreman_ansible.mo +0 -0
  42. data/locale/ca/foreman_ansible.po +1 -1
  43. data/locale/cs_CZ/LC_MESSAGES/foreman_ansible.mo +0 -0
  44. data/locale/cs_CZ/foreman_ansible.po +1 -1
  45. data/locale/de/LC_MESSAGES/foreman_ansible.mo +0 -0
  46. data/locale/de/foreman_ansible.po +1 -1
  47. data/locale/en/LC_MESSAGES/foreman_ansible.mo +0 -0
  48. data/locale/en/foreman_ansible.po +1 -1
  49. data/locale/en_GB/LC_MESSAGES/foreman_ansible.mo +0 -0
  50. data/locale/en_GB/foreman_ansible.po +1 -1
  51. data/locale/es/LC_MESSAGES/foreman_ansible.mo +0 -0
  52. data/locale/es/foreman_ansible.po +1 -1
  53. data/locale/fr/LC_MESSAGES/foreman_ansible.mo +0 -0
  54. data/locale/fr/foreman_ansible.po +1 -1
  55. data/locale/gl/LC_MESSAGES/foreman_ansible.mo +0 -0
  56. data/locale/gl/foreman_ansible.po +1 -1
  57. data/locale/it/LC_MESSAGES/foreman_ansible.mo +0 -0
  58. data/locale/it/foreman_ansible.po +1 -1
  59. data/locale/ja/LC_MESSAGES/foreman_ansible.mo +0 -0
  60. data/locale/ja/foreman_ansible.po +1 -1
  61. data/locale/ko/LC_MESSAGES/foreman_ansible.mo +0 -0
  62. data/locale/ko/foreman_ansible.po +1 -1
  63. data/locale/nl_NL/LC_MESSAGES/foreman_ansible.mo +0 -0
  64. data/locale/nl_NL/foreman_ansible.po +1 -1
  65. data/locale/pl/LC_MESSAGES/foreman_ansible.mo +0 -0
  66. data/locale/pl/foreman_ansible.po +1 -1
  67. data/locale/pt_BR/LC_MESSAGES/foreman_ansible.mo +0 -0
  68. data/locale/pt_BR/foreman_ansible.po +1 -1
  69. data/locale/ru/LC_MESSAGES/foreman_ansible.mo +0 -0
  70. data/locale/ru/foreman_ansible.po +1 -1
  71. data/locale/sv_SE/LC_MESSAGES/foreman_ansible.mo +0 -0
  72. data/locale/sv_SE/foreman_ansible.po +1 -1
  73. data/locale/zh_CN/LC_MESSAGES/foreman_ansible.mo +0 -0
  74. data/locale/zh_CN/foreman_ansible.po +1 -1
  75. data/locale/zh_TW/LC_MESSAGES/foreman_ansible.mo +0 -0
  76. data/locale/zh_TW/foreman_ansible.po +1 -1
  77. data/test/factories/ansible_roles.rb +12 -0
  78. data/test/factories/host_ansible_enhancements.rb +23 -0
  79. data/test/foreman_ansible/helpers/ansible_roles_helper_test.rb +45 -0
  80. data/test/functional/ansible_variables_controller_test.rb +0 -15
  81. data/test/functional/api/v2/ansible_roles_controller_test.rb +23 -0
  82. data/test/functional/api/v2/hostgroups_controller_test.rb +5 -4
  83. data/test/functional/api/v2/hosts_controller_test.rb +9 -8
  84. data/test/functional/hosts_controller_test.rb +10 -6
  85. data/test/unit/concerns/host_managed_extensions_test.rb +17 -3
  86. data/test/unit/concerns/hostgroup_extensions_test.rb +13 -7
  87. data/test/unit/host_ansible_role_test.rb +2 -1
  88. data/test/unit/hostgroup_ansible_role_test.rb +2 -1
  89. data/test/unit/ignore_roles_test.rb +43 -0
  90. data/test/unit/import_roles_and_variables.rb +60 -0
  91. data/test/unit/services/api_roles_importer_test.rb +22 -5
  92. data/test/unit/services/fact_parser_test.rb +16 -0
  93. data/test/unit/services/inventory_creator_test.rb +15 -7
  94. data/test/unit/services/ui_roles_importer_test.rb +2 -2
  95. data/webpack/__mocks__/foremanReact/common/helpers.js +13 -0
  96. data/webpack/__mocks__/foremanReact/components/common/forms/OrderableSelect/helpers.js +5 -0
  97. data/webpack/__mocks__/foremanReact/redux/API.js +7 -0
  98. data/webpack/components/AnsibleRolesAndVariables/AnsibleRolesAndVariables.js +178 -0
  99. data/webpack/components/AnsibleRolesAndVariables/AnsibleRolesAndVariables.scss +9 -0
  100. data/webpack/components/AnsibleRolesAndVariables/AnsibleRolesAndVariablesActions.js +39 -0
  101. data/webpack/components/AnsibleRolesAndVariables/AnsibleRolesAndVariablesConstants.js +4 -0
  102. data/webpack/components/AnsibleRolesAndVariables/AnsibleRolesAndVariablesHelpers.js +11 -0
  103. data/webpack/components/AnsibleRolesAndVariables/__test__/AnsibleRolesAndVariablesHelpers.test.js +50 -0
  104. data/webpack/components/AnsibleRolesAndVariables/__test__/AnsibleRolesAndVariablesImport.test.js +39 -0
  105. data/webpack/components/AnsibleRolesAndVariables/__test__/__snapshots__/AnsibleRolesAndVariablesImport.test.js.snap +177 -0
  106. data/webpack/components/AnsibleRolesAndVariables/index.js +31 -0
  107. data/webpack/components/AnsibleRolesSwitcher/AnsibleRolesSwitcher.js +14 -18
  108. data/webpack/components/AnsibleRolesSwitcher/AnsibleRolesSwitcher.scss +1 -1
  109. data/webpack/components/AnsibleRolesSwitcher/AnsibleRolesSwitcherActions.js +6 -0
  110. data/webpack/components/AnsibleRolesSwitcher/AnsibleRolesSwitcherConstants.js +1 -2
  111. data/webpack/components/AnsibleRolesSwitcher/AnsibleRolesSwitcherReducer.js +13 -8
  112. data/webpack/components/AnsibleRolesSwitcher/AnsibleRolesSwitcherSelectors.js +8 -28
  113. data/webpack/components/AnsibleRolesSwitcher/__fixtures__/ansibleRolesSwitcherReducer.fixtures.js +1 -0
  114. data/webpack/components/AnsibleRolesSwitcher/__tests__/AnsibleRolesSwitcher.test.js +2 -0
  115. data/webpack/components/AnsibleRolesSwitcher/__tests__/AnsibleRolesSwitcherReducer.test.js +0 -8
  116. data/webpack/components/AnsibleRolesSwitcher/__tests__/AnsibleRolesSwitcherSelectors.test.js +2 -15
  117. data/webpack/components/AnsibleRolesSwitcher/__tests__/__snapshots__/AnsibleRolesSwitcher.test.js.snap +4 -9
  118. data/webpack/components/AnsibleRolesSwitcher/__tests__/__snapshots__/AnsibleRolesSwitcherReducer.test.js.snap +8 -97
  119. data/webpack/components/AnsibleRolesSwitcher/__tests__/__snapshots__/AnsibleRolesSwitcherSelectors.test.js.snap +5 -30
  120. data/webpack/components/AnsibleRolesSwitcher/components/AnsibleRole.js +5 -2
  121. data/webpack/components/AnsibleRolesSwitcher/components/AnsibleRoleInputs.js +43 -0
  122. data/webpack/components/AnsibleRolesSwitcher/components/AnsibleRoleInputs.test.js +19 -0
  123. data/webpack/components/AnsibleRolesSwitcher/components/AssignedRolesList.js +63 -51
  124. data/webpack/components/AnsibleRolesSwitcher/components/AssignedRolesList.test.js +3 -0
  125. data/webpack/components/AnsibleRolesSwitcher/components/OrderedRolesTooltip.js +23 -0
  126. data/webpack/components/AnsibleRolesSwitcher/components/__snapshots__/AnsibleRoleInputs.test.js.snap +51 -0
  127. data/webpack/components/AnsibleRolesSwitcher/components/__snapshots__/AssignedRolesList.test.js.snap +28 -28
  128. data/webpack/components/AnsibleRolesSwitcher/index.js +3 -7
  129. data/webpack/index.js +6 -0
  130. metadata +55 -9
  131. data/app/views/ansible_variables/import.html.erb +0 -56
@@ -0,0 +1,23 @@
1
+ FactoryBot.modify do
2
+ factory :host do
3
+ trait :with_ansible_roles do
4
+ transient do
5
+ roles_count { 2 }
6
+ end
7
+ after(:build) do |host, evaluator|
8
+ host.host_ansible_roles = FactoryBot.build_list(:host_ansible_role, evaluator.roles_count, host: host)
9
+ end
10
+ end
11
+ end
12
+
13
+ factory :hostgroup do
14
+ trait :with_ansible_roles do
15
+ transient do
16
+ roles_count { 2 }
17
+ end
18
+ after(:build) do |hostgroup, evaluator|
19
+ hostgroup.hostgroup_ansible_roles = FactoryBot.build_list(:hostgroup_ansible_role, evaluator.roles_count, hostgroup: hostgroup)
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,45 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'test_plugin_helper'
4
+
5
+ class AnsibleRolesHelperTest < ActiveSupport::TestCase
6
+ include ForemanAnsible::AnsibleRolesHelper
7
+
8
+ describe '#role_attributes_for_roles_switcher' do
9
+ let(:hg_with_roles) { FactoryBot.create(:hostgroup, :with_ansible_roles) }
10
+
11
+ context 'with hostgroup' do
12
+ let(:child) { FactoryBot.build(:hostgroup, :with_ansible_roles, parent: hg_with_roles) }
13
+
14
+ it 'show inherited and positioned own roles' do
15
+ role_attributes = role_attributes_for_roles_switcher(child)
16
+ expected_ids = hg_with_roles.ansible_roles.pluck(:id) + child.hostgroup_ansible_roles.map(&:ansible_role_id)
17
+ assert_equal(expected_ids, role_attributes.map { |ra| ra[:id] })
18
+ end
19
+
20
+ it 'includes inherited roles just once' do
21
+ child.host_ansible_roles << FactoryBot.build(:hostgroup_ansible_role, hostgroup: child, ansible_role: hg_with_roles.ansible_roles.first)
22
+ role_attributes = role_attributes_for_roles_switcher(child)
23
+ expected_ids = hg_with_roles.ansible_roles.pluck(:id) + child.hostgroup_ansible_roles.map(&:ansible_role_id)
24
+ assert_equal(expected_ids.uniq, role_attributes.map { |ra| ra[:id] })
25
+ end
26
+ end
27
+
28
+ context 'with host' do
29
+ let(:host_new) { FactoryBot.build(:host, :with_ansible_roles, hostgroup: hg_with_roles) }
30
+
31
+ it 'show inherited and positioned own roles' do
32
+ role_attributes = role_attributes_for_roles_switcher(host_new)
33
+ expected_ids = hg_with_roles.ansible_roles.pluck(:id) + host_new.host_ansible_roles.map(&:ansible_role_id)
34
+ assert_equal(expected_ids, role_attributes.map { |ra| ra[:id] })
35
+ end
36
+
37
+ it 'includes inherited roles just once' do
38
+ host_new.host_ansible_roles << FactoryBot.build(:host_ansible_role, host: host_new, ansible_role: hg_with_roles.ansible_roles.first)
39
+ role_attributes = role_attributes_for_roles_switcher(host_new)
40
+ expected_ids = hg_with_roles.ansible_roles.pluck(:id) + host_new.host_ansible_roles.map(&:ansible_role_id)
41
+ assert_equal(expected_ids.uniq, role_attributes.map { |ra| ra[:id] })
42
+ end
43
+ end
44
+ end
45
+ end
@@ -34,21 +34,6 @@ class AnsibleVariablesControllerTest < ActionController::TestCase
34
34
  assert_redirected_to ansible_variables_url
35
35
  end
36
36
 
37
- test 'should show import page' do
38
- ForemanAnsible::UiRolesImporter.any_instance.
39
- expects(:import_role_names).returns({})
40
-
41
- ForemanAnsible::VariablesImporter.any_instance.
42
- expects(:import_variable_names).returns({
43
- :obsolete => [@model]
44
- })
45
-
46
- get :import,
47
- :params => { :proxy => @proxy.id },
48
- :session => set_session_user
49
- assert_response :success
50
- end
51
-
52
37
  test 'should create ansible variable' do
53
38
  params = { :ansible_variable => { :key => 'great name', :ansible_role_id => FactoryBot.create(:ansible_role).id } }
54
39
  assert_difference('AnsibleVariable.count', 1) do
@@ -45,7 +45,30 @@ module Api
45
45
  }, :session => set_session_user
46
46
  assert_response :success
47
47
  end
48
+
48
49
  test 'should fetch' do
50
+ @controller = Api::V2::AnsibleRolesController.new
51
+ @controller.stubs(:prepare_ansible_import_rows).returns(
52
+ [{
53
+ :name => 'test_user.test_name',
54
+ :id => nil,
55
+ :role_action => 'Import Role',
56
+ :variables => 'Add: 7',
57
+ :hosts_count => '',
58
+ :hostgroup_count => '',
59
+ :kind => 'new'
60
+ },
61
+ {
62
+ :name => 'some_user.some_role',
63
+ :id => nil,
64
+ :role_action => 'Import Role',
65
+ :variables => 'Add: 3',
66
+ :hosts_count => '',
67
+ :hostgroup_count => '',
68
+ :kind => 'new'
69
+ }]
70
+ )
71
+
49
72
  get :fetch, :params => {
50
73
  :proxy_id => @proxy.id
51
74
  }, :session => set_session_user
@@ -9,6 +9,7 @@ module Api
9
9
  class HostgroupsControllerTest < ActionController::TestCase
10
10
  setup do
11
11
  @ansible_role1 = FactoryBot.create(:ansible_role)
12
+ @ansible_role2 = FactoryBot.create(:ansible_role)
12
13
  @host1 = FactoryBot.create(:host, :with_hostgroup)
13
14
  @host2 = FactoryBot.create(:host, :with_hostgroup)
14
15
  @host3 = FactoryBot.create(:host, :with_hostgroup)
@@ -44,23 +45,23 @@ module Api
44
45
  end
45
46
 
46
47
  test 'should list ansible roles for a host group' do
47
- @host3.hostgroup.ansible_roles = [@ansible_role1]
48
+ FactoryBot.create(:hostgroup_ansible_role, hostgroup_id: @host3.hostgroup.id, ansible_role_id: @ansible_role1.id, position: 0)
48
49
  get :ansible_roles, :params => { :id => @host3.hostgroup.id }
49
50
  response = JSON.parse(@response.body)
50
51
  assert_equal @ansible_role1.id, response.first['id']
51
52
  end
52
53
 
53
- test 'should assign a role to a hostgroup' do
54
+ test 'should assign a role to a hostgroup with a correct ordering' do
54
55
  hostgroup = FactoryBot.create(:hostgroup,
55
56
  :ansible_role_ids => [])
56
57
  post :assign_ansible_roles,
57
58
  :params => {
58
59
  :id => hostgroup.id,
59
- :ansible_role_ids => [@ansible_role1.id]
60
+ :ansible_role_ids => [@ansible_role2.id, @ansible_role1.id]
60
61
  },
61
62
  :session => set_session_user
62
63
  assert_response :success
63
- assert assigns('hostgroup').ansible_roles, [@ansible_role1]
64
+ assert_equal assigns('hostgroup').ansible_roles, [@ansible_role2, @ansible_role1]
64
65
  end
65
66
  end
66
67
  end
@@ -53,9 +53,9 @@ module Api
53
53
  end
54
54
 
55
55
  test 'should update a host with ansible_role_ids param' do
56
- host = FactoryBot.create(:host,
57
- :managed => false,
58
- :ansible_role_ids => [@ansible_role1.id])
56
+ host = FactoryBot.create(:host, :managed => false)
57
+ FactoryBot.create(:host_ansible_role, :host_id => host.id, :ansible_role_id => @ansible_role1.id, :position => 0)
58
+
59
59
  post :update,
60
60
  :params => {
61
61
  :id => host.id,
@@ -63,28 +63,29 @@ module Api
63
63
  },
64
64
  :session => set_session_user
65
65
  assert_response :success
66
- assert assigns('host').ansible_roles, [@ansible_role2]
66
+ host.reload
67
+ assert_equal host.ansible_roles, [@ansible_role2]
67
68
  end
68
69
 
69
70
  test 'should list ansible roles for a host' do
70
- @host3.ansible_roles = [@ansible_role1]
71
+ FactoryBot.create(:host_ansible_role, :host_id => @host3.id, :ansible_role_id => @ansible_role1.id, :position => 0)
71
72
  get :ansible_roles, :params => { :id => @host3.id }
72
73
  response = JSON.parse(@response.body)
73
74
  assert_equal @ansible_role1.id, response.first['id']
74
75
  end
75
76
 
76
- test 'should assign a role to a host' do
77
+ test 'should assign a role to a host with a correct ordering' do
77
78
  host = FactoryBot.create(:host,
78
79
  :managed => false,
79
80
  :ansible_role_ids => [])
80
81
  post :assign_ansible_roles,
81
82
  :params => {
82
83
  :id => host.id,
83
- :ansible_role_ids => [@ansible_role1.id]
84
+ :ansible_role_ids => [@ansible_role2.id, @ansible_role1.id]
84
85
  },
85
86
  :session => set_session_user
86
87
  assert_response :success
87
- assert assigns('host').ansible_roles, [@ansible_role1]
88
+ assert_equal assigns('host').ansible_roles, [@ansible_role2, @ansible_role1]
88
89
  end
89
90
  end
90
91
  end
@@ -16,7 +16,9 @@ class HostsControllerExtensionsTest < ActionController::TestCase
16
16
  test 'create a host with ansible roles' do
17
17
  host = { :name => 'foo',
18
18
  :managed => false,
19
- :ansible_role_ids => [@role.id] }
19
+ :host_ansible_roles_attributes => {
20
+ 0 => { :ansible_role_id => @role.id, :position => 0 }
21
+ } }
20
22
  post :create, :params => { :host => host }, :session => set_session_user
21
23
  assert_redirected_to host_url(assigns('host'))
22
24
  assert assigns('host').ansible_roles, [@role]
@@ -27,17 +29,19 @@ class HostsControllerExtensionsTest < ActionController::TestCase
27
29
  post :update,
28
30
  :params => {
29
31
  :id => host.id,
30
- :host => { :ansible_role_ids => [@role.id] }
32
+ :host => { :host_ansible_roles_attributes => {
33
+ 0 => { :ansible_role_id => @role.id, :position => 0 }
34
+ } }
31
35
  },
32
36
  :session => set_session_user
33
37
  assert_redirected_to host_url(assigns('host'))
34
- assert assigns('host').ansible_roles, [@role]
38
+ assert_equal assigns('host').ansible_roles, [@role]
35
39
  end
36
40
 
37
41
  test 'delete a host with ansible roles' do
38
- host = FactoryBot.create(:host,
39
- :managed => false,
40
- :ansible_roles => [@role])
42
+ host = FactoryBot.create(:host, :managed => false)
43
+ FactoryBot.create(:host_ansible_role, host_id: host.id, ansible_role_id: @role.id, position: 0)
44
+
41
45
  assert_include @role.hosts, host
42
46
  delete :destroy,
43
47
  :params => { :id => host.id },
@@ -9,8 +9,8 @@ class HostManagedExtensionsTest < ActiveSupport::TestCase
9
9
  @role2 = FactoryBot.create(:ansible_role)
10
10
  @role3 = FactoryBot.create(:ansible_role)
11
11
 
12
- @hostgroup_parent = FactoryBot.create(:hostgroup,
13
- :ansible_roles => [@role2])
12
+ @hostgroup_parent = FactoryBot.create(:hostgroup)
13
+ FactoryBot.create(:hostgroup_ansible_role, hostgroup_id: @hostgroup_parent.id, ansible_role_id: @role2.id)
14
14
  @hostgroup = FactoryBot.create(:hostgroup, :parent => @hostgroup_parent)
15
15
  @host = FactoryBot.build_stubbed(:host, :ansible_roles => [@role1])
16
16
  @another_host = FactoryBot.build_stubbed(:host, :ansible_roles => [@role3])
@@ -23,7 +23,7 @@ class HostManagedExtensionsTest < ActiveSupport::TestCase
23
23
 
24
24
  test 'returns assigned and inherited roles for host with a hostgroup' do
25
25
  @host.hostgroup = @hostgroup
26
- @host.all_ansible_roles.must_equal [@role1, @role2]
26
+ @host.all_ansible_roles.must_equal [@role2, @role1]
27
27
  end
28
28
  end
29
29
 
@@ -48,4 +48,18 @@ class HostManagedExtensionsTest < ActiveSupport::TestCase
48
48
  assert Host::Managed.import_host('192.168.128.27').new_record?
49
49
  end
50
50
  end
51
+
52
+ test 'should correctly order roles for host' do
53
+ host = FactoryBot.create(:host)
54
+ FactoryBot.create(:host_ansible_role, :ansible_role_id => @role1.id, :position => 1, :host_id => host.id)
55
+ FactoryBot.create(:host_ansible_role, :ansible_role_id => @role2.id, :position => 2, :host_id => host.id)
56
+ FactoryBot.create(:host_ansible_role, :ansible_role_id => @role3.id, :position => 0, :host_id => host.id)
57
+ host.ansible_roles.must_equal [@role3, @role1, @role2]
58
+ end
59
+
60
+ test 'should order hostgroup roles before host roles' do
61
+ host = FactoryBot.create(:host, :hostgroup => @hostgroup)
62
+ FactoryBot.create(:host_ansible_role, :ansible_role_id => @role1.id, :position => 0, :host_id => host.id)
63
+ host.all_ansible_roles.must_equal [@role2, @role1]
64
+ end
51
65
  end
@@ -9,22 +9,23 @@ class HostgroupExtensionsTest < ActiveSupport::TestCase
9
9
  @role2 = FactoryBot.create(:ansible_role)
10
10
  @role3 = FactoryBot.create(:ansible_role)
11
11
 
12
- @hostgroup_parent = FactoryBot.create(:hostgroup,
13
- :ansible_roles => [@role2])
14
- @hostgroup = FactoryBot.create(:hostgroup, :ansible_roles => [@role1])
15
- @host = FactoryBot.create(:host,
16
- :ansible_roles => [@role3],
17
- :hostgroup => @hostgroup)
12
+ @hostgroup_parent = FactoryBot.create(:hostgroup)
13
+ FactoryBot.create(:hostgroup_ansible_role, :hostgroup_id => @hostgroup_parent.id, :ansible_role_id => @role2.id, :position => 1)
14
+ @hostgroup = FactoryBot.create(:hostgroup)
15
+ FactoryBot.create(:hostgroup_ansible_role, :hostgroup_id => @hostgroup.id, :ansible_role_id => @role1.id, :position => 10)
16
+ @host = FactoryBot.create(:host, :hostgroup => @hostgroup)
17
+ FactoryBot.create(:host_ansible_role, :host_id => @host.id, :ansible_role_id => @role3.id)
18
18
  end
19
19
 
20
20
  describe '#all_ansible_roles' do
21
21
  test 'returns assigned roles without any parent hostgroup' do
22
+ @hostgroup.host_ansible_roles
22
23
  @hostgroup.all_ansible_roles.must_equal [@role1, @role3]
23
24
  end
24
25
 
25
26
  test 'returns assigned and inherited roles with from parent hostgroup' do
26
27
  @hostgroup.parent = @hostgroup_parent
27
- @hostgroup.all_ansible_roles.must_equal [@role1, @role2, @role3]
28
+ @hostgroup.all_ansible_roles.must_equal [@role2, @role1, @role3]
28
29
  end
29
30
  end
30
31
 
@@ -49,4 +50,9 @@ class HostgroupExtensionsTest < ActiveSupport::TestCase
49
50
  @hostgroup.inherited_and_own_ansible_roles.must_equal [@role2, @role1]
50
51
  end
51
52
  end
53
+
54
+ test 'should return ordered roles for hostgroup' do
55
+ @hostgroup.parent = @hostgroup_parent
56
+ @hostgroup.inherited_and_own_ansible_roles.must_equal [@role2, @role1]
57
+ end
52
58
  end
@@ -12,7 +12,8 @@ class HostAnsibleRoleTest < ActiveSupport::TestCase
12
12
  describe 'uniqueness' do
13
13
  subject do
14
14
  HostAnsibleRole.new(:host => FactoryBot.build(:host),
15
- :ansible_role => FactoryBot.build(:ansible_role))
15
+ :ansible_role => FactoryBot.build(:ansible_role),
16
+ :position => 0)
16
17
  end
17
18
  should validate_uniqueness_of(:ansible_role_id).scoped_to(:host_id)
18
19
  end
@@ -13,7 +13,8 @@ class HostgroupAnsibleRoleTest < ActiveSupport::TestCase
13
13
  subject do
14
14
  HostgroupAnsibleRole.new(
15
15
  :hostgroup => FactoryBot.build(:hostgroup),
16
- :ansible_role => FactoryBot.build(:ansible_role)
16
+ :ansible_role => FactoryBot.build(:ansible_role),
17
+ :position => 0
17
18
  )
18
19
  end
19
20
  should validate_uniqueness_of(:ansible_role_id).scoped_to(:hostgroup_id)
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'test_plugin_helper'
4
+
5
+ # Tests for testing the ignore list
6
+ class IgnoreRolesTest < ActiveSupport::TestCase
7
+ include ForemanAnsible::AnsibleRolesDataPreparations
8
+
9
+ role1 = AnsibleRole.new(:name => 'foo')
10
+ role2 = AnsibleRole.new(:name => 'bar')
11
+ role3 = AnsibleRole.new(:name => 'hello.txt')
12
+ role4 = AnsibleRole.new(:name => 'hello.yml')
13
+ role5 = AnsibleRole.new(:name => 'foo.yml')
14
+
15
+ describe 'It should Ignore Role' do
16
+ test 'If role starts with h' do
17
+ Setting.stubs(:[]).with(:ansible_roles_to_ignore).returns(['h*'])
18
+ assert_not role_match_excluded_roles(role1.name)
19
+ assert_not role_match_excluded_roles(role2.name)
20
+ assert role_match_excluded_roles(role3.name)
21
+ assert role_match_excluded_roles(role4.name)
22
+ assert_not role_match_excluded_roles(role5.name)
23
+ end
24
+
25
+ test 'If role ends with .yml' do
26
+ Setting.stubs(:[]).with(:ansible_roles_to_ignore).returns(['*.yml'])
27
+ assert_not role_match_excluded_roles(role1.name)
28
+ assert_not role_match_excluded_roles(role2.name)
29
+ assert_not role_match_excluded_roles(role3.name)
30
+ assert role_match_excluded_roles(role4.name)
31
+ assert role_match_excluded_roles(role5.name)
32
+ end
33
+
34
+ test 'If role have o char in the middle' do
35
+ Setting.stubs(:[]).with(:ansible_roles_to_ignore).returns(['*o*'])
36
+ assert role_match_excluded_roles(role1.name)
37
+ assert_not role_match_excluded_roles(role2.name)
38
+ assert role_match_excluded_roles(role3.name)
39
+ assert role_match_excluded_roles(role4.name)
40
+ assert role_match_excluded_roles(role5.name)
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,60 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'test_plugin_helper'
4
+
5
+ # Tests for testing the ignore list
6
+ class ImportRolesAndVariables < ActiveSupport::TestCase
7
+ include ForemanAnsible::AnsibleRolesDataPreparations
8
+
9
+ # existing Roles -> should be updated
10
+ role1 = AnsibleRole.new(:name => 'ntp', :id => 10)
11
+ role2 = AnsibleRole.new(:name => 'bar', :id => 11)
12
+
13
+ # New Roles -> Should be imported
14
+ role3 = AnsibleRole.new(:name => 'foo', :id => nil)
15
+ role4 = AnsibleRole.new(:name => 'world', :id => nil)
16
+
17
+ # Existing Role -> should be removed
18
+ role5 = AnsibleRole.new(:name => 'h', :id => 12)
19
+
20
+ # role1 variables -> add
21
+ variable1 = AnsibleVariable.new(:key => 'ntp_statistics', :ansible_role_id => 10, :id => nil)
22
+ variable2 = AnsibleVariable.new(:key => 'ntp_broadcast', :ansible_role_id => 10, :id => nil)
23
+
24
+ # role1 variables -> update
25
+ variable3 = AnsibleVariable.new(:key => 'ntp_statistics', :ansible_role_id => 10, :id => 4)
26
+ variable4 = AnsibleVariable.new(:key => 'ntp_crypto', :ansible_role_id => 10, :id => 5)
27
+
28
+ # role1 variables -> obsolete
29
+ variable5 = AnsibleVariable.new(:key => 'ntp_controlkey', :ansible_role_id => 10, :id => 6)
30
+ variable6 = AnsibleVariable.new(:key => 'ntp_key', :ansible_role_id => 10, :id => 7)
31
+
32
+ # role2 variable -> Update
33
+ variable7 = AnsibleVariable.new(:key => 'bar_key', :ansible_role_id => 11, :id => 7, :override => false, :hidden_value => true)
34
+ changed = { 'old' => [role1, role2], 'new' => [role3, role4], 'obsolete' => [role5] }
35
+ old_roles_variables = { 'new' => [variable1, variable2], 'update' => [variable3, variable4, variable7], 'obsolete' => [variable5, variable6] }
36
+
37
+ describe 'It should prepare the rows correctly' do
38
+ setup do
39
+ @variables_importer = mock('mock_variables_importer')
40
+ end
41
+
42
+ test 'prepare 5 rows' do
43
+ expected = [{ :cells => [role1.name, 'Update Role Variables', 'Add: 2, Remove: 2, Update: 2', '', ''],
44
+ :role => role1, :kind => 'old', :id => role1.name },
45
+ { :cells => [role2.name, 'Update Role Variables', 'Update: 1', '', ''], :role => role2, :kind => 'old', :id => role2.name },
46
+ { :cells => [role3.name, 'Import Role', 'Add: 3', '', ''], :role => role3, :kind => 'new', :id => role3.name },
47
+ { :cells => [role4.name, 'Import Role', 'Add: 2', '', ''], :role => role4, :kind => 'new', :id => role4.name },
48
+ { :cells => [role5.name, 'Remove Role', '', 0, 0], :role => role5, :kind => 'obsolete', :id => role5.name }]
49
+ # role3 and role4 importing new variables
50
+ @variables_importer.expects(:get_variables_names).with(role3.name).returns({ 'a' => true, 'b' => false, 'c' => [] })
51
+ @variables_importer.expects(:get_variables_names).with(role4.name).returns({ 'd' => true, 'e' => false })
52
+
53
+ @variables_importer.expects(:import_variable_names).with([role3, role4]).returns(old_roles_variables)
54
+ @variables_importer.expects(:import_variable_names).with([role1, role2]).returns(old_roles_variables)
55
+ @variables_importer.expects(:import_variable_names).with([role5]).returns(old_roles_variables)
56
+ result = prepare_ansible_import_rows(changed, @variables_importer)
57
+ assert_equal result, expected
58
+ end
59
+ end
60
+ end