foreman_default_hostgroup 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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 9fff9eac64ccb1b62640e34d82cc89c2453b85e8
4
- data.tar.gz: 76a8cd81e26eb4fa703c01a3d659242f8afe9876
3
+ metadata.gz: 8405ed690d11f8d107656ee4a9237c14b0a41b99
4
+ data.tar.gz: 45e335b0f194f8016c020b533e0fee740b4869a3
5
5
  SHA512:
6
- metadata.gz: 6a79eb9494c88912b3d33cd22624a78eaeefa938263f8d49fbbe2ba5a2c22db35b0d638093b72e033f4bd5d3027f7b74e670e24a6217c09642b4d567fbdadbf4
7
- data.tar.gz: 8bc987cfb7e8759e36530cdabb7935601a0d84ca2e71c83a82294897886bce6ce2914723fa390695d84d7ed10639b9d73b5eb9d0f8f0968544c10d486b3748cd
6
+ metadata.gz: 2a06c0e8a304b5775e594261fc4fde1b906312f00a057bfbd415a3796e36c37915e8c1c4442ee9e16adc6546063ad35dcab980adf3095088403b00a6c4c832d1
7
+ data.tar.gz: a68ce3071ce99f86a14a6f87571de073932822d2ee7b94fba7d3acf7b2f6a11618491a22385b8af00027b05aeb85bf08b45bdc35cf404e17ee51eb97ef529924
data/README.md CHANGED
@@ -5,8 +5,7 @@ a Hostgroup set.
5
5
 
6
6
  ## Installation
7
7
 
8
- See [How_to_Install_a_Plugin](http://projects.theforeman.org/projects/foreman/wiki/How_to_Install_a_Plugin)
9
- for how to install Foreman plugins
8
+ See Foreman's [plugin installation documentation](https://theforeman.org/plugins/#2.Installation).
10
9
 
11
10
  ## Compatibility
12
11
 
@@ -16,12 +15,13 @@ for how to install Foreman plugins
16
15
  | 1.3 | 1.0.1 |
17
16
  | 1.4 | 1.1.0 |
18
17
  | 1.5 | 2.0.1 |
19
- | >= 1.6 | 3.0.0 |
18
+ | 1.6 - 1.11 | 3.0.0 |
19
+ | >= 1.12 | 4.0.0 |
20
20
 
21
21
  ## Usage
22
22
 
23
23
  The configuration is done inside foreman's plugin settings directory which is
24
- `~foreman/config/settings.plugins.d/`.
24
+ `/etc/foreman/plugins/`.
25
25
 
26
26
  You can simply copy `default_hostgroup.yaml.example` and adjust it to fit
27
27
  your needs. The format is shown in the example. The simplest form would be:
@@ -33,6 +33,9 @@ your needs. The format is shown in the example. The simplest form would be:
33
33
  "Default":
34
34
  "hostname": ".*"
35
35
  ```
36
+ If you are ugrading from plugin version 2.0.1 or older the format of this
37
+ file changes and you will need modify `default_hostgroup.yaml.example` to
38
+ follow the format above.
36
39
 
37
40
  *Important Note:* You have to restart foreman in order to apply changes in
38
41
  `default_hostgroup.yaml`!
@@ -3,17 +3,17 @@ class Setting::DefaultHostgroup < ::Setting
3
3
 
4
4
  def self.load_defaults
5
5
  # Check the table exists
6
+ return unless ActiveRecord::Base.connection.table_exists?('settings')
6
7
  return unless super
7
8
 
8
- Setting.transaction do
9
- [
10
- self.set('force_hostgroup_match', 'Apply hostgroup matching even if a host already has one.', false),
11
- self.set('force_hostgroup_match_only_new', 'Apply hostgroup matching only on new hosts', true),
12
- ].compact.each { |s| self.create s.update(:category => 'Setting::DefaultHostgroup')}
13
- end
9
+ Setting.transaction do
10
+ [
11
+ set('force_hostgroup_match', 'Apply hostgroup matching even if a host already has one.', false),
12
+ set('force_hostgroup_match_only_new', 'Apply hostgroup matching only on new hosts', true),
13
+ set('force_host_environment', "Apply hostgroup's environment to host even if a host already has a different one", true)
14
+ ].compact.each { |s| create s.update(category: 'Setting::DefaultHostgroup') }
15
+ end
14
16
 
15
17
  true
16
-
17
18
  end
18
-
19
19
  end
@@ -1,21 +1,34 @@
1
+ # Tests
1
2
  namespace :test do
2
3
  desc "Test DefaultHostgroup plugin"
3
- Rake::TestTask.new(:default_hostgroup) do |t|
4
+ Rake::TestTask.new(:foreman_default_hostgroup) do |t|
4
5
  test_dir = File.join(File.dirname(__FILE__), '..', 'test')
5
6
  t.libs << ["test",test_dir]
6
7
  t.pattern = "#{test_dir}/**/*_test.rb"
7
8
  t.verbose = true
8
9
  end
9
-
10
10
  end
11
11
 
12
- Rake::Task[:test].enhance do
13
- Rake::Task['test:default_hostgroup'].invoke
12
+ namespace :foreman_default_hostgroup do
13
+ task :rubocop do
14
+ begin
15
+ require 'rubocop/rake_task'
16
+ RuboCop::RakeTask.new(:rubocop_foreman_default_hostgroup) do |task|
17
+ task.patterns = ["#{ForemanDefaultHostgroup::Engine.root}/app/**/*.rb",
18
+ "#{ForemanDefaultHostgroup::Engine.root}/lib/**/*.rb",
19
+ "#{ForemanDefaultHostgroup::Engine.root}/test/**/*.rb"]
20
+ end
21
+ rescue
22
+ puts 'Rubocop not loaded.'
23
+ end
24
+
25
+ Rake::Task['rubocop_foreman_default_hostgroup'].invoke
26
+ end
14
27
  end
15
28
 
29
+ Rake::Task[:test].enhance ['test:foreman_default_hostgroup']
30
+
16
31
  load 'tasks/jenkins.rake'
17
- if Rake::Task.task_defined?(:'jenkins:setup')
18
- Rake::Task["jenkins:unit"].enhance do
19
- Rake::Task['test:default_hostgroup'].invoke
20
- end
32
+ if Rake::Task.task_defined?(:'jenkins:unit')
33
+ Rake::Task['jenkins:unit'].enhance ['test:foreman_default_hostgroup', 'foreman_default_hostgroup:rubocop']
21
34
  end
@@ -0,0 +1,83 @@
1
+ module DefaultHostgroupBaseHostPatch
2
+ extend ActiveSupport::Concern
3
+
4
+ included do
5
+ alias_method_chain :import_facts, :match_hostgroup
6
+ end
7
+
8
+ def import_facts_with_match_hostgroup(facts)
9
+ # Load the facts anyway, hook onto the end of it
10
+ result = import_facts_without_match_hostgroup(facts)
11
+
12
+ return result unless settings_exist?
13
+
14
+ Rails.logger.debug 'DefaultHostgroupMatch: performing Hostgroup match'
15
+
16
+ return result unless host_new_or_forced?
17
+ return result unless host_has_no_hostgroup_or_forced?
18
+
19
+ facts_map = SETTINGS[:default_hostgroup][:facts_map]
20
+ new_hostgroup = find_match(facts_map)
21
+
22
+ return result unless new_hostgroup
23
+
24
+ self.hostgroup = new_hostgroup
25
+ if Setting[:force_host_environment] == true
26
+ self.environment = new_hostgroup.environment
27
+ end
28
+ save(validate: false)
29
+ Rails.logger.info "DefaultHostgroupMatch: #{hostname} added to #{new_hostgroup}"
30
+
31
+ result
32
+ end
33
+
34
+ def find_match(facts_map)
35
+ facts_map.each do |group_name, facts|
36
+ hg = Hostgroup.find_by_title(group_name)
37
+ return hg if hg.present? && group_matches?(facts)
38
+ end
39
+ Rails.logger.info 'No match ...'
40
+ false
41
+ end
42
+
43
+ def group_matches?(facts)
44
+ facts.each do |fact_name, fact_regex|
45
+ fact_regex.gsub!(%r{(\A/|/\z)}, '')
46
+ host_fact_value = facts_hash[fact_name]
47
+ Rails.logger.info "Fact = #{fact_name}"
48
+ Rails.logger.info "Regex = #{fact_regex}"
49
+ return true if Regexp.new(fact_regex).match(host_fact_value)
50
+ end
51
+ false
52
+ end
53
+
54
+ def settings_exist?
55
+ unless SETTINGS[:default_hostgroup] && SETTINGS[:default_hostgroup][:facts_map]
56
+ Rails.logger.warn 'DefaultHostgroupMatch: Could not load :default_hostgroup map from Settings.'
57
+ return false
58
+ end
59
+ true
60
+ end
61
+
62
+ def host_new_or_forced?
63
+ if Setting[:force_hostgroup_match_only_new]
64
+ # hosts have already been saved during import_host, so test the creation age instead
65
+ new_host = ((Time.current - created_at) < 300)
66
+ unless new_host && hostgroup.nil? && reports.empty?
67
+ Rails.logger.debug 'DefaultHostgroupMatch: skipping, host exists'
68
+ return false
69
+ end
70
+ end
71
+ true
72
+ end
73
+
74
+ def host_has_no_hostgroup_or_forced?
75
+ unless Setting[:force_hostgroup_match]
76
+ if hostgroup.present?
77
+ Rails.logger.debug 'DefaultHostgroupMatch: skipping, host has hostgroup'
78
+ return false
79
+ end
80
+ end
81
+ true
82
+ end
83
+ end
@@ -1,28 +1,33 @@
1
- require 'default_hostgroup_managed_host_patch'
1
+ require 'default_hostgroup_base_host_patch'
2
2
 
3
3
  module ForemanDefaultHostgroup
4
- #Inherit from the Rails module of the parent app (Foreman), not the plugin.
5
- #Thus, inherits from ::Rails::Engine and not from Rails::Engine
4
+ # Inherit from the Rails module of the parent app (Foreman), not
5
+ # the plugin. Thus, inherits from ::Rails::Engine and not from
6
+ # Rails::Engine
6
7
  class Engine < ::Rails::Engine
7
-
8
- # Load this before the Foreman config initizializers, so that the Setting.descendants
9
- # list includes the plugin STI setting class
10
- initializer 'foreman_discovery.load_default_settings', :before => :load_config_initializers do |app|
11
- require_dependency File.expand_path("../../../app/models/setting/default_hostgroup.rb", __FILE__) if (Setting.table_exists? rescue(false))
8
+ initializer 'foreman_default_hostgroup.load_default_settings',
9
+ before: :load_config_initializers do
10
+ require_dependency File.expand_path(
11
+ '../../../app/models/setting/default_hostgroup.rb', __FILE__)
12
12
  end
13
13
 
14
- initializer 'foreman_default_hostgroup.register_plugin', :after=> :finisher_hook do |app|
15
- Foreman::Plugin.register :foreman_default_hostgroup do
16
- end if (Rails.env == "development" or defined? Foreman::Plugin)
14
+ initializer 'foreman_default_hostgroup.register_plugin',
15
+ before: :finisher_hook do
16
+ Foreman::Plugin.register :foreman_plugin_template do
17
+ requires_foreman '>= 1.12'
18
+ end
17
19
  end
18
20
 
19
21
  config.to_prepare do
20
- ::Host::Managed.send :include, DefaultHostgroupManagedHostPatch
22
+ begin
23
+ ::Host::Base.send(:include, DefaultHostgroupBaseHostPatch)
24
+ rescue => e
25
+ Rails.logger.warn "ForemanDefaultHostgroup: skipping engine hook (#{e})"
26
+ end
21
27
  end
22
28
 
23
29
  rake_tasks do
24
- load "default_hostgroup.rake"
30
+ load 'default_hostgroup.rake'
25
31
  end
26
-
27
32
  end
28
33
  end
@@ -1,3 +1,3 @@
1
1
  module ForemanDefaultHostgroup
2
- VERSION = "3.0.0"
2
+ VERSION = '4.0.0'.freeze
3
3
  end
@@ -1,155 +1,219 @@
1
1
  require 'test_plugin_helper'
2
2
 
3
+ # Tests for the plugin
3
4
  class DefaultHostgroupTest < ActiveSupport::TestCase
4
5
  setup do
5
6
  disable_orchestration
6
- User.current = User.find_by_login "admin"
7
+ User.current = User.find_by_login 'admin'
8
+ setup_hostgroup_matchers
9
+ setup_host_and_facts
7
10
  end
8
11
 
9
- def parse_json_fixture(relative_path)
10
- return JSON.parse(File.read(File.expand_path(File.dirname(__FILE__) + relative_path)))
11
- end
12
-
13
- def setup_hostgroup_match
12
+ def setup_hostgroup_matchers
14
13
  # The settings.yml fixture in Core wipes out the Setting table,
15
14
  # so we use FactoryGirl to re-create it
16
15
  FactoryGirl.create(:setting,
17
- :name => 'force_hostgroup_match',
18
- :category => 'Setting::DefaultHostgroup')
16
+ name: 'force_hostgroup_match',
17
+ category: 'Setting::DefaultHostgroup')
19
18
  FactoryGirl.create(:setting,
20
- :name => 'force_hostgroup_match_only_new',
21
- :category => 'Setting::DefaultHostgroup')
19
+ name: 'force_hostgroup_match_only_new',
20
+ category: 'Setting::DefaultHostgroup')
21
+ FactoryGirl.create(:setting,
22
+ name: 'force_host_environment',
23
+ category: 'Setting::DefaultHostgroup')
24
+ # Set the defaults
22
25
  Setting[:force_hostgroup_match] = false
23
26
  Setting[:force_hostgroup_match_only_new] = true
24
- SETTINGS[:default_hostgroup] = Hash.new
27
+ Setting[:force_host_environment] = true
28
+
29
+ # Mimic plugin config fron config file
30
+ FactoryGirl.create(:hostgroup, :with_environment, name: 'Test Default')
31
+ SETTINGS[:default_hostgroup] = {}
32
+ SETTINGS[:default_hostgroup][:facts_map] = {
33
+ 'Test Default' => { 'hostname' => '.*' }
34
+ }
25
35
  end
26
36
 
27
- test "full matching regex not enclosed in /" do
28
- setup_hostgroup_match
29
- SETTINGS[:default_hostgroup][:facts_map] = { "Test Full" => {'hostname' =>'^sinn1636.lan$'} }
30
-
31
- hostgroup = Hostgroup.create(:name => "Test Full")
32
- raw = parse_json_fixture('/facts.json')
33
-
34
- assert Host.import_host_and_facts(raw['name'], raw['facts'])
35
- assert_equal hostgroup, Host.find_by_name('sinn1636.lan').hostgroup
37
+ def setup_host_and_facts
38
+ raw = JSON.parse(File.read(File.expand_path(File.dirname(__FILE__) + '/facts.json')))
39
+ @name = raw['name']
40
+ @host = Host.import_host(raw['name'], 'puppet')
41
+ @facts = raw['facts']
36
42
  end
37
43
 
38
- test "partial matching regex enclosed in /" do
39
- setup_hostgroup_match
40
- SETTINGS[:default_hostgroup][:facts_map] = { "Test Partial" => {'hostname' => '/\.lan$/' }}
41
-
42
- hostgroup = Hostgroup.create(:name => "Test Partial")
43
- raw = parse_json_fixture('/facts.json')
44
+ context 'import_facts_with_match_hostgroup' do
45
+ test 'matched host is saved with new hostgroup' do
46
+ assert @host.import_facts(@facts)
47
+ assert_equal Hostgroup.find_by_name('Test Default'), Host.find_by_name(@name).hostgroup
48
+ end
44
49
 
45
- assert Host.import_host_and_facts(raw['name'], raw['facts'])
46
- assert_equal hostgroup, Host.find_by_name('sinn1636.lan').hostgroup
47
- end
50
+ test 'matched host not updated if host already has a hostgroup' do
51
+ hostgroup = FactoryGirl.create(:hostgroup)
52
+ @host.hostgroup = hostgroup
53
+ @host.save(validate: false)
48
54
 
49
- test "invalid hostgroup name is ignored" do
50
- setup_hostgroup_match
51
- SETTINGS[:default_hostgroup][:facts_map] = { "Nonexistent Group" => {'hostname' => '.*'}, "Existent Group" => {'hostname' => '/\.lan$/'} }
55
+ assert @host.import_facts(@facts)
56
+ assert_equal hostgroup, Host.find_by_name(@name).hostgroup
57
+ end
52
58
 
53
- hostgroup = Hostgroup.create(:name => "Existent Group")
54
- raw = parse_json_fixture('/facts.json')
59
+ test 'hostgroup is not updated if host is not new' do
60
+ @host.created_at = Time.current - 1000
61
+ @host.save(validate: false)
55
62
 
56
- assert Host.import_host_and_facts(raw['name'], raw['facts'])
57
- assert_equal hostgroup, Host.find_by_name('sinn1636.lan').hostgroup
63
+ assert @host.import_facts(@facts)
64
+ refute Host.find_by_name(@name).hostgroup
65
+ end
58
66
  end
59
67
 
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
68
+ context 'force host environment setting' do
69
+ test 'environment is updated if enabled' do
70
+ h = FactoryGirl.create(:host, :with_environment, created_at: Time.current)
71
+ h.import_facts(@facts)
72
+ assert_equal Hostgroup.find_by_name('Test Default').environment, h.environment
73
+ end
74
+
75
+ test 'environment not updated if disabled' do
76
+ Setting[:force_host_environment] = false
77
+ h = FactoryGirl.create(:host, :with_environment, created_at: Time.current)
78
+ h.import_facts(@facts)
79
+ refute_equal Hostgroup.find_by_name('Test Default').environment, h.environment
80
+ end
69
81
  end
70
82
 
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
83
+ context 'find_match' do
84
+ # takes a config map, returns a group or false
85
+ test 'match a single hostgroup' do
86
+ facts_map = SETTINGS[:default_hostgroup][:facts_map]
87
+ assert @host.import_facts_without_match_hostgroup(@facts)
88
+ assert_equal Hostgroup.find_by_name('Test Default'), @host.find_match(facts_map)
89
+ end
90
+
91
+ test 'returns false for no match' do
92
+ facts_map = SETTINGS[:default_hostgroup][:facts_map] = {
93
+ 'Test Default' => { 'hostname' => 'nosuchhost' }
94
+ }
95
+ assert @host.import_facts_without_match_hostgroup(@facts)
96
+ refute @host.find_match(facts_map)
97
+ end
98
+
99
+ test 'matches first available hostgroup' do
100
+ facts_map = SETTINGS[:default_hostgroup][:facts_map] = {
101
+ 'Test Default' => { 'hostname' => '.*' },
102
+ 'Some Other Group' => { 'hostname' => '/\.lan$/' }
103
+ }
104
+ assert @host.import_facts_without_match_hostgroup(@facts)
105
+ assert_equal Hostgroup.find_by_name('Test Default'), @host.find_match(facts_map)
106
+ end
107
+
108
+ test 'nonexistant groups are ignored' do
109
+ facts_map = SETTINGS[:default_hostgroup][:facts_map] = {
110
+ 'Some Other Group' => { 'hostname' => '.*' },
111
+ 'Test Default' => { 'hostname' => '/\.lan$/' }
112
+ }
113
+ assert @host.import_facts_without_match_hostgroup(@facts)
114
+ assert_equal Hostgroup.find_by_name('Test Default'), @host.find_match(facts_map)
115
+ end
80
116
  end
81
117
 
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
118
+ context 'group_matches?' do
119
+ # passing a hash of (group_name, regex) pairs
120
+ test 'full regex matches' do
121
+ regex = { 'hostname' => '^sinn1636.lan$' }
122
+ assert @host.import_facts_without_match_hostgroup(@facts)
123
+ assert @host.group_matches?(regex)
124
+ end
125
+
126
+ test 'partial regex matches' do
127
+ regex = { 'hostname' => '.lan$' }
128
+ assert @host.import_facts_without_match_hostgroup(@facts)
129
+ assert @host.group_matches?(regex)
130
+ end
131
+
132
+ test 'regex slashes are stripped' do
133
+ regex = { 'hostname' => '/\.lan$/' }
134
+ assert @host.import_facts_without_match_hostgroup(@facts)
135
+ assert @host.group_matches?(regex)
136
+ end
137
+
138
+ test 'invalid keys are ignored' do
139
+ regex = { 'nosuchfact' => '.*' }
140
+ assert @host.import_facts_without_match_hostgroup(@facts)
141
+ refute @host.group_matches?(regex)
142
+ end
143
+
144
+ test 'unmatched values are ignored' do
145
+ regex = { 'hostname' => 'nosuchname' }
146
+ assert @host.import_facts_without_match_hostgroup(@facts)
147
+ refute @host.group_matches?(regex)
148
+ end
149
+
150
+ test 'multiple entries with invalid keys / values match' do
151
+ regex = {
152
+ 'nosuchfact' => '.*',
153
+ 'osfamily' => 'nosuchos',
154
+ 'hostname' => '.lan$'
155
+ }
156
+ assert @host.import_facts_without_match_hostgroup(@facts)
157
+ assert @host.group_matches?(regex)
158
+ end
91
159
  end
92
160
 
93
- test "default hostgroup" do
94
- setup_hostgroup_match
95
- SETTINGS[:default_hostgroup][:facts_map] = { "Test Default" => {'hostname' =>'.*'} }
96
-
97
- hostgroup = Hostgroup.create(:name => "Test Default")
98
- raw = parse_json_fixture('/facts.json')
99
-
100
- assert Host.import_host_and_facts(raw['name'], raw['facts'])
101
- assert_equal hostgroup, Host.find_by_name('sinn1636.lan').hostgroup
161
+ context 'settings_exist?' do
162
+ test 'true when Settings exist' do
163
+ h = FactoryGirl.create(:host)
164
+ assert h.settings_exist?
165
+ end
166
+
167
+ test 'false when Settings are missing' do
168
+ SETTINGS[:default_hostgroup] = {}
169
+ h = FactoryGirl.create(:host)
170
+ refute h.settings_exist?
171
+ end
102
172
  end
103
173
 
104
- test "host already has a hostgroup" do
105
- setup_hostgroup_match
106
- SETTINGS[:default_hostgroup][:facts_map] = { "Test Default" => {'hostname' => '.*'} }
107
-
108
- hostgroup = Hostgroup.create(:name => "Test Group")
109
- Hostgroup.create(:name => "Test Default")
110
- raw = parse_json_fixture('/facts.json')
111
-
112
- host, result = Host.import_host_and_facts_without_match_hostgroup(raw['name'], raw['facts'])
113
- host.hostgroup = hostgroup
114
- host.save(:validate => false)
115
-
116
- assert Host.import_host_and_facts(raw['name'], raw['facts'])
117
- assert_equal hostgroup, Host.find_by_name('sinn1636.lan').hostgroup
174
+ context 'host_new_or_forced?' do
175
+ test 'true when host is new' do
176
+ h = FactoryGirl.create(:host, created_at: Time.current)
177
+ assert h.host_new_or_forced?
178
+ end
179
+
180
+ test 'false when host has existed for > 300s' do
181
+ h = FactoryGirl.create(:host, created_at: Time.current - 1000)
182
+ refute h.host_new_or_forced?
183
+ end
184
+
185
+ test 'false when host has a hostgroup' do
186
+ h = FactoryGirl.create(:host, :with_hostgroup, created_at: Time.current)
187
+ refute h.host_new_or_forced?
188
+ end
189
+
190
+ test 'false when host has reports' do
191
+ h = FactoryGirl.create(:host, :with_reports, created_at: Time.current)
192
+ refute h.host_new_or_forced?
193
+ end
194
+
195
+ test 'true when setting is forced' do
196
+ Setting[:force_hostgroup_match_only_new] = false
197
+ h = FactoryGirl.create(:host, :with_hostgroup, created_at: Time.current)
198
+ assert h.host_new_or_forced?
199
+ end
118
200
  end
119
201
 
120
- test "force hostgroup match on host with existing hostgroup" do
121
- setup_hostgroup_match
122
- Setting[:force_hostgroup_match] = true
123
- Setting[:force_hostgroup_match_only_new] = false
124
- SETTINGS[:default_hostgroup][:facts_map] = { "Test Default" => {'hostname' => '.*'} }
125
-
126
- hostgroup = Hostgroup.create(:name => "Test Group")
127
- default = Hostgroup.create(:name => "Test Default")
128
- raw = parse_json_fixture('/facts.json')
129
-
130
- host, result = Host.import_host_and_facts_without_match_hostgroup(raw['name'], raw['facts'])
131
- host.hostgroup = hostgroup
132
- host.save(:validate => false)
133
-
134
- assert Host.import_host_and_facts(raw['name'], raw['facts'])
135
- assert_equal default, Host.find_by_name('sinn1636.lan').hostgroup
202
+ context 'host_has_no_hostgroup_or_forced?' do
203
+ test 'true if host has no hostgroup' do
204
+ h = FactoryGirl.create(:host)
205
+ assert h.host_has_no_hostgroup_or_forced?
206
+ end
207
+
208
+ test 'false if host has hostgroup' do
209
+ h = FactoryGirl.create(:host, :with_hostgroup)
210
+ refute h.host_has_no_hostgroup_or_forced?
211
+ end
212
+
213
+ test 'true if host has hostgroup and setting forced' do
214
+ Setting[:force_hostgroup_match] = true
215
+ h = FactoryGirl.create(:host, :with_hostgroup)
216
+ assert h.host_has_no_hostgroup_or_forced?
217
+ end
136
218
  end
137
-
138
- test "hostgroup is not updated if host is not new" do
139
- setup_hostgroup_match
140
- Setting[:force_hostgroup_match] = true
141
- SETTINGS[:default_hostgroup][:facts_map] = { "Test Default" => {'hostname' => '.*'} }
142
-
143
- hostgroup = Hostgroup.create(:name => "Test Group")
144
- Hostgroup.create(:name => "Test Default")
145
- raw = parse_json_fixture('/facts.json')
146
-
147
- host, result = Host.import_host_and_facts_without_match_hostgroup(raw['name'], raw['facts'])
148
- host.hostgroup = hostgroup
149
- host.save(:validate => false)
150
-
151
- assert Host.import_host_and_facts(raw['name'], raw['facts'])
152
- assert_equal hostgroup, Host.find_by_name('sinn1636.lan').hostgroup
153
- end
154
-
155
219
  end
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: 3.0.0
4
+ version: 4.0.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-12-15 00:00:00.000000000 Z
11
+ date: 2016-07-06 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
@@ -24,7 +24,7 @@ files:
24
24
  - app/models/setting/default_hostgroup.rb
25
25
  - default_hostgroup.yaml.example
26
26
  - lib/default_hostgroup.rake
27
- - lib/default_hostgroup_managed_host_patch.rb
27
+ - lib/default_hostgroup_base_host_patch.rb
28
28
  - lib/foreman_default_hostgroup.rb
29
29
  - lib/foreman_default_hostgroup/engine.rb
30
30
  - lib/foreman_default_hostgroup/version.rb
@@ -51,7 +51,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
51
51
  version: '0'
52
52
  requirements: []
53
53
  rubyforge_project:
54
- rubygems_version: 2.2.2
54
+ rubygems_version: 2.2.5
55
55
  signing_key:
56
56
  specification_version: 4
57
57
  summary: Default Hostgroup Plugin for Foreman
@@ -1,74 +0,0 @@
1
- module DefaultHostgroupManagedHostPatch
2
- def self.included(base)
3
- base.extend ClassMethods
4
- base.class_eval do
5
- class << self
6
- alias_method_chain :import_host_and_facts, :match_hostgroup
7
- end
8
- end
9
- end
10
-
11
- module ClassMethods
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)
14
-
15
- unless SETTINGS[:default_hostgroup] && SETTINGS[:default_hostgroup][:facts_map]
16
- Rails.logger.warn "DefaultHostgroupMatch: Could not load default_hostgroup map from settings, check config."
17
- return @host, result
18
- end
19
-
20
- Rails.logger.debug "DefaultHostgroupMatch: performing Hostgroup match"
21
-
22
- if Setting[:force_hostgroup_match_only_new]
23
- # host.new_record? will only test for the early return in the core method, a real host
24
- # will have already been saved at least once.
25
- unless @host.present? && !@host.new_record? && @host.hostgroup.nil? && @host.reports.empty?
26
-
27
- Rails.logger.debug "DefaultHostgroupMatch: skipping, host exists"
28
- return @host, result
29
- end
30
- end
31
-
32
- unless Setting[:force_hostgroup_match]
33
- if @host.hostgroup.present?
34
- Rails.logger.debug "DefaultHostgroupMatch: skipping, host has hostgroup"
35
- return @host, result
36
- end
37
- end
38
-
39
- facts_map = SETTINGS[:default_hostgroup][:facts_map]
40
- new_hostgroup = find_match(facts_map)
41
-
42
- return @host, result unless new_hostgroup
43
-
44
- @host.hostgroup = new_hostgroup
45
- @host.save(:validate => false)
46
- Rails.logger.info "DefaultHostgroupMatch: #{hostname} added to #{new_hostgroup}"
47
-
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
68
- end
69
-
70
- def valid_hostgroup?(hostgroup)
71
- Hostgroup.find_by_title(hostgroup) ? true : false
72
- end
73
- end
74
- end