facter 4.0.26 → 4.0.28

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.
Files changed (206) hide show
  1. checksums.yaml +4 -4
  2. data/.github/actions/presuite.rb +1 -12
  3. data/.github/workflows/acceptance_tests.yml +4 -4
  4. data/.github/workflows/checks.yaml +9 -3
  5. data/.github/workflows/coverage.yaml +1 -1
  6. data/.github/workflows/unit_tests.yaml +2 -2
  7. data/.rubocop.yml +5 -0
  8. data/.rubocop_todo.yml +6 -4
  9. data/CHANGELOG.md +22 -0
  10. data/Rakefile +2 -1
  11. data/VERSION +1 -1
  12. data/acceptance/.beaker.yml +15 -0
  13. data/acceptance/.gitignore +12 -0
  14. data/acceptance/Gemfile +24 -0
  15. data/acceptance/Rakefile +2 -0
  16. data/acceptance/bin/ci-bootstrap-from-artifacts.sh +55 -0
  17. data/acceptance/config/aio/options.rb +6 -0
  18. data/acceptance/config/git/options.rb +3 -0
  19. data/acceptance/config/nodes/aix-53-power.yaml +7 -0
  20. data/acceptance/config/nodes/aix-61-power.yaml +7 -0
  21. data/acceptance/config/nodes/aix-71-power.yaml +7 -0
  22. data/acceptance/config/nodes/huaweios-6-powerpc.yaml +7 -0
  23. data/acceptance/config/nodes/solaris-10-sparc.yaml +9 -0
  24. data/acceptance/config/nodes/solaris-11-sparc.yaml +9 -0
  25. data/acceptance/lib/facter/acceptance/base_fact_utils.rb +565 -0
  26. data/acceptance/lib/facter/acceptance/user_fact_utils.rb +132 -0
  27. data/acceptance/lib/helper.rb +3 -0
  28. data/acceptance/lib/puppet/acceptance/common_utils.rb +10 -0
  29. data/acceptance/lib/puppet/acceptance/git_utils.rb +19 -0
  30. data/acceptance/lib/puppet/acceptance/install_utils.rb +58 -0
  31. data/acceptance/setup/aio/pre-suite/001_run_with_facter_ng.rb +75 -0
  32. data/acceptance/tests/custom_facts/cached_custom_fact.rb +82 -0
  33. data/acceptance/tests/custom_facts/conflicts_with_builtin_fact.rb +106 -0
  34. data/acceptance/tests/custom_facts/custom_fact_with_10001_weight_overrides_external_fact.rb +30 -0
  35. data/acceptance/tests/custom_facts/expand_command.rb +30 -0
  36. data/acceptance/tests/custom_facts/having_multiple_facts_in_one_file.rb +40 -0
  37. data/acceptance/tests/custom_facts/not_expand_command.rb +30 -0
  38. data/acceptance/tests/custom_facts/using_win32ole_should_not_hang.rb +33 -0
  39. data/acceptance/tests/custom_facts/weighted_cached_custom_facts.rb +94 -0
  40. data/acceptance/tests/custom_facts/windows_not_expand_command.rb +30 -0
  41. data/acceptance/tests/external_facts/env_var_overrides_external_fact.rb +46 -0
  42. data/acceptance/tests/external_facts/external_dir_overrides_default_external_fact.rb +34 -0
  43. data/acceptance/tests/external_facts/external_fact_overrides_custom_fact.rb +29 -0
  44. data/acceptance/tests/external_facts/external_fact_overrides_custom_fact_with_10000_weight_or_less.rb +30 -0
  45. data/acceptance/tests/external_facts/external_fact_overrides_custom_fact_with_confine.rb +35 -0
  46. data/acceptance/tests/external_facts/external_fact_stderr_messages_output_to_stderr.rb +49 -0
  47. data/acceptance/tests/external_facts/external_facts_only_run_once.rb +43 -0
  48. data/acceptance/tests/external_facts/fact_directory_precedence.rb +109 -0
  49. data/acceptance/tests/external_facts/handle_same_filename_in_different_dirs.rb +59 -0
  50. data/acceptance/tests/external_facts/non_root_users_default_external_fact_directory.rb +142 -0
  51. data/acceptance/tests/external_facts/root_uses_default_external_fact_dir.rb +34 -0
  52. data/acceptance/tests/external_facts/structured_executable_facts.rb +139 -0
  53. data/acceptance/tests/facter_returns_success_on_non_existent_fact.rb +9 -0
  54. data/acceptance/tests/facts/dmi.rb +51 -0
  55. data/acceptance/tests/facts/facterversion.rb +11 -0
  56. data/acceptance/tests/facts/identity.rb +52 -0
  57. data/acceptance/tests/facts/mountpoints_fact.rb +12 -0
  58. data/acceptance/tests/facts/networking_facts.rb +93 -0
  59. data/acceptance/tests/facts/nim_type.rb +12 -0
  60. data/acceptance/tests/facts/non_root_users_without_errors.rb +32 -0
  61. data/acceptance/tests/facts/operatingsystem_detection_after_clear_on_ubuntu.rb +26 -0
  62. data/acceptance/tests/facts/os_processors_and_kernel.rb +20 -0
  63. data/acceptance/tests/facts/osx_numeric_hostname.rb +23 -0
  64. data/acceptance/tests/facts/partitions.rb +37 -0
  65. data/acceptance/tests/facts/productname.rb +15 -0
  66. data/acceptance/tests/facts/ruby.rb +59 -0
  67. data/acceptance/tests/facts/ssh_key.rb +59 -0
  68. data/acceptance/tests/facts/validate_file_system_size_bytes.rb +37 -0
  69. data/acceptance/tests/facts/verify_tmpfs_file_system.rb +54 -0
  70. data/acceptance/tests/facts/windows_os.rb +64 -0
  71. data/acceptance/tests/load_libfacter.rb +66 -0
  72. data/acceptance/tests/no_errors_on_stderr.rb +10 -0
  73. data/acceptance/tests/options/color.rb +16 -0
  74. data/acceptance/tests/options/config.rb +27 -0
  75. data/acceptance/tests/options/config_file/blocklist.rb +35 -0
  76. data/acceptance/tests/options/config_file/blocklist_from_puppet_facts.rb +40 -0
  77. data/acceptance/tests/options/config_file/custom_dir_overridden_by_cli_custom_dir.rb +56 -0
  78. data/acceptance/tests/options/config_file/custom_facts.rb +42 -0
  79. data/acceptance/tests/options/config_file/custom_facts_list.rb +56 -0
  80. data/acceptance/tests/options/config_file/debug.rb +34 -0
  81. data/acceptance/tests/options/config_file/debug_override_config_file.rb +34 -0
  82. data/acceptance/tests/options/config_file/default_file_location.rb +37 -0
  83. data/acceptance/tests/options/config_file/external_dir_conflicts_with_cli_no_external_facts.rb +37 -0
  84. data/acceptance/tests/options/config_file/external_dir_overridden_by_cli_external_dir.rb +40 -0
  85. data/acceptance/tests/options/config_file/external_facts.rb +37 -0
  86. data/acceptance/tests/options/config_file/external_facts_list.rb +43 -0
  87. data/acceptance/tests/options/config_file/load_from_ruby.rb +73 -0
  88. data/acceptance/tests/options/config_file/log_level.rb +35 -0
  89. data/acceptance/tests/options/config_file/no_custom_facts_and_custom_dir.rb +43 -0
  90. data/acceptance/tests/options/config_file/no_custom_facts_and_facterlib.rb +43 -0
  91. data/acceptance/tests/options/config_file/no_custom_facts_and_load_path.rb +49 -0
  92. data/acceptance/tests/options/config_file/no_external_facts.rb +38 -0
  93. data/acceptance/tests/options/config_file/no_external_facts_and_external_dir.rb +34 -0
  94. data/acceptance/tests/options/config_file/no_ruby_disables_custom_facts.rb +52 -0
  95. data/acceptance/tests/options/config_file/no_ruby_disables_ruby_facts.rb +34 -0
  96. data/acceptance/tests/options/config_file/trace.rb +48 -0
  97. data/acceptance/tests/options/config_file/ttls_cached_external_execution_resolver_with_json_output.rb +92 -0
  98. data/acceptance/tests/options/config_file/ttls_cached_external_execution_resolver_with_text_output.rb +74 -0
  99. data/acceptance/tests/options/config_file/ttls_cached_external_execution_resolver_with_yaml_output.rb +88 -0
  100. data/acceptance/tests/options/config_file/ttls_cached_external_json_resolver.rb +79 -0
  101. data/acceptance/tests/options/config_file/ttls_cached_external_text_resolver.rb +78 -0
  102. data/acceptance/tests/options/config_file/ttls_cached_external_yaml_resolver.rb +78 -0
  103. data/acceptance/tests/options/config_file/ttls_cached_facts_clear_by_empty_ttls_cache_list.rb +71 -0
  104. data/acceptance/tests/options/config_file/ttls_cached_facts_creates_json_cache_file.rb +48 -0
  105. data/acceptance/tests/options/config_file/ttls_cached_facts_expire_facts_do_not_read_the_old_cached_value.rb +58 -0
  106. data/acceptance/tests/options/config_file/ttls_cached_facts_expire_facts_refresh_the_cached_value.rb +61 -0
  107. data/acceptance/tests/options/config_file/ttls_cached_facts_read_from_the_cached_value.rb +57 -0
  108. data/acceptance/tests/options/config_file/ttls_cached_facts_that_are_corrupt_are_refreshed.rb +53 -0
  109. data/acceptance/tests/options/config_file/ttls_cached_facts_that_are_empty_return_an_empty_value.rb +53 -0
  110. data/acceptance/tests/options/config_file/ttls_puppet_facts_creates_json_for_cached_facts.rb +45 -0
  111. data/acceptance/tests/options/config_file/ttls_puppet_facts_honors_cached_facts.rb +54 -0
  112. data/acceptance/tests/options/config_file/verbose.rb +34 -0
  113. data/acceptance/tests/options/custom_facts.rb +34 -0
  114. data/acceptance/tests/options/custom_facts_facterlib.rb +33 -0
  115. data/acceptance/tests/options/custom_facts_list.rb +48 -0
  116. data/acceptance/tests/options/custom_facts_load_path.rb +42 -0
  117. data/acceptance/tests/options/debug.rb +12 -0
  118. data/acceptance/tests/options/external_facts.rb +28 -0
  119. data/acceptance/tests/options/external_facts_list.rb +35 -0
  120. data/acceptance/tests/options/help.rb +13 -0
  121. data/acceptance/tests/options/json.rb +43 -0
  122. data/acceptance/tests/options/list_block_groups.rb +15 -0
  123. data/acceptance/tests/options/list_block_groups_facter_4.rb +15 -0
  124. data/acceptance/tests/options/list_cache_groups.rb +65 -0
  125. data/acceptance/tests/options/log_level.rb +13 -0
  126. data/acceptance/tests/options/no_block.rb +34 -0
  127. data/acceptance/tests/options/no_cache_should_not_cache_facts.rb +43 -0
  128. data/acceptance/tests/options/no_cache_should_not_load_cached_facts.rb +58 -0
  129. data/acceptance/tests/options/no_cache_should_not_refresh_cached_facts.rb +63 -0
  130. data/acceptance/tests/options/no_color.rb +16 -0
  131. data/acceptance/tests/options/no_custom_facts.rb +34 -0
  132. data/acceptance/tests/options/no_custom_facts_and_custom_dir.rb +19 -0
  133. data/acceptance/tests/options/no_custom_facts_and_facterlib.rb +34 -0
  134. data/acceptance/tests/options/no_custom_facts_and_load_path.rb +43 -0
  135. data/acceptance/tests/options/no_external_facts.rb +28 -0
  136. data/acceptance/tests/options/no_external_facts_and_external_dir.rb +19 -0
  137. data/acceptance/tests/options/no_ruby.rb +44 -0
  138. data/acceptance/tests/options/puppet_facts.rb +37 -0
  139. data/acceptance/tests/options/show_legacy.rb +18 -0
  140. data/acceptance/tests/options/strict.rb +11 -0
  141. data/acceptance/tests/options/trace.rb +36 -0
  142. data/acceptance/tests/options/verbose.rb +12 -0
  143. data/acceptance/tests/options/version.rb +12 -0
  144. data/acceptance/tests/options/yaml.rb +43 -0
  145. data/acceptance/tests/ticket_1123_facter_with_invalid_locale.rb +23 -0
  146. data/acceptance/tests/ticket_1238_hostname_fqdn.rb +57 -0
  147. data/lib/custom_facts/core/execution/base.rb +18 -18
  148. data/lib/custom_facts/util/collection.rb +2 -7
  149. data/lib/custom_facts/util/config.rb +1 -1
  150. data/lib/custom_facts/util/directory_loader.rb +51 -24
  151. data/lib/custom_facts/util/fact.rb +10 -1
  152. data/lib/custom_facts/util/resolution.rb +1 -1
  153. data/lib/facts/aix/aio_agent_version.rb +14 -0
  154. data/lib/facts/bsd/processors/count.rb +17 -0
  155. data/lib/facts/bsd/processors/models.rb +23 -0
  156. data/lib/facts/bsd/processors/speed.rb +17 -0
  157. data/lib/facts/freebsd/disks.rb +15 -0
  158. data/lib/facts/freebsd/partitions.rb +15 -0
  159. data/lib/facts/freebsd/processors/count.rb +17 -0
  160. data/lib/facts/freebsd/processors/models.rb +23 -0
  161. data/lib/facts/freebsd/processors/speed.rb +17 -0
  162. data/lib/facts/linux/aio_agent_version.rb +14 -0
  163. data/lib/facts/linux/ec2_metadata.rb +47 -0
  164. data/lib/facts/linux/ec2_userdata.rb +47 -0
  165. data/lib/facts/linux/is_virtual.rb +2 -5
  166. data/lib/facts/linux/virtual.rb +1 -5
  167. data/lib/facts/macosx/aio_agent_version.rb +14 -0
  168. data/lib/facts/macosx/interfaces.rb +2 -2
  169. data/lib/facts/macosx/networking/dhcp.rb +17 -0
  170. data/lib/facts/macosx/networking/interfaces.rb +21 -0
  171. data/lib/facts/macosx/networking/ip.rb +4 -1
  172. data/lib/facts/macosx/networking/ip6.rb +21 -0
  173. data/lib/facts/macosx/networking/mac.rb +4 -1
  174. data/lib/facts/macosx/networking/mtu.rb +20 -0
  175. data/lib/facts/macosx/networking/netmask.rb +21 -0
  176. data/lib/facts/macosx/networking/netmask6.rb +21 -0
  177. data/lib/facts/macosx/networking/network.rb +21 -0
  178. data/lib/facts/macosx/networking/network6.rb +21 -0
  179. data/lib/facts/macosx/networking/primary.rb +17 -0
  180. data/lib/facts/macosx/networking/scope6.rb +20 -0
  181. data/lib/facts/solaris/aio_agent_version.rb +14 -0
  182. data/lib/facts/windows/aio_agent_version.rb +14 -0
  183. data/lib/facts/windows/ec2_metadata.rb +23 -0
  184. data/lib/facts/windows/ec2_userdata.rb +23 -0
  185. data/lib/facts_utils/hypervisors.rb +10 -0
  186. data/lib/framework/core/cache_manager.rb +42 -18
  187. data/lib/framework/core/fact/external/external_fact_manager.rb +3 -2
  188. data/lib/framework/core/fact_loaders/external_fact_loader.rb +3 -2
  189. data/lib/framework/formatters/legacy_fact_formatter.rb +6 -5
  190. data/lib/framework/parsers/query_parser.rb +14 -2
  191. data/lib/models/loaded_fact.rb +3 -1
  192. data/lib/models/resolved_fact.rb +1 -1
  193. data/lib/models/searched_fact.rb +1 -0
  194. data/lib/resolvers/{agent_resolver.rb → aio_agent_version.rb} +4 -3
  195. data/lib/resolvers/bsd/ffi/ffi_helper.rb +31 -0
  196. data/lib/resolvers/bsd/processors.rb +47 -0
  197. data/lib/resolvers/ec2.rb +77 -0
  198. data/lib/resolvers/freebsd/ffi/ffi_helper.rb +42 -0
  199. data/lib/resolvers/freebsd/geom_resolver.rb +109 -0
  200. data/lib/resolvers/freebsd/processors.rb +44 -0
  201. data/lib/resolvers/macosx/networking.rb +110 -0
  202. data/lib/resolvers/networking_linux_resolver.rb +8 -30
  203. data/lib/resolvers/utils/networking.rb +70 -0
  204. data/lib/resolvers/windows/aio_agent_version.rb +56 -0
  205. metadata +175 -5
  206. data/lib/resolvers/macosx/ipaddress_resolver.rb +0 -52
@@ -0,0 +1,42 @@
1
+ # This test verifies that facter can load facts from a single custom-dir specified
2
+ # in the configuration file
3
+ test_name "C98143: config custom-dir allows single custom fact directory" do
4
+ tag 'risk:low'
5
+
6
+ require 'facter/acceptance/user_fact_utils'
7
+ extend Facter::Acceptance::UserFactUtils
8
+
9
+ content = <<EOM
10
+ Facter.add('config_fact') do
11
+ setcode do
12
+ "config_value"
13
+ end
14
+ end
15
+ EOM
16
+
17
+ agents.each do |agent|
18
+ step "Agent #{agent}: create custom fact directory and a custom fact and config file" do
19
+ custom_dir = agent.tmpdir('custom_dir')
20
+ custom_fact = File.join(custom_dir, 'custom_fact.rb')
21
+ create_remote_file(agent, custom_fact, content)
22
+ config_dir = agent.tmpdir("config_dir")
23
+ config_file = File.join(config_dir, "facter.conf")
24
+ config_content = <<EOM
25
+ global : {
26
+ custom-dir : "#{custom_dir}",
27
+ }
28
+ EOM
29
+ create_remote_file(agent, config_file, config_content)
30
+
31
+ teardown do
32
+ on(agent, "rm -rf '#{custom_dir}' '#{config_dir}'")
33
+ end
34
+
35
+ step "Agent #{agent}: resolve a fact from the configured custom-dir path" do
36
+ on(agent, facter("--config '#{config_file}' config_fact")) do |facter_output|
37
+ assert_equal("config_value", facter_output.stdout.chomp, "Incorrect custom fact value")
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,56 @@
1
+ # This test verifies that facter can load facts from multiple custom-dir's specified
2
+ # in the configuration file
3
+ test_name "C99996: config custom-dir allows multiple custom fact directories" do
4
+ tag 'risk:medium'
5
+
6
+ require 'facter/acceptance/user_fact_utils'
7
+ extend Facter::Acceptance::UserFactUtils
8
+
9
+ content_1 = <<EOM
10
+ Facter.add('config_fact_1') do
11
+ setcode do
12
+ "config_value_1"
13
+ end
14
+ end
15
+ EOM
16
+
17
+ content_2 = <<EOM
18
+ Facter.add('config_fact_2') do
19
+ setcode do
20
+ "config_value_2"
21
+ end
22
+ end
23
+ EOM
24
+
25
+ agents.each do |agent|
26
+ step "Agent #{agent}: create custom fact directories and a custom fact in each and a config file" do
27
+ custom_dir_1 = agent.tmpdir('custom_dir_1')
28
+ custom_dir_2 = agent.tmpdir('custom_dir_2')
29
+ custom_fact_1 = File.join(custom_dir_1, 'custom_fact.rb')
30
+ custom_fact_2 = File.join(custom_dir_2, 'custom_fact.rb')
31
+ create_remote_file(agent, custom_fact_1, content_1)
32
+ create_remote_file(agent, custom_fact_2, content_2)
33
+
34
+ config_dir = agent.tmpdir("config_dir")
35
+ config_file = File.join(config_dir, "facter.conf")
36
+ config_content = <<EOM
37
+ global : {
38
+ custom-dir : [ "#{custom_dir_1}", "#{custom_dir_2}" ],
39
+ }
40
+ EOM
41
+ create_remote_file(agent, config_file, config_content)
42
+
43
+ teardown do
44
+ on(agent, "rm -rf '#{custom_dir_1}' '#{custom_dir_2}' '#{config_dir}'")
45
+ end
46
+
47
+ step "Agent #{agent}: resolve a fact from each configured custom-dir path" do
48
+ on(agent, facter("--config '#{config_file}' --json")) do |facter_output|
49
+ results = JSON.parse(facter_output.stdout)
50
+ assert_equal("config_value_1", results['config_fact_1'], "Incorrect custom fact value for config_fact_1")
51
+ assert_equal("config_value_2", results['config_fact_2'], "Incorrect custom fact value for config_fact_2")
52
+ end
53
+ end
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,34 @@
1
+ # This test is intended to demonstrate that setting the cli.debug field to true
2
+ # causes DEBUG information to be printed to stderr.
3
+ test_name "C99965: setting the debug config field to true prints debug info to stderr" do
4
+ tag 'risk:high'
5
+
6
+ require 'facter/acceptance/user_fact_utils'
7
+ extend Facter::Acceptance::UserFactUtils
8
+
9
+ config = <<EOM
10
+ cli : {
11
+ debug : true
12
+ }
13
+ EOM
14
+
15
+ agents.each do |agent|
16
+ step "Agent #{agent}: create config file" do
17
+ config_dir = get_default_fact_dir(agent['platform'], on(agent, facter('kernelmajversion')).stdout.chomp.to_f)
18
+ config_file = File.join(config_dir, "facter.conf")
19
+ on(agent, "mkdir -p '#{config_dir}'")
20
+ create_remote_file(agent, config_file, config)
21
+
22
+ teardown do
23
+ on(agent, "rm -rf '#{config_dir}'", :acceptable_exit_codes => [0,1])
24
+ end
25
+
26
+ step "debug output should print when config file is loaded" do
27
+ on(agent, facter("")) do |facter_output|
28
+ assert_match(/DEBUG/, facter_output.stderr, "Expected DEBUG information in stderr")
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
34
+
@@ -0,0 +1,34 @@
1
+ # This test verified that having debug set to false in the config file can be
2
+ # overridden by the command line option --debug
3
+ test_name "C100044: flags set on the command line override config file settings" do
4
+ tag 'risk:medium'
5
+
6
+ require 'facter/acceptance/user_fact_utils'
7
+ extend Facter::Acceptance::UserFactUtils
8
+
9
+ config = <<EOM
10
+ cli : {
11
+ debug : false
12
+ }
13
+ EOM
14
+
15
+ agents.each do |agent|
16
+ config_dir = get_default_fact_dir(agent['platform'], on(agent, facter('kernelmajversion')).stdout.chomp.to_f)
17
+ config_file = File.join(config_dir, "facter.conf")
18
+
19
+ teardown do
20
+ on(agent, "rm -rf '#{config_dir}'", :acceptable_exit_codes => [0, 1])
21
+ end
22
+
23
+ step "Agent #{agent}: create config file in default location" do
24
+ on(agent, "mkdir -p '#{config_dir}'")
25
+ create_remote_file(agent, config_file, config)
26
+ end
27
+
28
+ step "--debug flag should override debug=false in config file" do
29
+ on(agent, facter("--debug")) do |facter_output|
30
+ assert_match(/DEBUG/, facter_output.stderr, "Expected DEBUG information in stderr")
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,37 @@
1
+ # This test is intended to demonstrate that Facter will load a config file
2
+ # saved at the default location without any special command line flags.
3
+ # On Unix, this location is /etc/puppetlabs/facter/facter.conf.
4
+ # On Windows, it is C:\ProgramData\PuppetLabs\facter\etc\facter.conf
5
+ test_name "C99991: config file is loaded from default location" do
6
+ tag 'risk:high'
7
+
8
+ config = <<EOM
9
+ cli : {
10
+ debug : true
11
+ }
12
+ EOM
13
+
14
+ agents.each do |agent|
15
+ step "Agent #{agent}: create config file" do
16
+ if agent['platform'] =~ /windows/
17
+ config_dir = 'C:\\ProgramData\\PuppetLabs\\facter\\etc'
18
+ else
19
+ config_dir = "/etc/puppetlabs/facter"
20
+ end
21
+
22
+ on(agent, "mkdir -p '#{config_dir}'")
23
+ config_file = File.join(config_dir, "facter.conf")
24
+ create_remote_file(agent, config_file, config)
25
+
26
+ teardown do
27
+ on(agent, "rm -rf '#{config_dir}'", :acceptable_exit_codes => [0,1])
28
+ end
29
+
30
+ step "config file should be loaded automatically and turn DEBUG output on" do
31
+ on(agent, facter("")) do |facter_output|
32
+ assert_match(/DEBUG/, facter_output.stderr, "Expected DEBUG information in stderr")
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,37 @@
1
+ # This test verifies that a configured external-dir conflicts with the command
2
+ # line option --no-external-facts
3
+ test_name "configured external-dir conflicts with command line --no-external-facts" do
4
+ tag 'risk:low'
5
+
6
+ require 'facter/acceptance/user_fact_utils'
7
+ extend Facter::Acceptance::UserFactUtils
8
+
9
+ config = <<EOM
10
+ global : {
11
+ external-dir : "config/file/dir"
12
+ }
13
+ cli : {
14
+ debug : false
15
+ }
16
+ EOM
17
+
18
+ agents.each do |agent|
19
+ config_dir = get_default_fact_dir(agent['platform'], on(agent, facter('kernelmajversion')).stdout.chomp.to_f)
20
+ config_file = File.join(config_dir, "facter.conf")
21
+
22
+ teardown do
23
+ on(agent, "rm -rf '#{config_dir}'", :acceptable_exit_codes => [0, 1])
24
+ end
25
+
26
+ step "Agent #{agent}: create config file in default location" do
27
+ on(agent, "mkdir -p '#{config_dir}'")
28
+ create_remote_file(agent, config_file, config)
29
+ end
30
+
31
+ step "conflict logic applies across settings sources" do
32
+ on(agent, facter("--no-external-facts"), :acceptable_exit_codes => [1]) do |facter_output|
33
+ assert_match(/no-external-facts and external-dir options conflict/, facter_output.stderr, "Facter should have warned about conflicting settings")
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,40 @@
1
+ # This test verifies that the external-dir specified in the configuration file can be overridden by using
2
+ # --external-dir on the command line
3
+ test_name "C100016: config external-dir overridden by command line --external-dir" do
4
+ tag 'risk:medium'
5
+
6
+ require 'json'
7
+ require 'facter/acceptance/user_fact_utils'
8
+ extend Facter::Acceptance::UserFactUtils
9
+
10
+ agents.each do |agent|
11
+ step "Agent #{agent}: create 2 custom fact directories with facts and a config file pointing at 1 directory" do
12
+ external_config_dir = agent.tmpdir('external_dir')
13
+ external_cli_dir = agent.tmpdir('cli_external_dir')
14
+ external_config_fact = File.join(external_config_dir, 'external.txt')
15
+ external_cli_fact = File.join(external_cli_dir, 'external.txt')
16
+ create_remote_file(agent, external_config_fact, "config_fact=config_value")
17
+ create_remote_file(agent, external_cli_fact, "cli_fact=cli_value")
18
+ config_dir = agent.tmpdir("config_dir")
19
+ config_file = File.join(config_dir, "facter.conf")
20
+ config_content = <<EOM
21
+ global : {
22
+ external-dir : "#{external_config_dir}",
23
+ }
24
+ EOM
25
+ create_remote_file(agent, config_file, config_content)
26
+
27
+ teardown do
28
+ on(agent, "rm -rf '#{external_config_dir}' '#{external_cli_dir}' '#{config_dir}'")
29
+ end
30
+
31
+ step "Agent #{agent}: resolve a fact from the command line external-dir and not the config file" do
32
+ on(agent, facter("--config '#{config_file}' --external-dir '#{external_cli_dir}' --json")) do |facter_output|
33
+ results = JSON.parse(facter_output.stdout)
34
+ assert_equal("cli_value", results['cli_fact'], "Incorrect custom fact value for cli_fact")
35
+ assert_nil(results['config_fact'], "Config fact should not resolve and be nil")
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,37 @@
1
+ # This test verifies that facter can load facts from a single external-dir specified
2
+ # in the configuration file
3
+ test_name "C98142: config external-dir allows single external fact directory" do
4
+ tag 'risk:low'
5
+
6
+ require 'facter/acceptance/user_fact_utils'
7
+ extend Facter::Acceptance::UserFactUtils
8
+
9
+ agents.each do |agent|
10
+ step "Agent #{agent}: create an external fact directory with an external fact and a config file" do
11
+ external_dir = agent.tmpdir('external_dir')
12
+ ext = get_external_fact_script_extension(agent['platform'])
13
+ external_fact = File.join(external_dir, "external_fact#{ext}")
14
+ create_remote_file(agent, external_fact, external_fact_content(agent['platform'], 'single_fact', 'external_value'))
15
+ on(agent, "chmod +x '#{external_fact}'")
16
+
17
+ config_dir = agent.tmpdir("config_dir")
18
+ config_file = File.join(config_dir, "facter.conf")
19
+ config_content = <<EOM
20
+ global : {
21
+ external-dir : "#{external_dir}",
22
+ }
23
+ EOM
24
+ create_remote_file(agent, config_file, config_content)
25
+
26
+ teardown do
27
+ on(agent, "rm -rf '#{external_dir}' '#{config_dir}'")
28
+ end
29
+
30
+ step "Agent #{agent}: resolve a fact in the external-dir in the configuration file" do
31
+ on(agent, facter("--config '#{config_file}' single_fact")) do |facter_output|
32
+ assert_equal("external_value", facter_output.stdout.chomp, "Incorrect external fact value")
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,43 @@
1
+ # facter should be able to load facts from multiple external-dir's specified
2
+ # in the configuration file
3
+ test_name "C99995: config file supports external-dir for multiple fact directories" do
4
+ tag 'risk:medium'
5
+
6
+ require 'json'
7
+ require 'facter/acceptance/user_fact_utils'
8
+ extend Facter::Acceptance::UserFactUtils
9
+
10
+ agents.each do |agent|
11
+ step "Agent #{agent}: create external fact directories and a external fact in each and a config file" do
12
+ external_dir_1 = agent.tmpdir('external_dir_1')
13
+ external_dir_2 = agent.tmpdir('external_dir_2')
14
+ ext = get_external_fact_script_extension(agent['platform'])
15
+ external_fact_1 = File.join(external_dir_1, "external_fact#{ext}")
16
+ external_fact_2 = File.join(external_dir_2, "external_fact#{ext}")
17
+ create_remote_file(agent, external_fact_1, external_fact_content(agent['platform'], 'external_fact_1', 'external_value_1'))
18
+ create_remote_file(agent, external_fact_2, external_fact_content(agent['platform'], 'external_fact_2', 'external_value_2'))
19
+ on(agent, "chmod +x '#{external_fact_1}' '#{external_fact_2}'")
20
+
21
+ config_dir = agent.tmpdir("config_dir")
22
+ config_file = File.join(config_dir, "facter.conf")
23
+ config_content = <<EOM
24
+ global : {
25
+ external-dir : [ "#{external_dir_1}", "#{external_dir_2}" ],
26
+ }
27
+ EOM
28
+ create_remote_file(agent, config_file, config_content)
29
+
30
+ teardown do
31
+ on(agent, "rm -rf '#{external_dir_1}' '#{external_dir_2}' '#{config_dir}'")
32
+ end
33
+
34
+ step "Agent #{agent}: resolve a fact from each configured external-dir path" do
35
+ on(agent, facter("--config '#{config_file}' --json")) do |facter_output|
36
+ results = JSON.parse(facter_output.stdout)
37
+ assert_equal("external_value_1", results['external_fact_1'], "Incorrect external fact value for external_fact_1")
38
+ assert_equal("external_value_2", results['external_fact_2'], "Incorrect external fact value for external_fact_2")
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,73 @@
1
+ # This test is intended to demonstrate that Facter's config file will
2
+ # load correctly from the default location when Facter is required from Ruby.
3
+ # On *nix, this location is /etc/puppetlabs/facter/facter.conf.
4
+ # On Windows, it is C:\ProgramData\PuppetLabs\facter\etc\facter.conf
5
+ #
6
+ # The test also verifies that facter will search for external facts and custom facts
7
+ # in the directory paths defined with external-dir and custom-dir in the facter.conf file
8
+ test_name "C98141: config file is loaded when Facter is run from Puppet" do
9
+ tag 'risk:high'
10
+
11
+ require 'facter/acceptance/user_fact_utils'
12
+ extend Facter::Acceptance::UserFactUtils
13
+
14
+ agents.each do |agent|
15
+ # create paths for default facter.conf, external-dir, and custom-dir
16
+
17
+ # default facter.conf
18
+ facter_conf_default_dir = get_default_fact_dir(agent['platform'], on(agent, facter('kernelmajversion')).stdout.chomp.to_f)
19
+ facter_conf_default_path = File.join(facter_conf_default_dir, "facter.conf")
20
+
21
+ # external-dir
22
+ ext_fact_dir1 = agent.tmpdir('ext_fact_dir1')
23
+ ext_path1 = File.join(ext_fact_dir1, "test_ext_fact1.yaml")
24
+ ext_fact_dir2 = agent.tmpdir('ext_fact_dir2')
25
+ ext_path2 = File.join(ext_fact_dir2, "test_ext_fact2.yaml")
26
+
27
+ # custom-dir
28
+ cust_fact_dir = agent.tmpdir('custom_fact_dir')
29
+ cust_path = File.join(cust_fact_dir, "custom_fact.rb")
30
+
31
+ teardown do
32
+ on(agent, "rm -rf '#{facter_conf_default_dir}' '#{ext_fact_dir1}' '#{ext_fact_dir2}' '#{cust_fact_dir}'",
33
+ :acceptable_exit_codes => [0,1])
34
+ end
35
+
36
+ # create the directories
37
+ on(agent, "mkdir -p '#{facter_conf_default_dir}' '#{ext_fact_dir1}' '#{ext_fact_dir2}' '#{cust_fact_dir}'")
38
+
39
+ step "Agent #{agent}: create facter.conf, external fact, and custom fact files" do
40
+
41
+ create_remote_file(agent, facter_conf_default_path, <<-FILE)
42
+ global : {
43
+ external-dir : ["#{ext_fact_dir1}", "#{ext_fact_dir2}"],
44
+ custom-dir : ["#{cust_fact_dir}"]
45
+ }
46
+ FILE
47
+
48
+ create_remote_file(agent, ext_path1, <<-FILE)
49
+ externalfact1: 'This is external fact 1 in #{ext_fact_dir1} directory'
50
+ FILE
51
+
52
+ create_remote_file(agent, ext_path2, <<-FILE)
53
+ externalfact2: 'This is external fact 2 in #{ext_fact_dir2} directory'
54
+ FILE
55
+
56
+ create_remote_file(agent, cust_path, <<-FILE)
57
+ Facter.add('customfact') do
58
+ setcode do
59
+ 'This is a custom fact in #{cust_fact_dir} directory'
60
+ end
61
+ end
62
+ FILE
63
+ end
64
+
65
+ step "running `puppet facts` should load the config file automatically and search all external-dir and custom-dir paths" do
66
+ on(agent, puppet('facts')) do |puppet_facts_output|
67
+ assert_match(/This is external fact 1 in #{ext_fact_dir1} directory/, puppet_facts_output.stdout, "Expected external fact")
68
+ assert_match(/This is external fact 2 in #{ext_fact_dir2} directory/, puppet_facts_output.stdout, "Expected external fact")
69
+ assert_match(/This is a custom fact in #{cust_fact_dir} directory/, puppet_facts_output.stdout, "Expected custom fact")
70
+ end
71
+ end
72
+ end
73
+ end
@@ -0,0 +1,35 @@
1
+ # This test ensures that the cli.log-level config file setting works
2
+ # properly. The value of the setting should be a string indicating the
3
+ # logging level.
4
+ test_name "C99990: log-level setting can be used to specific logging level" do
5
+ tag 'risk:high'
6
+
7
+ require 'facter/acceptance/user_fact_utils'
8
+ extend Facter::Acceptance::UserFactUtils
9
+
10
+ config = <<EOM
11
+ cli : {
12
+ log-level : debug
13
+ }
14
+ EOM
15
+
16
+ agents.each do |agent|
17
+ step "Agent #{agent}: create config file" do
18
+ config_dir = get_default_fact_dir(agent['platform'], on(agent, facter('kernelmajversion')).stdout.chomp.to_f)
19
+ config_file = File.join(config_dir, "facter.conf")
20
+ on(agent, "mkdir -p '#{config_dir}'")
21
+ create_remote_file(agent, config_file, config)
22
+
23
+ teardown do
24
+ on(agent, "rm -rf '#{config_dir}'", :acceptable_exit_codes => [0, 1])
25
+ end
26
+
27
+ step "log-level set to debug should print DEBUG output to stderr" do
28
+ on(agent, facter("")) do |facter_output|
29
+ assert_match(/DEBUG/, facter_output.stderr, "Expected DEBUG information in stderr")
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
35
+