foreman_default_hostgroup 2.0.1 → 2.1.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 +5 -13
- data/README.md +12 -10
- data/lib/default_hostgroup_managed_host_patch.rb +32 -25
- data/lib/foreman_default_hostgroup/version.rb +1 -1
- data/test/unit/default_hostgroup_test.rb +41 -8
- data/test/unit/facts.json +1 -1
- metadata +6 -7
- data/config/environment.rb +0 -0
checksums.yaml
CHANGED
@@ -1,15 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
|
5
|
-
data.tar.gz: !binary |-
|
6
|
-
OWNkODUwM2VmYTk4YWFhYzQ2MDViZWRlZTQyZTNlMWE1ZTA5MDFlNQ==
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 5d454d40d36c903cdb01917607ff7bb5a95ec18f
|
4
|
+
data.tar.gz: a620ee8b99e5bf30147d2266378462473b326628
|
7
5
|
SHA512:
|
8
|
-
metadata.gz:
|
9
|
-
|
10
|
-
MmExYjU2MzAxMWIwNjViY2MyNGQ3MzVjMWVjNmY3YjQzOTM4MGUwOGViMzk3
|
11
|
-
NjVjZDk2NDQ0MThhZmRiODc4YjQ5NzJiY2EwYWI2ZjJhZTg3Y2I=
|
12
|
-
data.tar.gz: !binary |-
|
13
|
-
ZTFkMzZlZTgyMjBkYTJkYmI2Nzk2OTQ4YTlkN2UxMzg4ZjdhZDk3YjZiMmJh
|
14
|
-
OTQ5MTZkYjIwNjIxZGRkZDNiYWUzZjkwY2YxNWE1ZGRhYzIwZjc4ZmIxNzBk
|
15
|
-
ZjBjMzE3ZDRjYzUxMzVkOGFhNGI4NDVmN2QyYjQzOTBkOGE5Y2M=
|
6
|
+
metadata.gz: 79200d8486340a22124c1f4b8f7df6645db83fc0c4933cf7f0a9b1269acc5a11648b810718c1dd8a97a9f9a4b0d0bf98fc0bfb638b56616c530cb28e0a1d150b
|
7
|
+
data.tar.gz: 6e49893a8db8af0cde5e8dc7dd242e7de90569182555cfb3232a2c2eb7b01b7bade2ec248ac932714752fb3b7f14830f4acf6ecf4a6920af68faf7cf126afac6
|
data/README.md
CHANGED
@@ -15,32 +15,34 @@ for how to install Foreman plugins
|
|
15
15
|
| <= 1.2 | 0.1.0 |
|
16
16
|
| 1.3 | 1.0.1 |
|
17
17
|
| 1.4 | 1.1.0 |
|
18
|
-
|
|
18
|
+
| 1.5 | 2.0.1 |
|
19
|
+
| >= 1.6 | 2.1.0 |
|
19
20
|
|
20
21
|
## Usage
|
21
22
|
|
22
23
|
The configuration is done inside foreman's plugin settings directory which is
|
23
|
-
|
24
|
+
`~foreman/config/settings.plugins.d/`.
|
24
25
|
|
25
|
-
You can simply copy
|
26
|
-
your needs. The
|
26
|
+
You can simply copy `default_hostgroup.yaml.example` and adjust it to fit
|
27
|
+
your needs. The format is shown in the example. The simplest form would be:
|
27
28
|
|
28
29
|
```
|
29
30
|
---
|
30
31
|
:default_hostgroup:
|
31
|
-
|
32
|
-
|
32
|
+
:facts_map:
|
33
|
+
"Default":
|
34
|
+
"hostname": ".*"
|
33
35
|
```
|
34
36
|
|
35
37
|
*Important Note:* You have to restart foreman in order to apply changes in
|
36
|
-
|
38
|
+
`default_hostgroup.yaml`!
|
37
39
|
|
38
|
-
There are also two more settings under
|
40
|
+
There are also two more settings under `Settings -> DefaultHostgroup`
|
39
41
|
|
40
42
|
| Setting | Description |
|
41
43
|
| ------- | ----------- |
|
42
|
-
|
|
43
|
-
|
|
44
|
+
| `force_hostgroup_match` | Setting this to `true` will perform matching even on hosts that already have a hostgroup set. Enabling this needs `force_hostgroup_match_only_new` to be `false`. Default: `false` |
|
45
|
+
| `force_hostgroup_match_only_new` | Setting this to `true` will only perform matching when a host uploads its facts for the first time, i.e. after provisioning or when adding an existing puppetmaster and thus its nodes into foreman. Default: `true` |
|
44
46
|
|
45
47
|
## TODO
|
46
48
|
|
@@ -10,11 +10,11 @@ module DefaultHostgroupManagedHostPatch
|
|
10
10
|
|
11
11
|
module ClassMethods
|
12
12
|
def import_host_and_facts_with_match_hostgroup hostname, facts, certname = nil, proxy_id = nil
|
13
|
-
host, result = import_host_and_facts_without_match_hostgroup(hostname, facts, certname, proxy_id)
|
13
|
+
@host, result = import_host_and_facts_without_match_hostgroup(hostname, facts, certname, proxy_id)
|
14
14
|
|
15
|
-
unless SETTINGS[:default_hostgroup] && SETTINGS[:default_hostgroup][:
|
15
|
+
unless SETTINGS[:default_hostgroup] && SETTINGS[:default_hostgroup][:facts_map]
|
16
16
|
Rails.logger.warn "DefaultHostgroupMatch: Could not load default_hostgroup map from settings, check config."
|
17
|
-
return host, result
|
17
|
+
return @host, result
|
18
18
|
end
|
19
19
|
|
20
20
|
Rails.logger.debug "DefaultHostgroupMatch: performing Hostgroup match"
|
@@ -22,42 +22,49 @@ module DefaultHostgroupManagedHostPatch
|
|
22
22
|
if Setting[:force_hostgroup_match_only_new]
|
23
23
|
# host.new_record? will only test for the early return in the core method, a real host
|
24
24
|
# will have already been saved at least once.
|
25
|
-
unless host.present? &&
|
25
|
+
unless @host.present? && !@host.new_record? && @host.hostgroup.nil? && @host.reports.empty?
|
26
26
|
|
27
27
|
Rails.logger.debug "DefaultHostgroupMatch: skipping, host exists"
|
28
|
-
return host, result
|
28
|
+
return @host, result
|
29
29
|
end
|
30
30
|
end
|
31
31
|
|
32
32
|
unless Setting[:force_hostgroup_match]
|
33
|
-
if host.hostgroup.present?
|
33
|
+
if @host.hostgroup.present?
|
34
34
|
Rails.logger.debug "DefaultHostgroupMatch: skipping, host has hostgroup"
|
35
|
-
return host, result
|
35
|
+
return @host, result
|
36
36
|
end
|
37
37
|
end
|
38
38
|
|
39
|
-
|
40
|
-
new_hostgroup =
|
39
|
+
facts_map = SETTINGS[:default_hostgroup][:facts_map]
|
40
|
+
new_hostgroup = find_match(facts_map)
|
41
41
|
|
42
|
-
|
43
|
-
unless valid_hostgroup?(hostgroup)
|
44
|
-
Rails.logger.error "DefaultHostgroupMatch: #{hostgroup} is not a valid hostgroup, skipping."
|
45
|
-
next
|
46
|
-
end
|
47
|
-
regex.gsub!(/(\A\/|\/\z)/, '')
|
48
|
-
if Regexp.new(regex).match(hostname)
|
49
|
-
new_hostgroup = Hostgroup.find_by_title(hostgroup)
|
50
|
-
break
|
51
|
-
end
|
52
|
-
end
|
42
|
+
return @host, result unless new_hostgroup
|
53
43
|
|
54
|
-
|
55
|
-
|
56
|
-
host.hostgroup = new_hostgroup
|
57
|
-
host.save(:validate => false)
|
44
|
+
@host.hostgroup = new_hostgroup
|
45
|
+
@host.save(:validate => false)
|
58
46
|
Rails.logger.info "DefaultHostgroupMatch: #{hostname} added to #{new_hostgroup}"
|
59
47
|
|
60
|
-
return host, result
|
48
|
+
return @host, result
|
49
|
+
end
|
50
|
+
|
51
|
+
def group_matches?(fact)
|
52
|
+
fact.each do |fact_name, fact_regex|
|
53
|
+
fact_regex.gsub!(/(\A\/|\/\z)/, '')
|
54
|
+
host_fact_value = @host.facts_hash[fact_name]
|
55
|
+
Rails.logger.info "Fact = #{fact_name}"
|
56
|
+
Rails.logger.info "Regex = #{fact_regex}"
|
57
|
+
return true if Regexp.new(fact_regex).match(host_fact_value)
|
58
|
+
end
|
59
|
+
return false
|
60
|
+
end
|
61
|
+
|
62
|
+
def find_match(facts_map)
|
63
|
+
facts_map.each do |group_name, facts|
|
64
|
+
return Hostgroup.find_by_title(group_name) if group_matches?(facts) and valid_hostgroup?(group_name)
|
65
|
+
end
|
66
|
+
Rails.logger.info "No match ..."
|
67
|
+
return false
|
61
68
|
end
|
62
69
|
|
63
70
|
def valid_hostgroup?(hostgroup)
|
@@ -26,7 +26,7 @@ class DefaultHostgroupTest < ActiveSupport::TestCase
|
|
26
26
|
|
27
27
|
test "full matching regex not enclosed in /" do
|
28
28
|
setup_hostgroup_match
|
29
|
-
SETTINGS[:default_hostgroup][:
|
29
|
+
SETTINGS[:default_hostgroup][:facts_map] = { "Test Full" => {'hostname' =>'^sinn1636.lan$'} }
|
30
30
|
|
31
31
|
hostgroup = Hostgroup.create(:name => "Test Full")
|
32
32
|
raw = parse_json_fixture('/facts.json')
|
@@ -37,7 +37,7 @@ class DefaultHostgroupTest < ActiveSupport::TestCase
|
|
37
37
|
|
38
38
|
test "partial matching regex enclosed in /" do
|
39
39
|
setup_hostgroup_match
|
40
|
-
SETTINGS[:default_hostgroup][:
|
40
|
+
SETTINGS[:default_hostgroup][:facts_map] = { "Test Partial" => {'hostname' => '/\.lan$/' }}
|
41
41
|
|
42
42
|
hostgroup = Hostgroup.create(:name => "Test Partial")
|
43
43
|
raw = parse_json_fixture('/facts.json')
|
@@ -46,9 +46,9 @@ class DefaultHostgroupTest < ActiveSupport::TestCase
|
|
46
46
|
assert_equal hostgroup, Host.find_by_name('sinn1636.lan').hostgroup
|
47
47
|
end
|
48
48
|
|
49
|
-
test "invalid hostgroup
|
49
|
+
test "invalid hostgroup name is ignored" do
|
50
50
|
setup_hostgroup_match
|
51
|
-
SETTINGS[:default_hostgroup][:
|
51
|
+
SETTINGS[:default_hostgroup][:facts_map] = { "Nonexistent Group" => {'hostname' => '.*'}, "Existent Group" => {'hostname' => '/\.lan$/'} }
|
52
52
|
|
53
53
|
hostgroup = Hostgroup.create(:name => "Existent Group")
|
54
54
|
raw = parse_json_fixture('/facts.json')
|
@@ -57,9 +57,42 @@ class DefaultHostgroupTest < ActiveSupport::TestCase
|
|
57
57
|
assert_equal hostgroup, Host.find_by_name('sinn1636.lan').hostgroup
|
58
58
|
end
|
59
59
|
|
60
|
+
test "first matching hostgroup is used" do
|
61
|
+
setup_hostgroup_match
|
62
|
+
SETTINGS[:default_hostgroup][:facts_map] = { "First Group" => {'hostname' => '.*'}, "Second Group" => {'hostname' => '.*'} }
|
63
|
+
|
64
|
+
hostgroup = Hostgroup.create(:name => "First Group")
|
65
|
+
raw = parse_json_fixture('/facts.json')
|
66
|
+
|
67
|
+
assert Host.import_host_and_facts(raw['name'], raw['facts'])
|
68
|
+
assert_equal hostgroup, Host.find_by_name('sinn1636.lan').hostgroup
|
69
|
+
end
|
70
|
+
|
71
|
+
test "invalid keys ignored" do
|
72
|
+
setup_hostgroup_match
|
73
|
+
SETTINGS[:default_hostgroup][:facts_map] = { "First Group" => {'nosuchfact' => '.*', 'hostname' => '.*'} }
|
74
|
+
|
75
|
+
hostgroup = Hostgroup.create(:name => "First Group")
|
76
|
+
raw = parse_json_fixture('/facts.json')
|
77
|
+
|
78
|
+
assert Host.import_host_and_facts(raw['name'], raw['facts'])
|
79
|
+
assert_equal hostgroup, Host.find_by_name('sinn1636.lan').hostgroup
|
80
|
+
end
|
81
|
+
|
82
|
+
test "unmatched values ignored" do
|
83
|
+
setup_hostgroup_match
|
84
|
+
SETTINGS[:default_hostgroup][:facts_map] = { "First Group" => {'hostname' => 'nosuchname', 'osfamily' => '.*'} }
|
85
|
+
|
86
|
+
hostgroup = Hostgroup.create(:name => "First Group")
|
87
|
+
raw = parse_json_fixture('/facts.json')
|
88
|
+
|
89
|
+
assert Host.import_host_and_facts(raw['name'], raw['facts'])
|
90
|
+
assert_equal hostgroup, Host.find_by_name('sinn1636.lan').hostgroup
|
91
|
+
end
|
92
|
+
|
60
93
|
test "default hostgroup" do
|
61
94
|
setup_hostgroup_match
|
62
|
-
SETTINGS[:default_hostgroup][:
|
95
|
+
SETTINGS[:default_hostgroup][:facts_map] = { "Test Default" => {'hostname' =>'.*'} }
|
63
96
|
|
64
97
|
hostgroup = Hostgroup.create(:name => "Test Default")
|
65
98
|
raw = parse_json_fixture('/facts.json')
|
@@ -70,7 +103,7 @@ class DefaultHostgroupTest < ActiveSupport::TestCase
|
|
70
103
|
|
71
104
|
test "host already has a hostgroup" do
|
72
105
|
setup_hostgroup_match
|
73
|
-
SETTINGS[:default_hostgroup][:
|
106
|
+
SETTINGS[:default_hostgroup][:facts_map] = { "Test Default" => {'hostname' => '.*'} }
|
74
107
|
|
75
108
|
hostgroup = Hostgroup.create(:name => "Test Group")
|
76
109
|
Hostgroup.create(:name => "Test Default")
|
@@ -88,7 +121,7 @@ class DefaultHostgroupTest < ActiveSupport::TestCase
|
|
88
121
|
setup_hostgroup_match
|
89
122
|
Setting[:force_hostgroup_match] = true
|
90
123
|
Setting[:force_hostgroup_match_only_new] = false
|
91
|
-
SETTINGS[:default_hostgroup][:
|
124
|
+
SETTINGS[:default_hostgroup][:facts_map] = { "Test Default" => {'hostname' => '.*'} }
|
92
125
|
|
93
126
|
hostgroup = Hostgroup.create(:name => "Test Group")
|
94
127
|
default = Hostgroup.create(:name => "Test Default")
|
@@ -105,7 +138,7 @@ class DefaultHostgroupTest < ActiveSupport::TestCase
|
|
105
138
|
test "hostgroup is not updated if host is not new" do
|
106
139
|
setup_hostgroup_match
|
107
140
|
Setting[:force_hostgroup_match] = true
|
108
|
-
SETTINGS[:default_hostgroup][:
|
141
|
+
SETTINGS[:default_hostgroup][:facts_map] = { "Test Default" => {'hostname' => '.*'} }
|
109
142
|
|
110
143
|
hostgroup = Hostgroup.create(:name => "Test Group")
|
111
144
|
Hostgroup.create(:name => "Test Default")
|
data/test/unit/facts.json
CHANGED
@@ -26,7 +26,7 @@
|
|
26
26
|
"serialnumber": "abcdefg",
|
27
27
|
"processor7": "Intel(R) Xeon(R) CPU E5620 @ 2.40GHz",
|
28
28
|
"macaddress_vnet4": "FE:54:00:62:53:67",
|
29
|
-
"hostname": "
|
29
|
+
"hostname": "sinn1636.lan",
|
30
30
|
"osfamily": "RedHat",
|
31
31
|
"gateway_if": "br180",
|
32
32
|
"lsbrelease": ":core-4.0-amd64:core-4.0-noarch:graphics-4.0-amd64:graphics-4.0-noarch:printing-4.0-amd64:printing-4.0-noarch",
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: foreman_default_hostgroup
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0
|
4
|
+
version: 2.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Greg Sutcliffe
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-12-15 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: Adds the option to specify a default hostgroup for new hosts created
|
14
14
|
from facts/reports
|
@@ -22,7 +22,6 @@ files:
|
|
22
22
|
- LICENSE
|
23
23
|
- README.md
|
24
24
|
- app/models/setting/default_hostgroup.rb
|
25
|
-
- config/environment.rb
|
26
25
|
- lib/default_hostgroup.rake
|
27
26
|
- lib/default_hostgroup_managed_host_patch.rb
|
28
27
|
- lib/foreman_default_hostgroup.rb
|
@@ -41,21 +40,21 @@ require_paths:
|
|
41
40
|
- lib
|
42
41
|
required_ruby_version: !ruby/object:Gem::Requirement
|
43
42
|
requirements:
|
44
|
-
- -
|
43
|
+
- - ">="
|
45
44
|
- !ruby/object:Gem::Version
|
46
45
|
version: '0'
|
47
46
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
48
47
|
requirements:
|
49
|
-
- -
|
48
|
+
- - ">="
|
50
49
|
- !ruby/object:Gem::Version
|
51
50
|
version: '0'
|
52
51
|
requirements: []
|
53
52
|
rubyforge_project:
|
54
|
-
rubygems_version: 2.2.
|
53
|
+
rubygems_version: 2.2.2
|
55
54
|
signing_key:
|
56
55
|
specification_version: 4
|
57
56
|
summary: Default Hostgroup Plugin for Foreman
|
58
57
|
test_files:
|
59
58
|
- test/test_plugin_helper.rb
|
60
|
-
- test/unit/facts.json
|
61
59
|
- test/unit/default_hostgroup_test.rb
|
60
|
+
- test/unit/facts.json
|
data/config/environment.rb
DELETED
File without changes
|