foreman_discovery 3.0.0 → 4.0.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|