foreman_ansible 1.5.2 → 2.0.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.
Files changed (69) hide show
  1. checksums.yaml +4 -4
  2. data/Rakefile +1 -1
  3. data/app/controllers/foreman_ansible/api/v2/hostgroups_controller_extensions.rb +6 -21
  4. data/app/controllers/foreman_ansible/api/v2/hosts_controller_extensions.rb +5 -18
  5. data/app/controllers/foreman_ansible/concerns/hostgroups_controller_extensions.rb +12 -5
  6. data/app/controllers/foreman_ansible/concerns/hosts_controller_extensions.rb +20 -16
  7. data/app/controllers/foreman_ansible/concerns/job_invocation_helper.rb +17 -0
  8. data/app/helpers/foreman_ansible/ansible_plugin_helper.rb +1 -5
  9. data/app/helpers/foreman_ansible/ansible_reports_helper.rb +2 -1
  10. data/app/helpers/foreman_ansible/hosts_helper_extensions.rb +19 -18
  11. data/app/lib/actions/foreman_ansible/helpers/host_common.rb +1 -5
  12. data/app/models/ansible_role.rb +5 -0
  13. data/app/models/concerns/foreman_ansible/has_many_ansible_roles.rb +1 -3
  14. data/app/models/concerns/foreman_ansible/host_managed_extensions.rb +9 -0
  15. data/app/models/concerns/foreman_ansible/hostgroup_extensions.rb +0 -4
  16. data/app/models/foreman_ansible/ansible_provider.rb +24 -0
  17. data/app/models/setting/ansible.rb +4 -1
  18. data/app/services/foreman_ansible/fact_parser.rb +4 -2
  19. data/app/services/foreman_ansible/inventory_creator.rb +7 -2
  20. data/app/services/foreman_ansible/proxy_selector.rb +6 -0
  21. data/app/services/foreman_ansible/ui_roles_importer.rb +2 -0
  22. data/app/views/ansible_roles/index.html.erb +1 -2
  23. data/app/views/foreman_ansible/ansible_roles/_hostgroup_ansible_roles_button.erb +8 -7
  24. data/app/views/foreman_ansible/job_templates/ansible_roles.erb +17 -0
  25. data/config/routes.rb +1 -0
  26. data/db/migrate/20160705082036_create_ansible_role.rb +1 -1
  27. data/db/migrate/20160706074540_create_join_table_hosts_ansible_roles.rb +1 -1
  28. data/db/migrate/20160707195442_create_host_ansible_roles.rb +1 -1
  29. data/db/migrate/20160729094457_add_columns_to_ansible_role.rb +1 -1
  30. data/db/migrate/20160802153302_create_join_table_hostgroup_ansible_roles.rb +2 -1
  31. data/db/migrate/20160805094233_add_primary_key_hostgroup_ansible_roles.rb +1 -1
  32. data/db/migrate/20161122154057_automatically_set_role_timestamps.rb +1 -1
  33. data/db/seeds.d/75_job_templates.rb +20 -0
  34. data/lib/foreman_ansible/engine.rb +11 -53
  35. data/lib/foreman_ansible/register.rb +52 -0
  36. data/lib/foreman_ansible/remote_execution.rb +22 -0
  37. data/lib/foreman_ansible/version.rb +1 -1
  38. data/test/factories/ansible_proxy.rb +1 -1
  39. data/test/factories/ansible_roles.rb +1 -1
  40. data/test/functional/ansible_roles_controller_test.rb +4 -2
  41. data/test/functional/api/v2/ansible_roles_controller_test.rb +5 -3
  42. data/test/functional/api/v2/hostgroups_controller_test.rb +17 -25
  43. data/test/functional/api/v2/hosts_controller_test.rb +16 -24
  44. data/test/functional/hosts_controller_test.rb +33 -29
  45. data/test/test_plugin_helper.rb +12 -2
  46. data/test/unit/actions/run_ansible_job_test.rb +0 -0
  47. data/test/unit/actions/run_proxy_ansible_command_test.rb +0 -0
  48. data/test/unit/concerns/host_managed_extensions_test.rb +7 -7
  49. data/test/unit/concerns/hostgroup_extensions_test.rb +6 -6
  50. data/test/unit/helpers/foreman_ansible/ansible_reports_helper_test.rb +2 -2
  51. data/test/unit/host_ansible_role_test.rb +2 -2
  52. data/test/unit/hostgroup_ansible_role_test.rb +2 -2
  53. data/test/unit/lib/foreman_ansible_core/roles_reader_test.rb +4 -5
  54. data/test/unit/services/fact_importer_test.rb +3 -5
  55. data/test/unit/services/fact_parser_test.rb +0 -2
  56. data/test/unit/services/fact_sparser_test.rb +0 -2
  57. data/test/unit/services/inventory_creator_test.rb +1 -1
  58. data/test/unit/services/proxy_selector_test.rb +4 -4
  59. data/test/unit/services/roles_importer_test.rb +2 -2
  60. data/test/unit/services/structured_fact_importer_test.rb +1 -1
  61. data/test/unit/services/ui_roles_importer_test.rb +1 -1
  62. metadata +44 -31
  63. data/app/lib/actions/foreman_ansible/play_host_roles.rb +0 -42
  64. data/app/lib/actions/foreman_ansible/play_hostgroup_roles.rb +0 -56
  65. data/app/lib/actions/foreman_ansible/play_hosts_roles.rb +0 -26
  66. data/test/fixtures/ansible_permissions.yml +0 -11
  67. data/test/support/fixture_support.rb +0 -29
  68. data/test/support/foreman_tasks/task.rb +0 -48
  69. data/test/support/foreman_test_helper_additions.rb +0 -22
@@ -1,42 +0,0 @@
1
- module Actions
2
- module ForemanAnsible
3
- # Action that initiates the playbook run for roles assigned to
4
- # the host. It does that either locally or via a proxy when available.
5
- class PlayHostRoles < Actions::EntryAction
6
- include ::Actions::Helpers::WithContinuousOutput
7
- include ::Actions::Helpers::WithDelegatedAction
8
- include Helpers::PlayRolesDescription
9
- include Helpers::HostCommon
10
-
11
- def plan(host, proxy_selector = ::ForemanAnsible::ProxySelector.new,
12
- options = {})
13
- proxy = find_host_and_proxy(host, proxy_selector)
14
- role_names = host.all_ansible_roles.map(&:name)
15
- inventory_creator = ::ForemanAnsible::InventoryCreator.new([host])
16
- playbook_creator = ::ForemanAnsible::PlaybookCreator.new(role_names)
17
- plan_delegated_action(proxy,
18
- ::ForemanAnsibleCore::Actions::RunPlaybook,
19
- :inventory => inventory_creator.to_hash.to_json,
20
- :playbook => playbook_creator.roles_playbook,
21
- :options => find_options.merge(options))
22
- plan_self
23
- end
24
-
25
- def humanized_input
26
- format(_('on host %{name} through %{proxy}'),
27
- :name => input.fetch(:host, {})[:name],
28
- :proxy => running_proxy_name)
29
- end
30
-
31
- private
32
-
33
- def find_host_and_proxy(host, proxy_selector)
34
- proxy = proxy_selector.determine_proxy(host)
35
- input[:host] = { :id => host.id,
36
- :name => host.fqdn,
37
- :proxy_used => proxy.try(:name) || :not_defined }
38
- proxy
39
- end
40
- end
41
- end
42
- end
@@ -1,56 +0,0 @@
1
- module Actions
2
- module ForemanAnsible
3
- # Action that initiates the playbook run for roles assigned to
4
- # the hostgroup. It does that either locally or via a proxy when available.
5
- class PlayHostgroupRoles < Actions::EntryAction
6
- include ::Actions::Helpers::WithContinuousOutput
7
- include ::Actions::Helpers::WithDelegatedAction
8
- include Helpers::PlayRolesDescription
9
- include Helpers::HostCommon
10
-
11
- def plan(hostgroup, proxy_selector = ::ForemanAnsible::ProxySelector.new,
12
- options = {})
13
- proxy = find_hostgroup_and_proxy(hostgroup, proxy_selector)
14
- inventory_creator = ::ForemanAnsible::
15
- InventoryCreator.new(hostgroup.hosts)
16
- playbook_creator = ::ForemanAnsible::
17
- PlaybookCreator.new(hostgroup_ansible_roles(hostgroup))
18
- plan_delegated_action(proxy, ::ForemanAnsibleCore::Actions::RunPlaybook,
19
- :inventory => inventory_creator.to_hash.to_json,
20
- :playbook => playbook_creator.roles_playbook,
21
- :options => find_options.merge(options))
22
- plan_self
23
- end
24
-
25
- def humanized_input
26
- format(_('on host group %{name} through proxy %{proxy}'),
27
- :name => input.fetch(:hostgroup, {})[:name],
28
- :proxy => running_proxy_name)
29
- end
30
-
31
- private
32
-
33
- def hostgroup_ansible_roles(hostgroup)
34
- role_names = []
35
- hostgroup.hostgroup_ansible_roles.each do |ansible_role|
36
- role_names.append(ansible_role.ansible_role_name)
37
- end
38
- role_names
39
- end
40
-
41
- def hostgroup_contains_hosts(hostgroup)
42
- return unless hostgroup.hosts.empty?
43
- raise ::Foreman::Exception.new(N_('host group is empty'))
44
- end
45
-
46
- def find_hostgroup_and_proxy(hostgroup, proxy_selector)
47
- hostgroup_contains_hosts(hostgroup)
48
- proxy = proxy_selector.determine_proxy(hostgroup.hosts[0])
49
- input[:hostgroup] = { :id => hostgroup.id,
50
- :name => hostgroup.name,
51
- :proxy_used => proxy.try(:name) || :not_defined }
52
- proxy
53
- end
54
- end
55
- end
56
- end
@@ -1,26 +0,0 @@
1
- module Actions
2
- module ForemanAnsible
3
- # Bulk action for running ansible roles
4
- class PlayHostsRoles < Actions::ActionWithSubPlans
5
- def plan(hosts)
6
- plan_self(:host_ids => hosts.map(&:id))
7
- end
8
-
9
- def create_sub_plans
10
- proxy_selector = ::ForemanAnsible::ProxySelector.new
11
- input[:host_ids].map do |host_id|
12
- host = Host.find(host_id)
13
- trigger(PlayHostRoles, host, proxy_selector)
14
- end
15
- end
16
-
17
- def rescue_strategy
18
- ::Dynflow::Action::Rescue::Fail
19
- end
20
-
21
- def humanized_name
22
- _('Bulk play Ansible roles')
23
- end
24
- end
25
- end
26
- end
@@ -1,11 +0,0 @@
1
- ---
2
- view_ansible_roles:
3
- name: view_ansible_roles
4
- resource_type: AnsibleRole
5
- created_at: "2013-12-04 08:41:04.321867"
6
- updated_at: "2013-12-04 08:41:04.321867"
7
- destroy_ansible_roles:
8
- name: destroy_ansible_roles
9
- resource_type: AnsibleRole
10
- created_at: "2013-12-04 08:41:04.321867"
11
- updated_at: "2013-12-04 08:41:04.321867"
@@ -1,29 +0,0 @@
1
- module ForemanAnsible
2
- # Allow to add fixtures to plugins
3
- module PluginFixtures
4
- FIXTURE_MAPPING = {
5
- :ansible_permissions => :permissions
6
- }.freeze
7
-
8
- def self.add_fixtures(new_fixture_path)
9
- FileUtils.cp(
10
- Dir.glob(Rails.root.join('test', 'fixtures', '*')),
11
- new_fixture_path
12
- )
13
- copy_plugin_fixtures new_fixture_path
14
- end
15
-
16
- def self.copy_plugin_fixtures(new_fixture_path)
17
- FIXTURE_MAPPING.each do |key, value|
18
- fixture_path = "#{ForemanAnsible::Engine.root}/test/fixtures/#{key}.yml"
19
- break unless File.exist?(fixture_path)
20
- File.open("#{new_fixture_path}/#{value}.yml", 'a') do |file|
21
- File.open(fixture_path, 'r').each do |line|
22
- next if line =~ /---/
23
- file.write line
24
- end
25
- end
26
- end
27
- end
28
- end
29
- end
@@ -1,48 +0,0 @@
1
- module Support
2
- module ForemanTasks
3
- # Stubbing for foreman tasks
4
- module Task
5
- def stub_tasks!
6
- @controller.stubs(:sync_task).returns(build_task_stub)
7
- @controller.stubs(:async_task).returns(build_task_stub)
8
- end
9
-
10
- def build_task_stub
11
- task_attrs = [:id, :label, :pending, :username, :started_at, :ended_at,
12
- :state, :result, :progress, :input, :humanized,
13
- :cli_example].inject({}) { |a, e| a.update e => nil }
14
- task_attrs[:output] = {}
15
-
16
- stub('task', task_attrs).mimic!(::ForemanTasks::Task)
17
- end
18
-
19
- def assert_async_task(expected_action_class, *args_expected)
20
- assert_foreman_task(true, expected_action_class, *args_expected)
21
- end
22
-
23
- def assert_sync_task(expected_action_class, *args_expected)
24
- assert_foreman_task(false, expected_action_class, *args_expected)
25
- end
26
-
27
- def assert_foreman_task(async, expected_action_class, *args_expected)
28
- block ||= block_from_args(args_expected)
29
- method = async ? :async_task : :sync_task
30
- task_stub = build_task_stub
31
- @controller.
32
- expects(method).
33
- with do |action_class, *args|
34
- expected_action_class == action_class && block.call(*args)
35
- end.
36
- returns(task_stub)
37
- task_stub
38
- end
39
-
40
- private
41
-
42
- def block_from_args(args_expected)
43
- ->(*_) { true } if args_expected.empty?
44
- ->(*args) { args == args_expected }
45
- end
46
- end
47
- end
48
- end
@@ -1,22 +0,0 @@
1
- require "#{ForemanAnsible::Engine.root}/test/support/fixture_support"
2
- # loads the permissions for foreman_ansible and makes them available in tests
3
- module AnsiblePermissionTestCase
4
- extend ActiveSupport::Concern
5
-
6
- included do
7
- extend ActiveRecord::TestFixtures
8
-
9
- new_fixture_path = Dir.mktmpdir('ansible_fixtures')
10
- self.fixture_path = new_fixture_path
11
- ForemanAnsible::PluginFixtures.add_fixtures(new_fixture_path)
12
- fixtures(:all)
13
- load_fixtures(ActiveRecord::Base)
14
- end
15
- end
16
-
17
- module ActiveSupport
18
- #:nodoc
19
- class TestCase
20
- include AnsiblePermissionTestCase
21
- end
22
- end