foreman_discovery 3.0.0 → 4.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.
- checksums.yaml +4 -4
- data/README.md +1 -1
- data/app/controllers/api/v2/discovered_hosts_controller.rb +31 -11
- data/app/controllers/api/v2/discovery_rules_controller.rb +8 -16
- data/app/controllers/concerns/foreman/controller/discovered_extensions.rb +47 -2
- data/app/controllers/discovered_hosts_controller.rb +30 -55
- data/app/controllers/discovery_rules_controller.rb +2 -4
- data/app/helpers/discovered_hosts_helper.rb +27 -5
- data/app/lib/facter_utils.rb +18 -0
- data/app/lib/puppet_fact_parser_extensions.rb +18 -32
- data/app/models/discovery_rule.rb +33 -2
- data/app/models/host/discovered.rb +47 -61
- data/app/models/host/managed_extensions.rb +12 -3
- data/app/models/setting/discovered.rb +18 -6
- data/app/services/foreman_discovery/host_converter.rb +22 -0
- data/app/views/api/v2/discovered_hosts/main.json.rabl +1 -1
- data/app/views/api/v2/discovery_rules/main.json.rabl +6 -1
- data/app/views/api/v2/discovery_rules/show.json.rabl +4 -0
- data/app/views/dashboard/_discovery_widget.html.erb +6 -4
- data/app/views/dashboard/_discovery_widget_host.html.erb +4 -0
- data/app/views/dashboard/_discovery_widget_host_list.html.erb +2 -3
- data/app/views/discovered_hosts/_discovered_host.html.erb +3 -5
- data/app/views/discovered_hosts/_discovered_hosts_list.html.erb +7 -7
- data/app/views/discovered_hosts/index.html.erb +1 -0
- data/app/views/discovery_rules/_form.html.erb +51 -32
- data/config/routes.rb +4 -4
- data/db/migrate/20150310153859_remove_discovery_attribute_sets_from_managed_hosts.rb +8 -0
- data/db/migrate/20150331132115_remove_old_permissions.rb +16 -0
- data/db/migrate/20150505111345_remove_leftover_tokens.rb +13 -0
- data/db/migrate/20150512150432_remove_old_discovery_reader_permissions.rb +10 -0
- data/db/migrate/20150714144500_review_discovery_permissions.rb +17 -0
- data/lib/foreman_discovery/engine.rb +46 -16
- data/lib/foreman_discovery/version.rb +1 -1
- data/locale/de/LC_MESSAGES/foreman_discovery.mo +0 -0
- data/locale/de/foreman_discovery.po +74 -72
- data/locale/de/foreman_discovery.pox +40 -0
- data/locale/en_GB/LC_MESSAGES/foreman_discovery.mo +0 -0
- data/locale/en_GB/foreman_discovery.po +90 -88
- data/locale/en_GB/foreman_discovery.pox +0 -0
- data/locale/es/LC_MESSAGES/foreman_discovery.mo +0 -0
- data/locale/es/foreman_discovery.po +3 -3
- data/locale/es/foreman_discovery.pox +41 -0
- data/locale/fr/LC_MESSAGES/foreman_discovery.mo +0 -0
- data/locale/fr/foreman_discovery.po +3 -3
- data/locale/fr/foreman_discovery.pox +69 -0
- data/locale/gl/LC_MESSAGES/foreman_discovery.mo +0 -0
- data/locale/gl/foreman_discovery.po +3 -3
- data/locale/gl/foreman_discovery.pox +21 -0
- data/locale/it/LC_MESSAGES/foreman_discovery.mo +0 -0
- data/locale/it/foreman_discovery.po +3 -3
- data/locale/it/foreman_discovery.pox +0 -0
- data/locale/ja/LC_MESSAGES/foreman_discovery.mo +0 -0
- data/locale/ja/foreman_discovery.po +67 -66
- data/locale/ja/foreman_discovery.pox +29 -0
- data/locale/ko/LC_MESSAGES/foreman_discovery.mo +0 -0
- data/locale/ko/foreman_discovery.po +3 -3
- data/locale/ko/foreman_discovery.pox +189 -0
- data/locale/messages.mo +0 -0
- data/locale/pt_BR/LC_MESSAGES/foreman_discovery.mo +0 -0
- data/locale/pt_BR/foreman_discovery.po +7 -7
- data/locale/pt_BR/foreman_discovery.pox +0 -0
- data/locale/ru/LC_MESSAGES/foreman_discovery.mo +0 -0
- data/locale/ru/foreman_discovery.po +98 -96
- data/locale/ru/foreman_discovery.pox +0 -0
- data/locale/sv_SE/LC_MESSAGES/foreman_discovery.mo +0 -0
- data/locale/sv_SE/foreman_discovery.po +3 -3
- data/locale/zh_CN/LC_MESSAGES/foreman_discovery.mo +0 -0
- data/locale/zh_CN/foreman_discovery.po +3 -3
- data/locale/zh_CN/foreman_discovery.pox +33 -0
- data/locale/zh_TW/LC_MESSAGES/foreman_discovery.mo +0 -0
- data/locale/zh_TW/foreman_discovery.po +3 -3
- data/locale/zh_TW/foreman_discovery.pox +23 -0
- data/test/functional/api/v2/discovered_hosts_controller_test.rb +45 -7
- data/test/functional/discovered_hosts_controller_test.rb +52 -11
- data/test/unit/discovered_extensions_test.rb +40 -17
- data/test/unit/discovery_rule_test.rb +59 -0
- data/test/unit/host_discovered_test.rb +69 -6
- data/test/unit/puppet_fact_parser_extensions_test.rb +55 -40
- metadata +103 -81
- data/app/services/host_converter.rb +0 -30
@@ -65,7 +65,9 @@ class Api::V2::DiscoveredHostsControllerTest < ActionController::TestCase
|
|
65
65
|
def test_auto_provision_success_via_upload
|
66
66
|
disable_orchestration
|
67
67
|
facts = @facts.merge({"somefact" => "abc"})
|
68
|
-
FactoryGirl.create(:discovery_rule, :priority => 1, :name => 'rule', :search => "facts.somefact = abc",
|
68
|
+
FactoryGirl.create(:discovery_rule, :priority => 1, :name => 'rule', :search => "facts.somefact = abc",
|
69
|
+
:hostgroup => FactoryGirl.create(:hostgroup, :with_os, :with_rootpass), :organizations => [Organization.first],
|
70
|
+
:locations => [Location.first])
|
69
71
|
post :facts, { :facts => facts }
|
70
72
|
assert_response :success
|
71
73
|
assert_equal "Auto-discovered and provisioned via rule 'rule'", Host.first.comment
|
@@ -75,8 +77,35 @@ class Api::V2::DiscoveredHostsControllerTest < ActionController::TestCase
|
|
75
77
|
disable_orchestration
|
76
78
|
facts = @facts.merge({"somefact" => "abc"})
|
77
79
|
host = Host::Discovered.import_host_and_facts(facts).first
|
78
|
-
FactoryGirl.create(:discovery_rule, :priority => 1, :search => "facts.somefact = abc",
|
80
|
+
FactoryGirl.create(:discovery_rule, :priority => 1, :search => "facts.somefact = abc",
|
81
|
+
:hostgroup => FactoryGirl.create(:hostgroup, :with_os, :with_rootpass),
|
82
|
+
:organizations => [host.organization], :locations => [host.location])
|
79
83
|
post :auto_provision, { :id => host.id }
|
84
|
+
assert_match host.name, @response.body
|
85
|
+
assert_response :success
|
86
|
+
end
|
87
|
+
|
88
|
+
def test_auto_provision_with_wrong_org_or_loc_fail
|
89
|
+
disable_orchestration
|
90
|
+
facts = @facts.merge({"somefact" => "abc"})
|
91
|
+
host = Host::Discovered.import_host_and_facts(facts).first
|
92
|
+
FactoryGirl.create(:discovery_rule, :priority => 1, :search => "facts.somefact = abc",
|
93
|
+
:hostgroup => FactoryGirl.create(:hostgroup, :with_os, :with_rootpass))
|
94
|
+
post :auto_provision, { :id => host.id }
|
95
|
+
show_response = ActiveSupport::JSON.decode(@response.body)
|
96
|
+
assert_equal "No rule found for host #{host.name}", show_response["error"]["message"]
|
97
|
+
end
|
98
|
+
|
99
|
+
def test_auto_provision_with_wrong_disabled_org_sucess
|
100
|
+
disable_orchestration
|
101
|
+
SETTINGS[:organizations_enabled] = false
|
102
|
+
facts = @facts.merge({"somefact" => "abc"})
|
103
|
+
host = Host::Discovered.import_host_and_facts(facts).first
|
104
|
+
FactoryGirl.create(:discovery_rule, :priority => 1, :search => "facts.somefact = abc",
|
105
|
+
:hostgroup => FactoryGirl.create(:hostgroup, :with_os, :with_rootpass),
|
106
|
+
:locations => [host.location])
|
107
|
+
post :auto_provision, { :id => host.id }
|
108
|
+
assert_match host.name, @response.body
|
80
109
|
assert_response :success
|
81
110
|
end
|
82
111
|
|
@@ -84,30 +113,38 @@ class Api::V2::DiscoveredHostsControllerTest < ActionController::TestCase
|
|
84
113
|
disable_orchestration
|
85
114
|
facts = @facts.merge({"somefact" => "abc"})
|
86
115
|
host = Host::Discovered.import_host_and_facts(facts).first
|
87
|
-
FactoryGirl.create(:discovery_rule, :priority => 1, :search => "facts.somefact = abc",
|
116
|
+
FactoryGirl.create(:discovery_rule, :priority => 1, :search => "facts.somefact = abc",
|
117
|
+
:hostgroup => FactoryGirl.create(:hostgroup, :with_os, :with_rootpass),
|
118
|
+
:organizations => [host.organization], :locations => [host.location])
|
88
119
|
post :auto_provision, { :id => host.id }
|
89
120
|
assert_response :success
|
90
121
|
# test deletion of a managed host
|
91
122
|
switch_controller(::Api::V2::HostsController) do
|
92
123
|
delete :destroy, { :id => host.id }
|
124
|
+
assert_match host.name, @response.body
|
93
125
|
assert_response :success
|
94
126
|
end
|
95
127
|
end
|
96
128
|
|
97
|
-
def
|
129
|
+
def test_auto_provision_no_rule_error
|
98
130
|
disable_orchestration
|
99
131
|
facts = @facts.merge({"somefact" => "abc"})
|
100
132
|
host = Host::Discovered.import_host_and_facts(facts).first
|
101
133
|
post :auto_provision, { :id => host.id }
|
102
|
-
assert_response :
|
134
|
+
assert_response :not_found
|
135
|
+
show_response = ActiveSupport::JSON.decode(@response.body)
|
136
|
+
assert_equal "No rule found for host #{host.name}", show_response["error"]["message"]
|
103
137
|
end
|
104
138
|
|
105
139
|
def test_auto_provision_all_success
|
106
140
|
disable_orchestration
|
107
141
|
facts = @facts.merge({"somefact" => "abc"})
|
108
|
-
Host::Discovered.import_host_and_facts(facts).first
|
109
|
-
FactoryGirl.create(:discovery_rule, :priority => 1, :search => "facts.somefact = abc",
|
142
|
+
host = Host::Discovered.import_host_and_facts(facts).first
|
143
|
+
FactoryGirl.create(:discovery_rule, :priority => 1, :search => "facts.somefact = abc",
|
144
|
+
:hostgroup => FactoryGirl.create(:hostgroup, :with_os, :with_rootpass), :organizations => [host.organization],
|
145
|
+
:locations => [host.location])
|
110
146
|
post :auto_provision_all, {}
|
147
|
+
assert_equal '{}', @response.body
|
111
148
|
assert_response :success
|
112
149
|
end
|
113
150
|
|
@@ -116,6 +153,7 @@ class Api::V2::DiscoveredHostsControllerTest < ActionController::TestCase
|
|
116
153
|
facts = @facts.merge({"somefact" => "abc"})
|
117
154
|
Host::Discovered.import_host_and_facts(facts).first
|
118
155
|
post :auto_provision_all, {}
|
156
|
+
assert_equal '{}', @response.body
|
119
157
|
assert_response :success
|
120
158
|
end
|
121
159
|
|
@@ -6,12 +6,17 @@ class DiscoveredHostsControllerTest < ActionController::TestCase
|
|
6
6
|
setup do
|
7
7
|
@request.env['HTTP_REFERER'] = '/discovery_rules'
|
8
8
|
@facts = {
|
9
|
-
"interfaces"
|
10
|
-
"ipaddress"
|
11
|
-
"ipaddress_eth0"
|
12
|
-
"macaddress_eth0"
|
13
|
-
"discovery_bootif"
|
9
|
+
"interfaces" => "lo,eth0",
|
10
|
+
"ipaddress" => "192.168.100.42",
|
11
|
+
"ipaddress_eth0" => "192.168.100.42",
|
12
|
+
"macaddress_eth0" => "AA:BB:CC:DD:EE:FF",
|
13
|
+
"discovery_bootif" => "AA:BB:CC:DD:EE:FF",
|
14
|
+
"physicalprocessorcount" => "42",
|
14
15
|
}
|
16
|
+
FactoryGirl.create(:setting,
|
17
|
+
:name => 'discovery_reboot',
|
18
|
+
:value => true,
|
19
|
+
:category => 'Setting::Discovered')
|
15
20
|
end
|
16
21
|
|
17
22
|
def test_index
|
@@ -31,7 +36,7 @@ class DiscoveredHostsControllerTest < ActionController::TestCase
|
|
31
36
|
assert_response :success
|
32
37
|
end
|
33
38
|
|
34
|
-
def
|
39
|
+
def test_edit_form_elements
|
35
40
|
host = Host::Discovered.import_host_and_facts(@facts).first
|
36
41
|
get :edit, {:id => host.id}, set_session_user
|
37
42
|
assert_select "select" do |elements|
|
@@ -42,9 +47,12 @@ class DiscoveredHostsControllerTest < ActionController::TestCase
|
|
42
47
|
end
|
43
48
|
end
|
44
49
|
|
45
|
-
def
|
46
|
-
|
47
|
-
|
50
|
+
def test_edit_form_attributes
|
51
|
+
host = Host::Discovered.import_host_and_facts(@facts).first
|
52
|
+
Host.transaction do
|
53
|
+
get :edit, {:id => host.id}, set_session_user
|
54
|
+
end
|
55
|
+
assert_not_nil host.cpu_count
|
48
56
|
end
|
49
57
|
|
50
58
|
def test_add_entry_to_nav_menu
|
@@ -80,10 +88,10 @@ class DiscoveredHostsControllerTest < ActionController::TestCase
|
|
80
88
|
host = FactoryGirl.create(:host,
|
81
89
|
:ip => '1.2.3.4',
|
82
90
|
:type => "Host::Discovered")
|
83
|
-
::ProxyAPI::BMC.any_instance.expects(:power).raises("request
|
91
|
+
::ProxyAPI::BMC.any_instance.expects(:power).raises("request failed")
|
84
92
|
post "reboot", { :id => host.id }, set_session_user
|
85
93
|
assert_redirected_to discovered_hosts_url
|
86
|
-
|
94
|
+
assert_match(/ERF50-6734/, flash[:error])
|
87
95
|
end
|
88
96
|
|
89
97
|
def test_auto_provision_success
|
@@ -125,6 +133,39 @@ class DiscoveredHostsControllerTest < ActionController::TestCase
|
|
125
133
|
assert_nil flash[:error]
|
126
134
|
end
|
127
135
|
|
136
|
+
def test_reboot_all_success
|
137
|
+
@request.env["HTTP_REFERER"] = discovered_hosts_url
|
138
|
+
host = FactoryGirl.create(:host,
|
139
|
+
:ip => '1.2.3.4',
|
140
|
+
:type => "Host::Discovered")
|
141
|
+
::ProxyAPI::BMC.any_instance.stubs(:power).returns(true)
|
142
|
+
post "reboot", { :id => host.id }, set_session_user
|
143
|
+
assert_redirected_to discovered_hosts_url
|
144
|
+
assert_equal "Rebooting host #{host.name}", flash[:notice]
|
145
|
+
end
|
146
|
+
|
147
|
+
def test_reboot_all_failure
|
148
|
+
@request.env["HTTP_REFERER"] = discovered_hosts_url
|
149
|
+
host = FactoryGirl.create(:host,
|
150
|
+
:ip => '1.2.3.4',
|
151
|
+
:type => "Host::Discovered")
|
152
|
+
::ProxyAPI::BMC.any_instance.stubs(:power).returns(false)
|
153
|
+
post "reboot_all", { }, set_session_user
|
154
|
+
assert_redirected_to discovered_hosts_url
|
155
|
+
assert_equal "Errors during reboot: #{host.name}: failed to reboot", flash[:error]
|
156
|
+
end
|
157
|
+
|
158
|
+
def test_reboot_all_error
|
159
|
+
@request.env["HTTP_REFERER"] = discovered_hosts_url
|
160
|
+
FactoryGirl.create(:host,
|
161
|
+
:ip => '1.2.3.4',
|
162
|
+
:type => "Host::Discovered")
|
163
|
+
::ProxyAPI::BMC.any_instance.expects(:power).raises("request must fail")
|
164
|
+
post "reboot_all", { }, set_session_user
|
165
|
+
assert_redirected_to discovered_hosts_url
|
166
|
+
assert_match(/ERF50-6734/, flash[:error])
|
167
|
+
end
|
168
|
+
|
128
169
|
private
|
129
170
|
|
130
171
|
def initialize_host
|
@@ -41,31 +41,38 @@ class FindDiscoveryRulesTest < ActiveSupport::TestCase
|
|
41
41
|
test "rule out of one is found for a discovered host" do
|
42
42
|
facts = @facts.merge({"somefact" => "abc"})
|
43
43
|
host = Host::Discovered.import_host_and_facts(facts).first
|
44
|
-
r1 = FactoryGirl.create(:discovery_rule, :priority => 1, :search => "facts.somefact = abc"
|
44
|
+
r1 = FactoryGirl.create(:discovery_rule, :priority => 1, :search => "facts.somefact = abc",
|
45
|
+
:organizations => [host.organization], :locations => [host.location])
|
45
46
|
assert_equal find_discovery_rule(host), r1
|
46
47
|
end
|
47
48
|
|
48
49
|
test "first rule out of two is found for a discovered host" do
|
49
50
|
facts = @facts.merge({"somefact" => "abc"})
|
50
51
|
host = Host::Discovered.import_host_and_facts(facts).first
|
51
|
-
r1 = FactoryGirl.create(:discovery_rule, :priority => 1, :search => "facts.somefact = abc"
|
52
|
-
|
52
|
+
r1 = FactoryGirl.create(:discovery_rule, :priority => 1, :search => "facts.somefact = abc",
|
53
|
+
:organizations => [host.organization], :locations => [host.location])
|
54
|
+
FactoryGirl.create(:discovery_rule, :priority => 2, :search => "facts.somefact = abc",
|
55
|
+
:organizations => [host.organization], :locations => [host.location])
|
53
56
|
assert_equal find_discovery_rule(host), r1
|
54
57
|
end
|
55
58
|
|
56
59
|
test "second rule out of two is found for a discovered host" do
|
57
60
|
facts = @facts.merge({"somefact" => "abc"})
|
58
61
|
host = Host::Discovered.import_host_and_facts(facts).first
|
59
|
-
FactoryGirl.create(:discovery_rule, :priority => 1, :search => "facts.somefact = x"
|
60
|
-
|
62
|
+
FactoryGirl.create(:discovery_rule, :priority => 1, :search => "facts.somefact = x",
|
63
|
+
:organizations => [host.organization], :locations => [host.location])
|
64
|
+
r2 = FactoryGirl.create(:discovery_rule, :priority => 2, :search => "facts.somefact = abc",
|
65
|
+
:organizations => [host.organization], :locations => [host.location])
|
61
66
|
assert_equal find_discovery_rule(host), r2
|
62
67
|
end
|
63
68
|
|
64
69
|
test "drained rule does not match for a discovered host" do
|
65
70
|
facts = @facts.merge({"somefact" => "abc"})
|
66
71
|
host = Host::Discovered.import_host_and_facts(facts).first
|
67
|
-
r1 = FactoryGirl.create(:discovery_rule, :priority => 1, :search => "facts.somefact = abc", :max_count => 1
|
68
|
-
|
72
|
+
r1 = FactoryGirl.create(:discovery_rule, :priority => 1, :search => "facts.somefact = abc", :max_count => 1,
|
73
|
+
:organizations => [host.organization], :locations => [host.location])
|
74
|
+
r2 = FactoryGirl.create(:discovery_rule, :priority => 2, :search => "facts.somefact = abc",
|
75
|
+
:organizations => [host.organization], :locations => [host.location])
|
69
76
|
FactoryGirl.create(:host, :discovery_rule => r1)
|
70
77
|
assert_equal find_discovery_rule(host), r2
|
71
78
|
end
|
@@ -73,7 +80,8 @@ class FindDiscoveryRulesTest < ActiveSupport::TestCase
|
|
73
80
|
test "discovery rule is associated after auto provisioning" do
|
74
81
|
facts = @facts.merge({"somefact" => "abc"})
|
75
82
|
host = Host::Discovered.import_host_and_facts(facts).first
|
76
|
-
r1 = FactoryGirl.create(:discovery_rule, :priority => 1, :search => "facts.somefact = abc"
|
83
|
+
r1 = FactoryGirl.create(:discovery_rule, :priority => 1, :search => "facts.somefact = abc",
|
84
|
+
:organizations => [host.organization], :locations => [host.location])
|
77
85
|
perform_auto_provision host, r1
|
78
86
|
assert_equal host.primary_interface.managed, true
|
79
87
|
assert_equal host.build, true
|
@@ -84,15 +92,18 @@ class FindDiscoveryRulesTest < ActiveSupport::TestCase
|
|
84
92
|
test "rules with incorrect syntax are skipped" do
|
85
93
|
facts = @facts.merge({"somefact" => "abc"})
|
86
94
|
host = Host::Discovered.import_host_and_facts(facts).first
|
87
|
-
FactoryGirl.create(:discovery_rule, :priority => 1, :search => '=!^$#@?x'
|
88
|
-
|
95
|
+
FactoryGirl.create(:discovery_rule, :priority => 1, :search => '=!^$#@?x',
|
96
|
+
:organizations => [host.organization], :locations => [host.location])
|
97
|
+
r2 = FactoryGirl.create(:discovery_rule, :priority => 2, :search => "facts.somefact = abc",
|
98
|
+
:organizations => [host.organization], :locations => [host.location])
|
89
99
|
assert_equal find_discovery_rule(host), r2
|
90
100
|
end
|
91
101
|
|
92
102
|
test "hostname is copied after auto provisioning" do
|
93
103
|
facts = @facts.merge({"somefact" => "abc"})
|
94
104
|
host = Host::Discovered.import_host_and_facts(facts).first
|
95
|
-
r1 = FactoryGirl.create(:discovery_rule, :priority => 1, :search => "facts.somefact = abc"
|
105
|
+
r1 = FactoryGirl.create(:discovery_rule, :priority => 1, :search => "facts.somefact = abc",
|
106
|
+
:organizations => [host.organization], :locations => [host.location])
|
96
107
|
perform_auto_provision host, r1
|
97
108
|
assert_equal host.name, "macaabbccddeeff"
|
98
109
|
end
|
@@ -121,7 +132,9 @@ class FindDiscoveryRulesTest < ActiveSupport::TestCase
|
|
121
132
|
host = Host::Discovered.import_host_and_facts(@facts).first
|
122
133
|
r1 = FactoryGirl.create(:discovery_rule,
|
123
134
|
:search => "facts.somefact = abc",
|
124
|
-
:hostname => '<%= "" %>'
|
135
|
+
:hostname => '<%= "" %>',
|
136
|
+
:organizations => [host.organization],
|
137
|
+
:locations => [host.location])
|
125
138
|
perform_auto_provision host, r1
|
126
139
|
assert_equal "macaabbccddeeff", host.name
|
127
140
|
end
|
@@ -130,7 +143,9 @@ class FindDiscoveryRulesTest < ActiveSupport::TestCase
|
|
130
143
|
host = Host::Discovered.import_host_and_facts(@facts).first
|
131
144
|
r1 = FactoryGirl.create(:discovery_rule,
|
132
145
|
:search => "facts.somefact = abc",
|
133
|
-
:hostname => 'x<%= 1+1 %>'
|
146
|
+
:hostname => 'x<%= 1+1 %>',
|
147
|
+
:organizations => [host.organization],
|
148
|
+
:locations => [host.location])
|
134
149
|
perform_auto_provision host, r1
|
135
150
|
assert_equal "x2", host.name
|
136
151
|
end
|
@@ -139,7 +154,9 @@ class FindDiscoveryRulesTest < ActiveSupport::TestCase
|
|
139
154
|
host = Host::Discovered.import_host_and_facts(@facts).first
|
140
155
|
r1 = FactoryGirl.create(:discovery_rule,
|
141
156
|
:search => "facts.somefact = abc",
|
142
|
-
:hostname => 'x<%= rand(4) %>'
|
157
|
+
:hostname => 'x<%= rand(4) %>',
|
158
|
+
:organizations => [host.organization],
|
159
|
+
:locations => [host.location])
|
143
160
|
perform_auto_provision host, r1
|
144
161
|
assert_match(/x[0123]/, host.name)
|
145
162
|
end
|
@@ -148,7 +165,9 @@ class FindDiscoveryRulesTest < ActiveSupport::TestCase
|
|
148
165
|
host = Host::Discovered.import_host_and_facts(@facts).first
|
149
166
|
r1 = FactoryGirl.create(:discovery_rule,
|
150
167
|
:search => "facts.somefact = abc",
|
151
|
-
:hostname => 'x<%= @host.name %>'
|
168
|
+
:hostname => 'x<%= @host.name %>',
|
169
|
+
:organizations => [host.organization],
|
170
|
+
:locations => [host.location])
|
152
171
|
perform_auto_provision host, r1
|
153
172
|
assert_equal "xmacaabbccddeeff", host.name
|
154
173
|
end
|
@@ -157,7 +176,9 @@ class FindDiscoveryRulesTest < ActiveSupport::TestCase
|
|
157
176
|
host = Host::Discovered.import_host_and_facts(@facts).first
|
158
177
|
r1 = FactoryGirl.create(:discovery_rule,
|
159
178
|
:search => "facts.somefact = abc",
|
160
|
-
:hostname => 'x<%= @host.ip.gsub(".","-") %>'
|
179
|
+
:hostname => 'x<%= @host.ip.gsub(".","-") %>',
|
180
|
+
:organizations => [host.organization],
|
181
|
+
:locations => [host.location])
|
161
182
|
perform_auto_provision host, r1
|
162
183
|
assert_equal "x192-168-100-42", host.name
|
163
184
|
end
|
@@ -167,7 +188,9 @@ class FindDiscoveryRulesTest < ActiveSupport::TestCase
|
|
167
188
|
host = Host::Discovered.import_host_and_facts(@facts).first
|
168
189
|
r1 = FactoryGirl.create(:discovery_rule,
|
169
190
|
:search => "facts.somefact = abc",
|
170
|
-
:hostname => 'x<%= @host.facts["somefact"] %>'
|
191
|
+
:hostname => 'x<%= @host.facts["somefact"] %>',
|
192
|
+
:organizations => [host.organization],
|
193
|
+
:locations => [host.location])
|
171
194
|
perform_auto_provision host, r1
|
172
195
|
assert_equal "xabc", host.name
|
173
196
|
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class DiscoveryRuleTest < ActiveSupport::TestCase
|
4
|
+
setup do
|
5
|
+
@hg_org = FactoryGirl.create(:organization, :name => 'hgorg')
|
6
|
+
@hg_org.save!
|
7
|
+
@hostgroup = FactoryGirl.create(:hostgroup)
|
8
|
+
@hostgroup.organizations << @hg_org
|
9
|
+
@hostgroup.save!
|
10
|
+
end
|
11
|
+
|
12
|
+
test "should be able to create a rule without entering hosts limit" do
|
13
|
+
rule = DiscoveryRule.new :name => "myrule",
|
14
|
+
:search => "cpu_count > 1",
|
15
|
+
:priority => "1",
|
16
|
+
:hostgroup_id => @hostgroup.id,
|
17
|
+
:organization_ids => [@hg_org.id]
|
18
|
+
assert_valid rule
|
19
|
+
end
|
20
|
+
|
21
|
+
test "should be able to create a rule without entering priority" do
|
22
|
+
rule = DiscoveryRule.new :name => "myrule",
|
23
|
+
:search => "cpu_count > 1",
|
24
|
+
:max_count => "1",
|
25
|
+
:hostgroup_id => @hostgroup.id,
|
26
|
+
:organization_ids => [@hg_org.id]
|
27
|
+
assert_valid rule
|
28
|
+
end
|
29
|
+
|
30
|
+
test "should not be able to create a rule without a hostgroup" do
|
31
|
+
rule = DiscoveryRule.new :name => "myrule",
|
32
|
+
:search => "cpu_count > 1",
|
33
|
+
:organization_ids => [@hg_org.id]
|
34
|
+
refute_valid rule
|
35
|
+
assert_equal "can't be blank", rule.errors[:hostgroup_id].first
|
36
|
+
end
|
37
|
+
|
38
|
+
test "should enforce hostgroup organizations" do
|
39
|
+
skip unless SETTINGS[:organizations_enabled]
|
40
|
+
rule = DiscoveryRule.new :name => "myrule",
|
41
|
+
:search => "cpu_count > 1",
|
42
|
+
:hostgroup_id => @hostgroup.id
|
43
|
+
refute_valid rule
|
44
|
+
assert_equal "Host group organization #{@hg_org.name} must also be associated to the discovery rule", rule.errors[:organizations].first
|
45
|
+
end
|
46
|
+
|
47
|
+
test "should enforce hostgroup organizations and locations" do
|
48
|
+
skip unless (SETTINGS[:organizations_enabled] && SETTINGS[:locations_enabled])
|
49
|
+
loc = FactoryGirl.create(:location, :name => "hgloc")
|
50
|
+
@hostgroup.locations << loc
|
51
|
+
@hostgroup.save!
|
52
|
+
rule = DiscoveryRule.new :name => "myrule",
|
53
|
+
:search => "cpu_count > 1",
|
54
|
+
:hostgroup_id => @hostgroup.id,
|
55
|
+
:organization_ids => [@hg_org.id]
|
56
|
+
refute_valid rule
|
57
|
+
assert_equal "Host group location #{loc.name} must also be associated to the discovery rule", rule.errors[:locations].first
|
58
|
+
end
|
59
|
+
end
|
@@ -2,7 +2,6 @@ require 'test_helper'
|
|
2
2
|
|
3
3
|
class HostDiscoveredTest < ActiveSupport::TestCase
|
4
4
|
setup do
|
5
|
-
User.current = User.find_by_login "admin"
|
6
5
|
FactoryGirl.create(:setting,
|
7
6
|
:name => 'discovery_fact',
|
8
7
|
:value => 'discovery_bootif',
|
@@ -24,12 +23,39 @@ class HostDiscoveredTest < ActiveSupport::TestCase
|
|
24
23
|
assert Host::Discovered.find_by_name('mace41f13cc3658')
|
25
24
|
end
|
26
25
|
|
26
|
+
test "should setup subnet" do
|
27
|
+
raw = parse_json_fixture('/facts.json')
|
28
|
+
subnet = FactoryGirl.create(:subnet, :organizations => [Organization.first], :locations => [Location.first])
|
29
|
+
Subnet.expects(:subnet_for).with('10.35.27.3').returns(subnet)
|
30
|
+
host = Host::Discovered.import_host_and_facts(raw['facts']).first
|
31
|
+
assert_equal subnet, host.primary_interface.subnet
|
32
|
+
end
|
33
|
+
|
34
|
+
test "should setup subnet with org and loc" do
|
35
|
+
org = FactoryGirl.create(:organization, :name => "subnet_org")
|
36
|
+
loc = FactoryGirl.create(:location, :name => "subnet_loc")
|
37
|
+
FactoryGirl.create(:setting,
|
38
|
+
:name => 'discovery_organization',
|
39
|
+
:value => org.name,
|
40
|
+
:category => 'Setting::Discovered')
|
41
|
+
FactoryGirl.create(:setting,
|
42
|
+
:name => 'discovery_location',
|
43
|
+
:value => loc.name,
|
44
|
+
:category => 'Setting::Discovered')
|
45
|
+
raw = parse_json_fixture('/facts.json')
|
46
|
+
subnet = FactoryGirl.create(:subnet, :organizations => [org], :locations => [loc])
|
47
|
+
Subnet.expects(:subnet_for).with('10.35.27.3').returns(subnet)
|
48
|
+
host = Host::Discovered.import_host_and_facts(raw['facts']).first
|
49
|
+
assert_equal subnet, host.primary_interface.subnet
|
50
|
+
end
|
51
|
+
|
27
52
|
test "should raise when fact_name setting isn't present" do
|
28
53
|
raw = parse_json_fixture('/facts.json')
|
29
54
|
Setting[:discovery_fact] = 'macaddress_foo'
|
30
|
-
assert_raises
|
55
|
+
exception = assert_raises(::Foreman::Exception) do
|
31
56
|
Host::Discovered.import_host_and_facts(raw['facts'])
|
32
57
|
end
|
58
|
+
assert_match(/Expected discovery_fact '\w+' is missing/, exception.message)
|
33
59
|
end
|
34
60
|
|
35
61
|
test "should be able to refresh facts" do
|
@@ -51,9 +77,10 @@ class HostDiscoveredTest < ActiveSupport::TestCase
|
|
51
77
|
test "should create discovered host with default name if fact_name isn't a valid mac" do
|
52
78
|
raw = parse_json_fixture('/facts.json')
|
53
79
|
Setting[:discovery_fact] = 'lsbdistcodename'
|
54
|
-
|
55
|
-
|
56
|
-
|
80
|
+
exception = assert_raises(::Foreman::Exception) do
|
81
|
+
Host::Discovered.import_host_and_facts(raw['facts'])
|
82
|
+
end
|
83
|
+
assert_match(/Unable to detect primary interface using MAC/, exception.message)
|
57
84
|
end
|
58
85
|
|
59
86
|
test "should create discovered host with prefix" do
|
@@ -84,8 +111,44 @@ class HostDiscoveredTest < ActiveSupport::TestCase
|
|
84
111
|
assert host.name.start_with?('mac')
|
85
112
|
end
|
86
113
|
|
114
|
+
test 'discovered host can be searched in multiple taxonomies' do
|
115
|
+
org1 = FactoryGirl.create(:organization)
|
116
|
+
org2 = FactoryGirl.create(:organization)
|
117
|
+
org3 = FactoryGirl.create(:organization)
|
118
|
+
user = FactoryGirl.create(:user, :organizations => [org1, org2])
|
119
|
+
host1 = FactoryGirl.create(:host, :type => "Host::Discovered", :organization => org1)
|
120
|
+
host2 = FactoryGirl.create(:host, :type => "Host::Discovered", :organization => org2)
|
121
|
+
host3 = FactoryGirl.create(:host, :type => "Host::Discovered", :organization => org3)
|
122
|
+
hosts = nil
|
123
|
+
|
124
|
+
assert_nil Organization.current
|
125
|
+
as_user(user) do
|
126
|
+
hosts = Host::Discovered.all
|
127
|
+
end
|
128
|
+
assert_includes hosts, host1
|
129
|
+
assert_includes hosts, host2
|
130
|
+
refute_includes hosts, host3
|
131
|
+
|
132
|
+
as_user(:one) do
|
133
|
+
hosts = Host::Discovered.all
|
134
|
+
end
|
135
|
+
assert_includes hosts, host1
|
136
|
+
assert_includes hosts, host2
|
137
|
+
assert_includes hosts, host3
|
138
|
+
end
|
139
|
+
|
140
|
+
test "provisioning a discovered host without saving it doesn't create a token" do
|
141
|
+
Setting[:token_duration] = 30 #enable tokens so that we only test the CR
|
142
|
+
raw = parse_json_fixture('/facts.json')
|
143
|
+
Setting[:discovery_prefix] = '123'
|
144
|
+
host = Host::Discovered.import_host_and_facts(raw['facts']).first
|
145
|
+
host.save
|
146
|
+
h = ::ForemanDiscovery::HostConverter.to_managed(host)
|
147
|
+
refute_valid h
|
148
|
+
assert Token.where(:host_id => h.id).empty?
|
149
|
+
end
|
150
|
+
|
87
151
|
def parse_json_fixture(relative_path)
|
88
152
|
return JSON.parse(File.read(File.expand_path(File.dirname(__FILE__) + relative_path)))
|
89
153
|
end
|
90
|
-
|
91
154
|
end
|
@@ -1,63 +1,78 @@
|
|
1
1
|
require 'test_helper'
|
2
2
|
|
3
|
-
class
|
4
|
-
|
5
|
-
'192.168.0.30'
|
6
|
-
end
|
7
|
-
|
8
|
-
def primary_interface
|
9
|
-
'eth1'
|
10
|
-
end
|
3
|
+
class PuppetFactParserStub
|
4
|
+
attr_reader :interfaces, :facts
|
11
5
|
|
12
|
-
def interfaces
|
13
|
-
|
14
|
-
|
15
|
-
'eth3' => {'ipaddress' => '192.168.2.2'},
|
16
|
-
'eth2' => {'macaddress' => 'bb:00:00:00:00:01', 'ipaddress' => '192.168.1.2'}
|
17
|
-
}.with_indifferent_access
|
6
|
+
def initialize(interfaces, facts)
|
7
|
+
@interfaces = interfaces
|
8
|
+
@facts = facts
|
18
9
|
end
|
19
10
|
|
20
|
-
def
|
21
|
-
|
22
|
-
:ipaddress => '192.168.0.2', :macaddress => 'bb:00:00:00:00:01', :interfaces => 'eth0,eth1,lo',
|
23
|
-
:macaddress_eth1 => 'bb:00:00:00:00:01', :ipaddress_eth1 => '192.168.1.2',
|
24
|
-
:macaddress_eth0 => 'aa:00:00:00:00:01', :ipaddress_eth0 => '192.168.0.2',
|
25
|
-
:macaddress_lo => '', :ipaddress_lo => '127.0.0.1',
|
26
|
-
:mac_fact => 'AA:00:00:00:00:01'
|
27
|
-
}.with_indifferent_access
|
28
|
-
end
|
11
|
+
def suggested_primary_interface(_); end
|
12
|
+
def parse_interfaces?; end
|
29
13
|
|
30
14
|
include PuppetFactParserExtensions
|
31
15
|
end
|
32
16
|
|
33
17
|
class PuppetFactParserTest < ActiveSupport::TestCase
|
34
18
|
setup do
|
35
|
-
|
19
|
+
interfaces = {
|
20
|
+
'eth0' => {'macaddress' => 'aa:bb:cc:dd:ee:f1', 'ipaddress' => '192.168.1.1'},
|
21
|
+
'eth1' => {'macaddress' => 'aa:bb:cc:dd:ee:f2', 'ipaddress' => '192.168.1.2'},
|
22
|
+
'eth2' => {'macaddress' => 'aa:bb:cc:dd:ee:f3', 'ipaddress' => '192.168.1.3'},
|
23
|
+
}.with_indifferent_access
|
24
|
+
facts = {
|
25
|
+
:macaddress_eth0 => 'aa:bb:cc:dd:ee:f1',
|
26
|
+
:macaddress_eth1 => 'aa:bb:cc:dd:ee:f2',
|
27
|
+
:macaddress_eth2 => 'aa:bb:cc:dd:ee:f3',
|
28
|
+
:ipaddress_eth0 => '192.168.1.1',
|
29
|
+
:ipaddress_eth1 => '192.168.1.2',
|
30
|
+
:ipaddress_eth2 => '192.168.1.3',
|
31
|
+
:ipaddress => '192.168.1.2',
|
32
|
+
:macaddress => 'aa:bb:cc:dd:ee:f2',
|
33
|
+
:discovery_bootif => 'aa:bb:cc:dd:ee:f3'
|
34
|
+
}.with_indifferent_access
|
35
|
+
@parser = PuppetFactParserStub.new(interfaces, facts)
|
36
|
+
@host = Host::Discovered.new(:name => 'dummy')
|
36
37
|
end
|
37
38
|
|
38
|
-
test
|
39
|
-
@parser.
|
40
|
-
assert_equal '192.168.0.30', @parser.ip
|
39
|
+
test "#suggested_primary_interface detects interface eth2" do
|
40
|
+
assert_equal 'eth2', @parser.suggested_primary_interface(@host).try(:first)
|
41
41
|
end
|
42
42
|
|
43
|
-
test
|
44
|
-
|
45
|
-
assert_equal '
|
43
|
+
test "#suggested_primary_interface detects interface eth1" do
|
44
|
+
FacterUtils.stubs(:bootif_mac).returns('aa:bb:cc:dd:ee:f2')
|
45
|
+
assert_equal 'eth1', @parser.suggested_primary_interface(@host).try(:first)
|
46
46
|
end
|
47
47
|
|
48
|
-
test
|
49
|
-
|
50
|
-
|
48
|
+
test "#suggested_primary_interface detects interface with user defined bootif fact name" do
|
49
|
+
FacterUtils.stubs(:bootif_name).returns('my_primary')
|
50
|
+
@parser.facts[:my_primary] = 'aa:bb:cc:dd:ee:f1'
|
51
|
+
assert_equal 'eth0', @parser.suggested_primary_interface(@host).try(:first)
|
51
52
|
end
|
52
53
|
|
53
|
-
test
|
54
|
-
@parser.facts[:
|
55
|
-
|
56
|
-
|
54
|
+
test "#suggested_primary_interface errors out when bootif fact defines unknown MAC" do
|
55
|
+
@parser.facts[:discovery_bootif] = 'aa:aa:aa:aa:aa:aa'
|
56
|
+
exception = assert_raises(::Foreman::Exception) do
|
57
|
+
@parser.suggested_primary_interface(@host)
|
58
|
+
end
|
59
|
+
assert_match(/Unable to detect primary interface using MAC/, exception.message)
|
57
60
|
end
|
58
61
|
|
59
|
-
test
|
60
|
-
@parser.
|
61
|
-
|
62
|
+
test "#suggested_primary_interface errors out when bootif fact is missing" do
|
63
|
+
@parser.facts.delete(:discovery_bootif)
|
64
|
+
exception = assert_raises(::Foreman::Exception) do
|
65
|
+
@parser.suggested_primary_interface(@host)
|
66
|
+
end
|
67
|
+
assert_match(/Unable to detect primary interface using MAC/, exception.message)
|
62
68
|
end
|
69
|
+
|
70
|
+
test "#suggested_primary_interface detects interface even when 'ignore_puppet_facts_for_provisioning' is set" do
|
71
|
+
FactoryGirl.create(:setting,
|
72
|
+
:name => 'ignore_puppet_facts_for_provisioning',
|
73
|
+
:value => true,
|
74
|
+
:category => 'Setting::Provisioning')
|
75
|
+
assert_equal 'eth2', @parser.suggested_primary_interface(@host).try(:first)
|
76
|
+
end
|
77
|
+
|
63
78
|
end
|