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,58 @@
1
+ # This test verifies that expired cached facts are not used
2
+ test_name "C100037: ttls configured cached valued that are expired are not returned" do
3
+ tag 'risk:high'
4
+
5
+ require 'facter/acceptance/user_fact_utils'
6
+ extend Facter::Acceptance::UserFactUtils
7
+
8
+ # This fact must be resolvable on ALL platforms
9
+ # Do NOT use the 'kernel' fact as it is used to configure the tests
10
+ cached_factname = 'uptime'
11
+
12
+ config = <<EOM
13
+ facts : {
14
+ ttls : [
15
+ { "#{cached_factname}" : 30 days }
16
+ ]
17
+ }
18
+ EOM
19
+
20
+ cached_fact_value = "CACHED_FACT_VALUE"
21
+ cached_fact_content = <<EOM
22
+ {
23
+ "#{cached_factname}": "#{cached_fact_value}"
24
+ }
25
+ EOM
26
+
27
+ agents.each do |agent|
28
+ step "Agent #{agent}: create config file" do
29
+ config_dir = get_default_fact_dir(agent['platform'], on(agent, facter('kernelmajversion')).stdout.chomp.to_f)
30
+ config_file = File.join(config_dir, "facter.conf")
31
+ cached_facts_dir = get_cached_facts_dir(agent['platform'], on(agent, facter('kernelmajversion')).stdout.chomp.to_f)
32
+
33
+ cached_fact_file = File.join(cached_facts_dir, cached_factname)
34
+
35
+ # Setup facter conf
36
+ on(agent, "mkdir -p '#{config_dir}'")
37
+ create_remote_file(agent, config_file, config)
38
+
39
+ teardown do
40
+ on(agent, "rm -rf '#{config_dir}'", :acceptable_exit_codes => [0, 1])
41
+ on(agent, "rm -rf '#{cached_facts_dir}'", :acceptable_exit_codes => [0, 1])
42
+ end
43
+
44
+ step "should not read from a cached JSON file for a fact that has been cached but the TTL expired" do
45
+ # Setup a known cached fact
46
+ on(agent, "rm -rf '#{cached_facts_dir}'", :acceptable_exit_codes => [0, 1])
47
+ on(agent, facter(""))
48
+ create_remote_file(agent, cached_fact_file, cached_fact_content)
49
+ # Change the modified date to sometime in the far distant past
50
+ on(agent, "touch -mt 198001010000 '#{cached_fact_file}'")
51
+
52
+ on(agent, facter("#{cached_factname}")) do |facter_output|
53
+ assert_not_match(/#{cached_fact_value}/, facter_output.stdout, "Expected fact to not match the cached fact file")
54
+ end
55
+ end
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,61 @@
1
+ # This test verifies that cached facts that are expired are refreshed
2
+ test_name "C100040: ttls configured facts that are expired are refreshed" do
3
+ tag 'risk:high'
4
+
5
+ require 'facter/acceptance/user_fact_utils'
6
+ extend Facter::Acceptance::UserFactUtils
7
+
8
+ # This fact must be resolvable on ALL platforms
9
+ # Do NOT use the 'kernel' fact as it is used to configure the tests
10
+ cached_factname = 'uptime'
11
+
12
+ config = <<EOM
13
+ facts : {
14
+ ttls : [
15
+ { "#{cached_factname}" : 30 days }
16
+ ]
17
+ }
18
+ EOM
19
+
20
+ cached_fact_value = "EXPIRED_CACHED_FACT_VALUE"
21
+ cached_fact_content = <<EOM
22
+ {
23
+ "#{cached_factname}": "#{cached_fact_value}"
24
+ }
25
+ EOM
26
+
27
+ agents.each do |agent|
28
+ step "Agent #{agent}: create config file" do
29
+ config_dir = get_default_fact_dir(agent['platform'], on(agent, facter('kernelmajversion')).stdout.chomp.to_f)
30
+ config_file = File.join(config_dir, "facter.conf")
31
+ cached_facts_dir = get_cached_facts_dir(agent['platform'], on(agent, facter('kernelmajversion')).stdout.chomp.to_f)
32
+
33
+ cached_fact_file = File.join(cached_facts_dir, cached_factname)
34
+
35
+ # Setup facter conf
36
+ on(agent, "mkdir -p '#{config_dir}'")
37
+ create_remote_file(agent, config_file, config)
38
+
39
+ teardown do
40
+ on(agent, "rm -rf '#{config_dir}'", :acceptable_exit_codes => [0, 1])
41
+ on(agent, "rm -rf '#{cached_facts_dir}'", :acceptable_exit_codes => [0, 1])
42
+ end
43
+
44
+ step "should refresh an expired cached fact" do
45
+ # Setup a known cached fact
46
+ on(agent, "rm -rf '#{cached_facts_dir}'", :acceptable_exit_codes => [0, 1])
47
+ on(agent, facter(""))
48
+ create_remote_file(agent, cached_fact_file, cached_fact_content)
49
+ # Change the modified date to sometime in the far distant past
50
+ on(agent, "touch -mt 198001010000 '#{cached_fact_file}'")
51
+ # Force facter to recache
52
+ on(agent, facter("#{cached_factname}"))
53
+
54
+ # Read cached fact file content
55
+ on(agent, "cat #{cached_fact_file}", :acceptable_exit_codes => [0]) do |cat_output|
56
+ assert_no_match(/#{cached_fact_value}/, cat_output.stdout, "Expected cached fact file to be refreshed")
57
+ end
58
+ end
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,57 @@
1
+ # This test verifies that cached facts are used while still valid
2
+ test_name "C100041: ttls configured cached facts are used while still valid" do
3
+ tag 'risk:high'
4
+
5
+ require 'facter/acceptance/user_fact_utils'
6
+ extend Facter::Acceptance::UserFactUtils
7
+
8
+ # This fact must be resolvable on ALL platforms
9
+ # Do NOT use the 'kernel' fact as it is used to configure the tests
10
+ cached_factname = 'uptime'
11
+
12
+ config = <<EOM
13
+ facts : {
14
+ ttls : [
15
+ { "#{cached_factname}" : 30 days }
16
+ ]
17
+ }
18
+ EOM
19
+
20
+ cached_fact_value = "CACHED_FACT_VALUE"
21
+ cached_fact_content = <<EOM
22
+ {
23
+ "#{cached_factname}": "#{cached_fact_value}"
24
+ }
25
+ EOM
26
+
27
+ agents.each do |agent|
28
+ step "Agent #{agent}: create config file" do
29
+ config_dir = get_default_fact_dir(agent['platform'], on(agent, facter('kernelmajversion')).stdout.chomp.to_f)
30
+ config_file = File.join(config_dir, "facter.conf")
31
+ cached_facts_dir = get_cached_facts_dir(agent['platform'], on(agent, facter('kernelmajversion')).stdout.chomp.to_f)
32
+
33
+ cached_fact_file = File.join(cached_facts_dir, cached_factname)
34
+
35
+ # Setup facter conf
36
+ on(agent, "mkdir -p '#{config_dir}'")
37
+ create_remote_file(agent, config_file, config)
38
+
39
+ teardown do
40
+ on(agent, "rm -rf '#{config_dir}'", :acceptable_exit_codes => [0, 1])
41
+ on(agent, "rm -rf '#{cached_facts_dir}'", :acceptable_exit_codes => [0, 1])
42
+ end
43
+
44
+ step "should read from a cached JSON file for a fact that has been cached" do
45
+ # Setup a known cached fact
46
+ on(agent, "rm -rf '#{cached_facts_dir}'", :acceptable_exit_codes => [0, 1])
47
+ on(agent, facter(""))
48
+ create_remote_file(agent, cached_fact_file, cached_fact_content)
49
+
50
+ on(agent, facter("#{cached_factname} --debug")) do
51
+ assert_match(/loading cached values for .+ facts/, stderr, "Expected debug message to state that values are read from cache")
52
+ assert_match(/#{cached_fact_value}/, stdout, "Expected fact to match the cached fact file")
53
+ end
54
+ end
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,53 @@
1
+ # This test verifies that corrupt facts are refreshed with new values
2
+ test_name "C100042: ttls configured cached facts that are corrupt are refreshed with new values" do
3
+ tag 'risk:high'
4
+
5
+ require 'facter/acceptance/user_fact_utils'
6
+ extend Facter::Acceptance::UserFactUtils
7
+
8
+ # This fact must be resolvable on ALL platforms
9
+ # Do NOT use the 'kernel' fact as it is used to configure the tests
10
+ cached_factname = 'uptime'
11
+
12
+ config = <<EOM
13
+ facts : {
14
+ ttls : [
15
+ { "#{cached_factname}" : 30 days }
16
+ ]
17
+ }
18
+ EOM
19
+
20
+ agents.each do |agent|
21
+ step "Agent #{agent}: create config file" do
22
+ config_dir = get_default_fact_dir(agent['platform'], on(agent, facter('kernelmajversion')).stdout.chomp.to_f)
23
+ config_file = File.join(config_dir, "facter.conf")
24
+ cached_facts_dir = get_cached_facts_dir(agent['platform'], on(agent, facter('kernelmajversion')).stdout.chomp.to_f)
25
+
26
+ cached_fact_file = File.join(cached_facts_dir, cached_factname)
27
+
28
+ # Setup facter conf
29
+ on(agent, "mkdir -p '#{config_dir}'")
30
+ create_remote_file(agent, config_file, config)
31
+
32
+ teardown do
33
+ on(agent, "rm -rf '#{config_dir}'", :acceptable_exit_codes => [0, 1])
34
+ on(agent, "rm -rf '#{cached_facts_dir}'", :acceptable_exit_codes => [0, 1])
35
+ end
36
+
37
+ step "should refresh a cached fact if cache file is corrupt" do
38
+ # Setup a known cached fact
39
+ on(agent, "rm -rf '#{cached_facts_dir}'", :acceptable_exit_codes => [0, 1])
40
+ on(agent, facter(""))
41
+ # Corrupt the cached fact file
42
+ create_remote_file(agent, cached_fact_file, 'ThisIsNotvalidJSON')
43
+
44
+ on(agent, facter("#{cached_factname}")) do
45
+ assert_match(/.+/, stdout, "Expected fact to be resolved")
46
+ end
47
+ on(agent, "cat #{cached_fact_file}", :acceptable_exit_codes => [0]) do |cat_output|
48
+ assert_match(/#{cached_factname}/, cat_output.stdout, "Expected cachced fact to contain the fact name")
49
+ end
50
+ end
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,53 @@
1
+ # This test verifies that cached facts that are empty return an empty string
2
+ test_name "C100043: ttls configured cached facts that are empty, return an empty string" do
3
+ tag 'risk:high'
4
+
5
+ require 'facter/acceptance/user_fact_utils'
6
+ extend Facter::Acceptance::UserFactUtils
7
+
8
+ # This fact must be resolvable on ALL platforms
9
+ # Do NOT use the 'kernel' fact as it is used to configure the tests
10
+ cached_factname = 'uptime'
11
+
12
+ config = <<EOM
13
+ facts : {
14
+ ttls : [
15
+ { "#{cached_factname}" : 30 days }
16
+ ]
17
+ }
18
+ EOM
19
+
20
+ empty_cached_fact_content = <<EOM
21
+ { }
22
+ EOM
23
+
24
+ agents.each do |agent|
25
+ step "Agent #{agent}: create config file" do
26
+ config_dir = get_default_fact_dir(agent['platform'], on(agent, facter('kernelmajversion')).stdout.chomp.to_f)
27
+ config_file = File.join(config_dir, "facter.conf")
28
+ cached_facts_dir = get_cached_facts_dir(agent['platform'], on(agent, facter('kernelmajversion')).stdout.chomp.to_f)
29
+
30
+ cached_fact_file = File.join(cached_facts_dir, cached_factname)
31
+
32
+ # Setup facter conf
33
+ on(agent, "mkdir -p '#{config_dir}'")
34
+ create_remote_file(agent, config_file, config)
35
+
36
+ teardown do
37
+ on(agent, "rm -rf '#{config_dir}'", :acceptable_exit_codes => [0, 1])
38
+ on(agent, "rm -rf '#{cached_facts_dir}'", :acceptable_exit_codes => [0, 1])
39
+ end
40
+
41
+ step "should return an empty string for an empty JSON document" do
42
+ # Setup a known cached fact
43
+ on(agent, "rm -rf '#{cached_facts_dir}'", :acceptable_exit_codes => [0, 1])
44
+ on(agent, facter(""))
45
+ create_remote_file(agent, cached_fact_file, empty_cached_fact_content)
46
+
47
+ on(agent, facter("#{cached_factname}")) do |facter_output|
48
+ assert_empty(facter_output.stdout.chomp, "Expected fact to be empty")
49
+ end
50
+ end
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,45 @@
1
+ # Verify that setting a ttls, creates a json file for the cached fact when run
2
+ # from puppet facts
3
+ test_name "C100038: with ttls configured create cached facts when run from puppet facts" do
4
+ tag 'risk:medium'
5
+
6
+ require 'facter/acceptance/user_fact_utils'
7
+ extend Facter::Acceptance::UserFactUtils
8
+
9
+ # This fact must be resolvable on ALL platforms
10
+ # Do NOT use the 'kernel' fact as it is used to configure the tests
11
+ cached_factname = 'uptime'
12
+ config = <<EOM
13
+ facts : {
14
+ ttls : [
15
+ { "#{cached_factname}" : 30 days }
16
+ ]
17
+ }
18
+ EOM
19
+
20
+ agents.each do |agent|
21
+ step "Agent #{agent}: create config file" do
22
+ facter_conf_default_dir = get_default_fact_dir(agent['platform'], on(agent, facter('kernelmajversion')).stdout.chomp.to_f)
23
+ facter_conf_default_path = File.join(facter_conf_default_dir, "facter.conf")
24
+ cached_facts_dir = get_cached_facts_dir(agent['platform'], on(agent, facter('kernelmajversion')).stdout.chomp.to_f)
25
+ cached_fact_file = File.join(cached_facts_dir, cached_factname)
26
+
27
+ on(agent, "mkdir -p '#{facter_conf_default_dir}'")
28
+ create_remote_file(agent, facter_conf_default_path, config)
29
+
30
+ teardown do
31
+ on(agent, "rm -rf '#{cached_facts_dir}' '#{facter_conf_default_dir}'", :acceptable_exit_codes => [0, 1])
32
+ end
33
+
34
+ step "should create a JSON file for a fact that is to be cached" do
35
+ on(agent, "rm -rf '#{cached_facts_dir}'", :acceptable_exit_codes => [0, 1])
36
+ on(agent, puppet("facts --debug")) do |pupppet_fact_output|
37
+ assert_match(/caching values for .+ facts/, pupppet_fact_output.stdout, "Expected debug message to state that values will be cached")
38
+ end
39
+ on(agent, "cat #{cached_fact_file}", :acceptable_exit_codes => [0]) do |cat_output|
40
+ assert_match(/#{cached_factname}/, cat_output.stdout, "Expected cached fact file to contain fact information")
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,54 @@
1
+ # Verify that setting a ttls, puppet facts returns the cached value of the fact
2
+ test_name "C100039: ttls configured cached facts run from puppet facts return cached facts" do
3
+ tag 'risk:high'
4
+
5
+ require 'facter/acceptance/user_fact_utils'
6
+ extend Facter::Acceptance::UserFactUtils
7
+
8
+ # This fact must be resolvable on ALL platforms
9
+ # Do NOT use the 'kernel' fact as it is used to configure the tests
10
+ cached_factname = 'uptime'
11
+ config = <<EOM
12
+ facts : {
13
+ ttls : [
14
+ { "#{cached_factname}" : 30 days }
15
+ ]
16
+ }
17
+ EOM
18
+
19
+ cached_value = "CACHED_FACT_VALUE"
20
+ cached_fact_content = <<EOM
21
+ {
22
+ "#{cached_factname}": "#{cached_value}"
23
+ }
24
+ EOM
25
+
26
+ agents.each do |agent|
27
+ step "Agent #{agent}: create config file" do
28
+ facter_conf_default_dir = get_default_fact_dir(agent['platform'], on(agent, facter('kernelmajversion')).stdout.chomp.to_f)
29
+ facter_conf_default_path = File.join(facter_conf_default_dir, "facter.conf")
30
+ cached_facts_dir = get_cached_facts_dir(agent['platform'], on(agent, facter('kernelmajversion')).stdout.chomp.to_f)
31
+ cached_fact_file = File.join(cached_facts_dir, cached_factname)
32
+
33
+ on(agent, "mkdir -p '#{facter_conf_default_dir}'")
34
+ create_remote_file(agent, facter_conf_default_path, config)
35
+
36
+ teardown do
37
+ on(agent, "rm -rf '#{cached_facts_dir}' '#{facter_conf_default_dir}'", :acceptable_exit_codes => [0, 1])
38
+ end
39
+
40
+ step "should read from a cached JSON file for a fact that has been cached" do
41
+ step "call puppet facts to setup the cached fact" do
42
+ on(agent, "rm -rf '#{cached_facts_dir}'", :acceptable_exit_codes => [0, 1])
43
+ on(agent, puppet("facts"))
44
+ create_remote_file(agent, cached_fact_file, cached_fact_content)
45
+ end
46
+
47
+ on(agent, puppet("facts --debug")) do |puppet_facts_output|
48
+ assert_match(/loading cached values for .+ facts/, puppet_facts_output.stdout, "Expected debug message to state that values are read from cache")
49
+ assert_match(/#{cached_value}/, puppet_facts_output.stdout, "Expected fact to match the cached fact file")
50
+ end
51
+ end
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,34 @@
1
+ # This test is intended to demonstrate that setting cli.verbose to true in the
2
+ # config file causes INFO level logging to output to stderr.
3
+ test_name "C99989: verbose config field prints verbose information to stderr" 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
+ verbose : 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(/INFO/, facter_output.stderr, "Expected stderr to contain verbose (INFO) statements")
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
34
+
@@ -0,0 +1,34 @@
1
+ # This test checks that we can call facter with a --custom-dir and get a custom fact
2
+ # from that directory
3
+ test_name "C14905: custom fact command line option --custom-dir loads custom fact" 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('custom_fact') do
11
+ setcode do
12
+ "single_fact"
13
+ end
14
+ end
15
+ EOM
16
+
17
+ agents.each do |agent|
18
+ step "Agent #{agent}: create custom fact directory and a custom fact" 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
+
23
+ teardown do
24
+ on(agent, "rm -rf '#{custom_dir}'")
25
+ end
26
+
27
+ step "Agent #{agent}: --custom-dir option should resolve custom facts from the specific directory" do
28
+ on(agent, facter("--custom-dir '#{custom_dir}' custom_fact")) do |facter_output|
29
+ assert_equal("single_fact", facter_output.stdout.chomp, "Incorrect custom fact value")
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end