foreman_salt 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (55) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +619 -0
  3. data/README.md +29 -0
  4. data/Rakefile +40 -0
  5. data/app/controllers/foreman_salt/concerns/hostgroups_controller_extensions.rb +19 -0
  6. data/app/controllers/foreman_salt/concerns/hosts_controller_extensions.rb +69 -0
  7. data/app/controllers/foreman_salt/concerns/smart_proxy_auth_extensions.rb +24 -0
  8. data/app/controllers/foreman_salt/concerns/unattended_controller_extensions.rb +18 -0
  9. data/app/controllers/foreman_salt/salt_autosign_controller.rb +43 -0
  10. data/app/controllers/foreman_salt/salt_keys_controller.rb +59 -0
  11. data/app/controllers/foreman_salt/salt_modules_controller.rb +45 -0
  12. data/app/helpers/concerns/foreman_salt/hosts_helper_extensions.rb +28 -0
  13. data/app/helpers/concerns/foreman_salt/smart_proxies_helper_extensions.rb +22 -0
  14. data/app/helpers/foreman_salt/salt_keys_helper.rb +9 -0
  15. data/app/lib/proxy_api/salt.rb +60 -0
  16. data/app/models/concerns/foreman_salt/host_managed_extensions.rb +64 -0
  17. data/app/models/concerns/foreman_salt/hostgroup_extensions.rb +49 -0
  18. data/app/models/concerns/foreman_salt/orchestration/salt.rb +72 -0
  19. data/app/models/foreman_salt/fact_name.rb +4 -0
  20. data/app/models/foreman_salt/salt_module.rb +22 -0
  21. data/app/overrides/foreman/salt_modules/_host_tab.html.erb +2 -0
  22. data/app/overrides/foreman/salt_modules/_host_tab_pane.html.erb +22 -0
  23. data/app/overrides/salt_modules_selector.rb +19 -0
  24. data/app/overrides/salt_proxy_selector.rb +13 -0
  25. data/app/services/foreman_salt/fact_importer.rb +108 -0
  26. data/app/services/foreman_salt/smart_proxies/salt_keys.rb +68 -0
  27. data/app/views/foreman_salt/salt_autosign/_form.html.erb +8 -0
  28. data/app/views/foreman_salt/salt_autosign/index.html.erb +21 -0
  29. data/app/views/foreman_salt/salt_autosign/new.html.erb +3 -0
  30. data/app/views/foreman_salt/salt_keys/index.erb +34 -0
  31. data/app/views/foreman_salt/salt_modules/_form.html.erb +15 -0
  32. data/app/views/foreman_salt/salt_modules/edit.html.erb +4 -0
  33. data/app/views/foreman_salt/salt_modules/index.html.erb +23 -0
  34. data/app/views/foreman_salt/salt_modules/new.html.erb +4 -0
  35. data/config/routes.rb +32 -0
  36. data/db/migrate/20140813081913_add_salt_proxy_to_host_and_host_group.rb +12 -0
  37. data/db/migrate/20140817210214_create_salt_modules.rb +20 -0
  38. data/db/migrate/20140829210214_add_salt_modules_to_hostgroups.rb +12 -0
  39. data/db/seeds.d/75-salt-seeds.rb +31 -0
  40. data/lib/foreman_salt/engine.rb +90 -0
  41. data/lib/foreman_salt/version.rb +3 -0
  42. data/lib/foreman_salt.rb +4 -0
  43. data/lib/tasks/foreman_salt_tasks.rake +31 -0
  44. data/test/factories/foreman_salt_factories.rb +32 -0
  45. data/test/functional/hosts_controller_test.rb +17 -0
  46. data/test/integration/salt_autosign_test.rb +29 -0
  47. data/test/integration/salt_keys_test.rb +45 -0
  48. data/test/integration/salt_module_test.rb +27 -0
  49. data/test/test_plugin_helper.rb +14 -0
  50. data/test/unit/grains_centos.json +108 -0
  51. data/test/unit/grains_importer_test.rb +38 -0
  52. data/test/unit/host_extensions_test.rb +32 -0
  53. data/test/unit/hostgroup_extensions_test.rb +40 -0
  54. data/test/unit/salt_keys_test.rb +46 -0
  55. metadata +122 -0
@@ -0,0 +1,29 @@
1
+ require 'test_plugin_helper'
2
+
3
+ module ForemanSalt
4
+ class SaltKeysTest < ActionDispatch::IntegrationTest
5
+ setup do
6
+ @proxy = FactoryGirl.create :smart_proxy, :with_salt_feature
7
+
8
+ ::ProxyAPI::Salt.any_instance.stubs(:autosign_list).returns(
9
+ ['foo.example.com']
10
+ )
11
+ end
12
+
13
+ test "smart proxy page has autosign link" do
14
+ assert_row_button(smart_proxies_path, @proxy.name, 'Salt Autosign', dropdown = true)
15
+ end
16
+
17
+ test "index page" do
18
+ visit smart_proxy_salt_autosign_index_path(:smart_proxy_id => @proxy.id)
19
+ assert find_link('Keys').visible?, "Keys is not visible"
20
+ assert has_content?("Autosign entries for #{@proxy.name}"), "Page title does not appear"
21
+ assert has_content?("Displaying"), "Pagination 'Display ...' does not appear"
22
+ end
23
+
24
+ test "has list of autosign" do
25
+ visit smart_proxy_salt_autosign_index_path(:smart_proxy_id => @proxy.id)
26
+ assert has_content?("foo.example.com"), "Missing autosign entry on index page"
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,45 @@
1
+ require 'test_plugin_helper'
2
+
3
+ module ForemanSalt
4
+ class SaltKeysTest < ActionDispatch::IntegrationTest
5
+ setup do
6
+ @proxy = FactoryGirl.create :smart_proxy, :with_salt_feature
7
+
8
+ ::ProxyAPI::Salt.any_instance.stubs(:key_list).returns(
9
+ {
10
+ "saltstack.example.com" => {"state"=>"accepted", "fingerprint"=>"98:c2:63:c1:57:59:bc:bd:f1:ef:5a:38:b2:e9:71:c0"},
11
+ "saltclient01.example.com" => {"state"=>"unaccepted", "fingerprint"=>"98:c2:63:c1:57:59:bc:bd:f1:ef:5a:38:b2:e9:71:c1"},
12
+ "saltclient02.example.com" => {"state"=>"unaccepted", "fingerprint"=>"98:c2:63:c1:57:59:bc:bd:f1:ef:5a:38:b2:e9:71:c2"},
13
+ "saltclient03.example.com "=> {"state"=>"rejected", "fingerprint"=>"98:c2:63:c1:57:59:bc:bd:f1:ef:5a:38:b2:e9:71:c3"}
14
+ }
15
+ )
16
+ end
17
+
18
+ test "smart proxy page has keys link" do
19
+ assert_row_button(smart_proxies_path, @proxy.name, 'Salt Keys', dropdown = true)
20
+ end
21
+
22
+ test "index page" do
23
+ visit smart_proxy_salt_keys_path(:smart_proxy_id => @proxy.id)
24
+ assert find_link('Autosign').visible?, "Autosign is not visible"
25
+ assert has_content?("Salt Keys on #{@proxy.name}"), "Page title does not appear"
26
+ assert has_content?("Displaying"), "Pagination 'Display ...' does not appear"
27
+ end
28
+
29
+ test "has list of keys" do
30
+ visit smart_proxy_salt_keys_path(:smart_proxy_id => @proxy.id)
31
+ assert has_content?("saltclient01.example.com"), "Missing key on index page"
32
+ assert has_content?("98:c2:63:c1:57:59:bc:bd:f1:ef:5a:38:b2:e9:71:c1"), "Missing fingerprint on index page"
33
+ end
34
+
35
+ test "has accept link" do
36
+ ::ProxyAPI::Salt.any_instance.stubs(:key_accept).returns(true)
37
+ assert_row_button(smart_proxy_salt_keys_path(:smart_proxy_id => @proxy.id), 'saltclient01.example.com', 'Accept', dropdown = true)
38
+ end
39
+
40
+ test "has reject link" do
41
+ ::ProxyAPI::Salt.any_instance.stubs(:key_reject).returns(true)
42
+ assert_row_button(smart_proxy_salt_keys_path(:smart_proxy_id => @proxy.id), 'saltclient01.example.com', 'Reject', dropdown = true)
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,27 @@
1
+ require 'test_plugin_helper'
2
+
3
+ module ForemanSalt
4
+ class SaltModuleTest < ActionDispatch::IntegrationTest
5
+
6
+ test "index page" do
7
+ FactoryGirl.create_list :salt_module, 50
8
+ assert_index_page(salt_modules_path, "Salt modules", "New Salt module")
9
+ end
10
+
11
+ test "create new page" do
12
+ assert_new_button(salt_modules_path, "New Salt module", new_salt_module_path)
13
+ fill_in "foreman_salt_salt_module_name", :with => "common"
14
+ assert_submit_button(salt_modules_path)
15
+ assert page.has_link? 'common'
16
+ end
17
+
18
+ test "edit page" do
19
+ salt_module = FactoryGirl.create :salt_module
20
+ visit salt_modules_path
21
+ click_link salt_module.name
22
+ fill_in "foreman_salt_salt_module_name", :with => "some_other_name"
23
+ assert_submit_button(salt_modules_path)
24
+ assert page.has_link? 'some_other_name'
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,14 @@
1
+ # This calls the main test_helper in Foreman-core
2
+ require 'test_helper'
3
+
4
+ def assert_row_button(index_path, link_text, button_text, dropdown = false)
5
+ visit index_path
6
+ within(:xpath, "//tr[contains(.,'#{link_text}')]") do
7
+ find("i.caret").click if dropdown
8
+ click_link(button_text)
9
+ end
10
+ end
11
+
12
+ # Add plugin to FactoryGirl's paths
13
+ FactoryGirl.definition_file_paths << File.join(File.dirname(__FILE__), 'factories')
14
+ FactoryGirl.reload
@@ -0,0 +1,108 @@
1
+ {
2
+ "facts": {
3
+ "kernelrelease": "2.6.32-431.23.3.el6.x86_64",
4
+ "ipv6::0": "::1",
5
+ "ipv6::1": "fe80::5054:ff:fe35:302a",
6
+ "saltversioninfo": [
7
+ 2014,
8
+ 1,
9
+ 7
10
+ ],
11
+ "operatingsystem": "CentOS",
12
+ "lsb_distrib_id": "CentOS",
13
+ "pythonversion::2": 6,
14
+ "pythonversion::3": "final",
15
+ "pythonversion::0": 2,
16
+ "pythonversion::1": 6,
17
+ "cpu_model": "QEMU Virtual CPU version (cpu64-rhel6)",
18
+ "pythonversion::4": 0,
19
+ "oscodename": "Final",
20
+ "num_gpus": 1,
21
+ "productname": "KVM",
22
+ "osarch": "x86_64",
23
+ "biosversion": "0.5.1",
24
+ "kernel": "Linux",
25
+ "domain": "example.com",
26
+ "pythonpath::4": "/usr/lib64/python2.6/lib-tk",
27
+ "pythonpath::5": "/usr/lib64/python2.6/lib-old",
28
+ "pythonpath::6": "/usr/lib64/python2.6/lib-dynload",
29
+ "pythonpath::7": "/usr/lib64/python2.6/site-packages",
30
+ "pythonpath::0": "/usr/bin",
31
+ "mem_total": 742,
32
+ "pythonpath::2": "/usr/lib64/python2.6",
33
+ "pythonpath::3": "/usr/lib64/python2.6/plat-linux2",
34
+ "pythonpath::8": "/usr/lib/python2.6/site-packages",
35
+ "cpu_flags::25": "pni",
36
+ "cpu_flags::24": "unfair_spinlock",
37
+ "cpu_flags::27": "hypervisor",
38
+ "cpu_flags::26": "cx16",
39
+ "cpu_flags::21": "nx",
40
+ "cpu_flags::20": "syscall",
41
+ "cpu_flags::23": "up",
42
+ "cpu_flags::22": "lm",
43
+ "cpu_flags::28": "lahf_lm",
44
+ "defaultlanguage": "en_US",
45
+ "osfullname": "CentOS",
46
+ "localhost": "saltclient01.example.com",
47
+ "lsb_distrib_release": "6.5",
48
+ "saltpath": "/usr/lib/python2.6/site-packages/salt",
49
+ "biosreleasedate": "01/01/2007",
50
+ "host": "saltclient01",
51
+ "defaultencoding": "UTF8",
52
+ "path": "/sbin:/usr/sbin:/bin:/usr/bin",
53
+ "ip_interfaces::eth0::0": "10.7.13.141",
54
+ "manufacturer": "Red Hat",
55
+ "fqdn": "saltclient01.example.com",
56
+ "os": "CentOS",
57
+ "osfinger": "CentOS-6",
58
+ "ps": "ps -efH",
59
+ "server_id": 654860635,
60
+ "zmqversion": "3.2.4",
61
+ "osmajorrelease::1": "5",
62
+ "osmajorrelease::0": "6",
63
+ "ip_interfaces::lo::0": "127.0.0.1",
64
+ "master": "saltstack.example.com",
65
+ "shell": "/bin/sh",
66
+ "saltversion": "2014.1.7",
67
+ "hwaddr_interfaces::lo": "00:00:00:00:00:00",
68
+ "_timestamp": "2014-08-28 10:02:16 ",
69
+ "cpu_flags::18": "sse",
70
+ "cpu_flags::19": "sse2",
71
+ "cpu_flags::14": "pse36",
72
+ "cpu_flags::15": "clflush",
73
+ "cpu_flags::16": "mmx",
74
+ "cpu_flags::17": "fxsr",
75
+ "cpu_flags::10": "mtrr",
76
+ "cpu_flags::11": "pge",
77
+ "cpu_flags::12": "mca",
78
+ "cpu_flags::13": "cmov",
79
+ "cpuarch": "x86_64",
80
+ "pythonpath::1": "/usr/lib64/python26.zip",
81
+ "cpu_flags::6": "mce",
82
+ "cpu_flags::7": "cx8",
83
+ "cpu_flags::4": "msr",
84
+ "cpu_flags::5": "pae",
85
+ "cpu_flags::2": "pse",
86
+ "cpu_flags::3": "tsc",
87
+ "cpu_flags::0": "fpu",
88
+ "cpu_flags::1": "de",
89
+ "serialnumber": "Not Specified",
90
+ "hwaddr_interfaces::eth0": "52:54:00:35:30:2a",
91
+ "cpu_flags::8": "apic",
92
+ "cpu_flags::9": "sep",
93
+ "gpus::0::model": "GD 5446",
94
+ "id": "saltclient01.example.com",
95
+ "osrelease": "6.5",
96
+ "num_cpus": 1,
97
+ "virtual": "kvm",
98
+ "ipv4::0": "10.7.13.141",
99
+ "ipv4::1": "127.0.0.1",
100
+ "_type": "foreman_salt",
101
+ "nodename": "saltclient01.example.com",
102
+ "os_family": "RedHat",
103
+ "operatingsystemrelease": "6.5",
104
+ "gpus::0::vendor": "unknown",
105
+ "lsb_distrib_codename": "Final"
106
+ },
107
+ "name": "saltclient01.example.com"
108
+ }
@@ -0,0 +1,38 @@
1
+ require 'test_plugin_helper'
2
+
3
+ module ForemanSalt
4
+ class GrainsImporterTest < ActiveSupport::TestCase
5
+ setup do
6
+ User.current = User.find_by_login "admin"
7
+ Setting[:create_new_host_when_facts_are_uploaded] = true
8
+
9
+ # I don't even know, the plug-in successfully registers the importer
10
+ # in development, and even on the Rails test console but not here
11
+ # in the test itself...
12
+ ::FactImporter.stubs(:importer_for).returns(ForemanSalt::FactImporter)
13
+
14
+ grains = JSON.parse(File.read(File.join(Engine.root, "test", "unit", "grains_centos.json")))
15
+ @host = grains["name"]
16
+ @facts = grains["facts"]
17
+ end
18
+
19
+ test "importing salt grains creates a host" do
20
+ refute Host.find_by_name(@host)
21
+ ::Host::Managed.import_host_and_facts @host, @facts
22
+ assert Host.find_by_name(@host)
23
+ end
24
+
25
+ test "grains are successfully imported for a host" do
26
+ (host, state) = ::Host::Managed.import_host_and_facts @host, @facts
27
+ assert_equal 'CentOS', host.facts_hash['operatingsystem']
28
+ end
29
+
30
+ test "nested facts have valid parents" do
31
+ (host, state) = ::Host::Managed.import_host_and_facts @host, @facts
32
+ parent = ::FactName.find_by_name('cpu_flags')
33
+ children = host.fact_values.with_fact_parent_id(parent)
34
+ assert_not_empty children
35
+ assert_empty children.map(&:fact_name).reject { |fact| fact.name =~ /\Acpu_flags#{FactName::SEPARATOR}[0-9]+/ }
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,32 @@
1
+ require 'test_plugin_helper'
2
+
3
+ module ForemanSalt
4
+ class HostExtensionsTest < ActiveSupport::TestCase
5
+ setup do
6
+ User.current = User.find_by_login "admin"
7
+ end
8
+
9
+ test "host has a salt smart proxy" do
10
+ host = FactoryGirl.create :host, :with_salt_proxy
11
+ assert host.salt_proxy.features.map(&:name).include? 'Salt'
12
+ end
13
+
14
+ test "smart_proxy_ids returns salt smart proxy" do
15
+ host = FactoryGirl.create :host, :with_salt_proxy
16
+ assert host.smart_proxy_ids.include? host.salt_proxy_id
17
+ end
18
+
19
+ test "host params includes salt_master" do
20
+ host = FactoryGirl.create :host, :with_salt_proxy
21
+ assert host.params.key? "salt_master"
22
+ assert_equal host.params["salt_master"], host.salt_master
23
+ end
24
+
25
+ test "host inherits salt proxy from host group" do
26
+ hostgroup = FactoryGirl.create :hostgroup, :with_salt_proxy
27
+ host = FactoryGirl.create :host, :hostgroup => hostgroup
28
+ host.set_hostgroup_defaults
29
+ assert_equal host.salt_proxy, hostgroup.salt_proxy
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,40 @@
1
+ require 'test_plugin_helper'
2
+
3
+ module ForemanSalt
4
+ class HostgroupExtensionsTest < ActiveSupport::TestCase
5
+ setup do
6
+ User.current = User.find_by_login "admin"
7
+ end
8
+
9
+ test "host group has a salt smart proxy" do
10
+ hostgroup = FactoryGirl.create :hostgroup, :with_salt_proxy
11
+ assert hostgroup.salt_proxy.features.map(&:name).include? 'Salt'
12
+ end
13
+
14
+ test "nested host group inherits salt modules from parent" do
15
+ parent = FactoryGirl.create :hostgroup, :with_salt_modules
16
+ child = FactoryGirl.create :hostgroup, :parent => parent
17
+ assert_equal [], parent.salt_modules - child.salt_modules
18
+ end
19
+
20
+ test "child host group inherits salt proxy from child parent" do
21
+ parent = FactoryGirl.create :hostgroup
22
+ child_one = FactoryGirl.create :hostgroup, :with_salt_proxy, :parent => parent
23
+ child_two = FactoryGirl.create :hostgroup, :parent => child_one
24
+ assert_equal child_two.salt_proxy, child_one.salt_proxy
25
+ end
26
+
27
+ test "child and parent salt modules are combined" do
28
+ parent = FactoryGirl.create :hostgroup, :with_salt_modules
29
+ child = FactoryGirl.create :hostgroup, :with_salt_modules, :parent => parent
30
+ assert_equal 10, (child.salt_modules - parent.salt_modules).length
31
+ end
32
+
33
+ test "second child inherits from parent" do
34
+ parent = FactoryGirl.create :hostgroup, :with_salt_modules
35
+ child_one = FactoryGirl.create :hostgroup, :parent => parent
36
+ child_two = FactoryGirl.create :hostgroup, :parent => child_one
37
+ assert_equal [], parent.salt_modules - child_two.salt_modules
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,46 @@
1
+ require 'test_plugin_helper'
2
+
3
+ class SaltKeysTest < ActiveSupport::TestCase
4
+ setup do
5
+ User.current = User.find_by_login "admin"
6
+
7
+ @proxy = OpenStruct.new(:id => 1, :url => 'http://dummy.example.com:9090')
8
+
9
+ ProxyAPI::Salt.any_instance.stubs(:key_list).returns(
10
+ {
11
+ "saltstack.example.com" => {"state"=>"accepted", "fingerprint"=>"98:c2:63:c1:57:59:bc:bd:f1:ef:5a:38:b2:e9:71:c0"},
12
+ "saltclient01.example.com" => {"state"=>"unaccepted", "fingerprint"=>"98:c2:63:c1:57:59:bc:bd:f1:ef:5a:38:b2:e9:71:c1"},
13
+ "saltclient02.example.com" => {"state"=>"unaccepted", "fingerprint"=>"98:c2:63:c1:57:59:bc:bd:f1:ef:5a:38:b2:e9:71:c2"},
14
+ "saltclient03.example.com "=> {"state"=>"rejected", "fingerprint"=>"98:c2:63:c1:57:59:bc:bd:f1:ef:5a:38:b2:e9:71:c3"}
15
+ }
16
+ )
17
+ end
18
+
19
+ test "key has a name" do
20
+ assert_not_empty ForemanSalt::SmartProxies::SaltKeys.all(@proxy).first.name
21
+ end
22
+
23
+ test "key has a state" do
24
+ assert_not_empty ForemanSalt::SmartProxies::SaltKeys.all(@proxy).first.state
25
+ end
26
+
27
+ test "key has a fingerprint" do
28
+ assert_not_empty ForemanSalt::SmartProxies::SaltKeys.all(@proxy).first.fingerprint
29
+ end
30
+
31
+ test "key has a smart proxy id" do
32
+ assert_equal 1, ForemanSalt::SmartProxies::SaltKeys.all(@proxy).first.smart_proxy_id
33
+ end
34
+
35
+ test "returns all keys" do
36
+ assert_equal 4, ForemanSalt::SmartProxies::SaltKeys.all(@proxy).count
37
+ end
38
+
39
+ test "finds a key by name" do
40
+ assert_equal ForemanSalt::SmartProxies::SaltKeys.find(@proxy, 'saltstack.example.com').name, 'saltstack.example.com'
41
+ end
42
+
43
+ test "find keys by state" do
44
+ assert_equal 2, ForemanSalt::SmartProxies::SaltKeys.find_by_state(@proxy, 'unaccepted').count
45
+ end
46
+ end
metadata ADDED
@@ -0,0 +1,122 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: foreman_salt
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.2
5
+ platform: ruby
6
+ authors:
7
+ - Stephen Benjamin
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-08-31 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: deface
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - '>='
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - '>='
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ description: Foreman Plug-in for Salt
28
+ email:
29
+ - stephen@redhat.com
30
+ executables: []
31
+ extensions: []
32
+ extra_rdoc_files: []
33
+ files:
34
+ - app/helpers/foreman_salt/salt_keys_helper.rb
35
+ - app/helpers/concerns/foreman_salt/smart_proxies_helper_extensions.rb
36
+ - app/helpers/concerns/foreman_salt/hosts_helper_extensions.rb
37
+ - app/overrides/salt_modules_selector.rb
38
+ - app/overrides/foreman/salt_modules/_host_tab.html.erb
39
+ - app/overrides/foreman/salt_modules/_host_tab_pane.html.erb
40
+ - app/overrides/salt_proxy_selector.rb
41
+ - app/views/foreman_salt/salt_modules/index.html.erb
42
+ - app/views/foreman_salt/salt_modules/new.html.erb
43
+ - app/views/foreman_salt/salt_modules/_form.html.erb
44
+ - app/views/foreman_salt/salt_modules/edit.html.erb
45
+ - app/views/foreman_salt/salt_keys/index.erb
46
+ - app/views/foreman_salt/salt_autosign/index.html.erb
47
+ - app/views/foreman_salt/salt_autosign/new.html.erb
48
+ - app/views/foreman_salt/salt_autosign/_form.html.erb
49
+ - app/services/foreman_salt/smart_proxies/salt_keys.rb
50
+ - app/services/foreman_salt/fact_importer.rb
51
+ - app/models/foreman_salt/salt_module.rb
52
+ - app/models/foreman_salt/fact_name.rb
53
+ - app/models/concerns/foreman_salt/hostgroup_extensions.rb
54
+ - app/models/concerns/foreman_salt/host_managed_extensions.rb
55
+ - app/models/concerns/foreman_salt/orchestration/salt.rb
56
+ - app/controllers/foreman_salt/salt_modules_controller.rb
57
+ - app/controllers/foreman_salt/salt_autosign_controller.rb
58
+ - app/controllers/foreman_salt/salt_keys_controller.rb
59
+ - app/controllers/foreman_salt/concerns/hostgroups_controller_extensions.rb
60
+ - app/controllers/foreman_salt/concerns/smart_proxy_auth_extensions.rb
61
+ - app/controllers/foreman_salt/concerns/hosts_controller_extensions.rb
62
+ - app/controllers/foreman_salt/concerns/unattended_controller_extensions.rb
63
+ - app/lib/proxy_api/salt.rb
64
+ - config/routes.rb
65
+ - db/seeds.d/75-salt-seeds.rb
66
+ - db/migrate/20140817210214_create_salt_modules.rb
67
+ - db/migrate/20140829210214_add_salt_modules_to_hostgroups.rb
68
+ - db/migrate/20140813081913_add_salt_proxy_to_host_and_host_group.rb
69
+ - lib/foreman_salt/engine.rb
70
+ - lib/foreman_salt/version.rb
71
+ - lib/tasks/foreman_salt_tasks.rake
72
+ - lib/foreman_salt.rb
73
+ - LICENSE
74
+ - Rakefile
75
+ - README.md
76
+ - test/integration/salt_keys_test.rb
77
+ - test/integration/salt_module_test.rb
78
+ - test/integration/salt_autosign_test.rb
79
+ - test/unit/salt_keys_test.rb
80
+ - test/unit/grains_centos.json
81
+ - test/unit/host_extensions_test.rb
82
+ - test/unit/grains_importer_test.rb
83
+ - test/unit/hostgroup_extensions_test.rb
84
+ - test/test_plugin_helper.rb
85
+ - test/factories/foreman_salt_factories.rb
86
+ - test/functional/hosts_controller_test.rb
87
+ homepage: http://github.com/theforeman/foreman_salt
88
+ licenses:
89
+ - GPL-3
90
+ metadata: {}
91
+ post_install_message:
92
+ rdoc_options: []
93
+ require_paths:
94
+ - lib
95
+ required_ruby_version: !ruby/object:Gem::Requirement
96
+ requirements:
97
+ - - '>='
98
+ - !ruby/object:Gem::Version
99
+ version: '0'
100
+ required_rubygems_version: !ruby/object:Gem::Requirement
101
+ requirements:
102
+ - - '>='
103
+ - !ruby/object:Gem::Version
104
+ version: '0'
105
+ requirements: []
106
+ rubyforge_project:
107
+ rubygems_version: 2.1.11
108
+ signing_key:
109
+ specification_version: 4
110
+ summary: Foreman Plug-in for Salt
111
+ test_files:
112
+ - test/integration/salt_keys_test.rb
113
+ - test/integration/salt_module_test.rb
114
+ - test/integration/salt_autosign_test.rb
115
+ - test/unit/salt_keys_test.rb
116
+ - test/unit/grains_centos.json
117
+ - test/unit/host_extensions_test.rb
118
+ - test/unit/grains_importer_test.rb
119
+ - test/unit/hostgroup_extensions_test.rb
120
+ - test/test_plugin_helper.rb
121
+ - test/factories/foreman_salt_factories.rb
122
+ - test/functional/hosts_controller_test.rb