puppet 6.19.0 → 6.22.1

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of puppet might be problematic. Click here for more details.

Files changed (212) hide show
  1. checksums.yaml +4 -4
  2. data/CODEOWNERS +2 -16
  3. data/Gemfile +3 -1
  4. data/Gemfile.lock +50 -39
  5. data/ext/project_data.yaml +2 -2
  6. data/lib/puppet/application.rb +10 -6
  7. data/lib/puppet/application/agent.rb +1 -0
  8. data/lib/puppet/application/apply.rb +3 -2
  9. data/lib/puppet/application/device.rb +1 -0
  10. data/lib/puppet/application/filebucket.rb +2 -2
  11. data/lib/puppet/application/script.rb +1 -0
  12. data/lib/puppet/application/ssl.rb +11 -0
  13. data/lib/puppet/application_support.rb +7 -0
  14. data/lib/puppet/configurer.rb +28 -18
  15. data/lib/puppet/defaults.rb +46 -20
  16. data/lib/puppet/environments.rb +54 -55
  17. data/lib/puppet/face/config.rb +10 -0
  18. data/lib/puppet/face/epp.rb +12 -2
  19. data/lib/puppet/face/facts.rb +158 -0
  20. data/lib/puppet/ffi/posix.rb +10 -0
  21. data/lib/puppet/ffi/posix/constants.rb +14 -0
  22. data/lib/puppet/ffi/posix/functions.rb +24 -0
  23. data/lib/puppet/file_system/memory_file.rb +8 -1
  24. data/lib/puppet/file_system/windows.rb +2 -0
  25. data/lib/puppet/functions/epp.rb +1 -0
  26. data/lib/puppet/functions/inline_epp.rb +1 -0
  27. data/lib/puppet/functions/partition.rb +8 -0
  28. data/lib/puppet/indirector/fact_search.rb +60 -0
  29. data/lib/puppet/indirector/facts/facter.rb +24 -3
  30. data/lib/puppet/indirector/facts/json.rb +27 -0
  31. data/lib/puppet/indirector/facts/yaml.rb +3 -58
  32. data/lib/puppet/indirector/json.rb +5 -1
  33. data/lib/puppet/indirector/node/json.rb +8 -0
  34. data/lib/puppet/indirector/report/json.rb +34 -0
  35. data/lib/puppet/module_tool/applications/installer.rb +48 -2
  36. data/lib/puppet/module_tool/errors/shared.rb +17 -2
  37. data/lib/puppet/network/formats.rb +69 -1
  38. data/lib/puppet/network/http/factory.rb +4 -0
  39. data/lib/puppet/pal/pal_impl.rb +70 -17
  40. data/lib/puppet/parser/ast/leaf.rb +3 -2
  41. data/lib/puppet/parser/templatewrapper.rb +1 -1
  42. data/lib/puppet/pops/evaluator/deferred_resolver.rb +5 -3
  43. data/lib/puppet/pops/evaluator/evaluator_impl.rb +22 -3
  44. data/lib/puppet/pops/model/ast_transformer.rb +1 -1
  45. data/lib/puppet/property/list.rb +1 -1
  46. data/lib/puppet/provider/group/groupadd.rb +13 -8
  47. data/lib/puppet/provider/package/apt.rb +34 -2
  48. data/lib/puppet/provider/package/aptitude.rb +6 -0
  49. data/lib/puppet/provider/package/dnfmodule.rb +1 -1
  50. data/lib/puppet/provider/service/debian.rb +2 -0
  51. data/lib/puppet/provider/service/systemd.rb +1 -1
  52. data/lib/puppet/provider/user/aix.rb +2 -2
  53. data/lib/puppet/provider/user/useradd.rb +62 -8
  54. data/lib/puppet/reference/configuration.rb +6 -5
  55. data/lib/puppet/settings.rb +43 -15
  56. data/lib/puppet/settings/alias_setting.rb +37 -0
  57. data/lib/puppet/settings/base_setting.rb +26 -2
  58. data/lib/puppet/settings/environment_conf.rb +1 -0
  59. data/lib/puppet/type/package.rb +3 -3
  60. data/lib/puppet/util/autoload.rb +1 -8
  61. data/lib/puppet/util/fact_dif.rb +81 -0
  62. data/lib/puppet/util/monkey_patches.rb +7 -0
  63. data/lib/puppet/util/posix.rb +54 -5
  64. data/lib/puppet/util/rubygems.rb +5 -1
  65. data/lib/puppet/util/windows/adsi.rb +46 -0
  66. data/lib/puppet/util/windows/api_types.rb +1 -1
  67. data/lib/puppet/util/windows/principal.rb +9 -2
  68. data/lib/puppet/util/windows/service.rb +1 -1
  69. data/lib/puppet/util/windows/sid.rb +4 -2
  70. data/lib/puppet/version.rb +1 -1
  71. data/locales/puppet.pot +295 -219
  72. data/man/man5/puppet.conf.5 +15 -7
  73. data/man/man8/puppet-agent.8 +2 -2
  74. data/man/man8/puppet-apply.8 +2 -2
  75. data/man/man8/puppet-catalog.8 +1 -1
  76. data/man/man8/puppet-config.8 +1 -1
  77. data/man/man8/puppet-describe.8 +1 -1
  78. data/man/man8/puppet-device.8 +2 -2
  79. data/man/man8/puppet-doc.8 +1 -1
  80. data/man/man8/puppet-epp.8 +1 -1
  81. data/man/man8/puppet-facts.8 +90 -1
  82. data/man/man8/puppet-filebucket.8 +3 -3
  83. data/man/man8/puppet-generate.8 +1 -1
  84. data/man/man8/puppet-help.8 +1 -1
  85. data/man/man8/puppet-key.8 +1 -1
  86. data/man/man8/puppet-lookup.8 +1 -1
  87. data/man/man8/puppet-man.8 +1 -1
  88. data/man/man8/puppet-module.8 +1 -1
  89. data/man/man8/puppet-node.8 +4 -1
  90. data/man/man8/puppet-parser.8 +1 -1
  91. data/man/man8/puppet-plugin.8 +1 -1
  92. data/man/man8/puppet-report.8 +4 -1
  93. data/man/man8/puppet-resource.8 +1 -1
  94. data/man/man8/puppet-script.8 +2 -2
  95. data/man/man8/puppet-ssl.8 +5 -1
  96. data/man/man8/puppet-status.8 +1 -1
  97. data/man/man8/puppet.8 +2 -2
  98. data/spec/fixtures/integration/application/agent/cached_deferred_catalog.json +91 -0
  99. data/spec/fixtures/unit/provider/service/systemd/list_unit_files_services_vendor_preset +9 -0
  100. data/spec/fixtures/unit/provider/user/aix/aix_passwd_file.out +4 -0
  101. data/spec/integration/application/agent_spec.rb +160 -3
  102. data/spec/integration/application/apply_spec.rb +19 -0
  103. data/spec/integration/application/plugin_spec.rb +1 -1
  104. data/spec/integration/defaults_spec.rb +0 -7
  105. data/spec/integration/environments/setting_hooks_spec.rb +1 -1
  106. data/spec/integration/http/client_spec.rb +12 -0
  107. data/spec/integration/indirector/direct_file_server_spec.rb +1 -3
  108. data/spec/integration/resource/type_collection_spec.rb +2 -6
  109. data/spec/integration/transaction_spec.rb +4 -9
  110. data/spec/integration/util/windows/adsi_spec.rb +21 -1
  111. data/spec/integration/util/windows/principal_spec.rb +21 -0
  112. data/spec/integration/util/windows/registry_spec.rb +6 -10
  113. data/spec/lib/puppet_spec/settings.rb +6 -1
  114. data/spec/spec_helper.rb +12 -5
  115. data/spec/unit/agent_spec.rb +8 -6
  116. data/spec/unit/application/agent_spec.rb +0 -1
  117. data/spec/unit/application/config_spec.rb +224 -4
  118. data/spec/unit/application/facts_spec.rb +482 -3
  119. data/spec/unit/application/filebucket_spec.rb +0 -2
  120. data/spec/unit/application/ssl_spec.rb +23 -0
  121. data/spec/unit/application_spec.rb +51 -9
  122. data/spec/unit/confine/feature_spec.rb +1 -1
  123. data/spec/unit/confine_spec.rb +8 -2
  124. data/spec/unit/defaults_spec.rb +36 -1
  125. data/spec/unit/environments_spec.rb +221 -68
  126. data/spec/unit/face/config_spec.rb +27 -32
  127. data/spec/unit/face/facts_spec.rb +4 -0
  128. data/spec/unit/face/node_spec.rb +0 -11
  129. data/spec/unit/file_serving/configuration/parser_spec.rb +0 -1
  130. data/spec/unit/file_serving/metadata_spec.rb +3 -3
  131. data/spec/unit/file_serving/terminus_helper_spec.rb +11 -4
  132. data/spec/unit/file_system_spec.rb +9 -0
  133. data/spec/unit/forge/module_release_spec.rb +2 -7
  134. data/spec/unit/functions/inline_epp_spec.rb +26 -1
  135. data/spec/unit/http/service/compiler_spec.rb +49 -0
  136. data/spec/unit/http/service_spec.rb +1 -1
  137. data/spec/unit/indirector/face_spec.rb +0 -1
  138. data/spec/unit/indirector/facts/facter_spec.rb +95 -1
  139. data/spec/unit/indirector/facts/json_spec.rb +255 -0
  140. data/spec/unit/indirector/file_bucket_file/selector_spec.rb +26 -8
  141. data/spec/unit/indirector/indirection_spec.rb +8 -12
  142. data/spec/unit/indirector/key/file_spec.rb +0 -1
  143. data/spec/unit/indirector/node/json_spec.rb +33 -0
  144. data/spec/{integration/indirector/report/yaml.rb → unit/indirector/report/json_spec.rb} +13 -24
  145. data/spec/unit/indirector/report/yaml_spec.rb +72 -8
  146. data/spec/unit/indirector_spec.rb +2 -2
  147. data/spec/unit/module_tool/applications/installer_spec.rb +66 -0
  148. data/spec/unit/network/authconfig_spec.rb +0 -3
  149. data/spec/unit/network/formats_spec.rb +41 -0
  150. data/spec/unit/network/http/api/indirected_routes_spec.rb +0 -9
  151. data/spec/unit/network/http/factory_spec.rb +19 -0
  152. data/spec/unit/network/http/handler_spec.rb +0 -5
  153. data/spec/unit/parser/compiler_spec.rb +3 -19
  154. data/spec/unit/parser/resource_spec.rb +14 -8
  155. data/spec/unit/parser/templatewrapper_spec.rb +4 -3
  156. data/spec/unit/pops/evaluator/deferred_resolver_spec.rb +20 -0
  157. data/spec/unit/property_spec.rb +1 -0
  158. data/spec/unit/provider/group/groupadd_spec.rb +5 -2
  159. data/spec/unit/provider/nameservice_spec.rb +66 -65
  160. data/spec/unit/provider/package/apt_spec.rb +28 -23
  161. data/spec/unit/provider/package/aptitude_spec.rb +1 -1
  162. data/spec/unit/provider/package/base_spec.rb +6 -5
  163. data/spec/unit/provider/package/dnfmodule_spec.rb +10 -1
  164. data/spec/unit/provider/package/pacman_spec.rb +18 -12
  165. data/spec/unit/provider/package/pip_spec.rb +6 -11
  166. data/spec/unit/provider/package/pkgdmg_spec.rb +0 -4
  167. data/spec/unit/provider/service/systemd_spec.rb +11 -0
  168. data/spec/unit/provider/user/aix_spec.rb +5 -0
  169. data/spec/unit/provider/user/hpux_spec.rb +1 -1
  170. data/spec/unit/provider/user/pw_spec.rb +2 -0
  171. data/spec/unit/provider/user/useradd_spec.rb +71 -3
  172. data/spec/unit/provider_spec.rb +8 -10
  173. data/spec/unit/puppet_pal_catalog_spec.rb +45 -0
  174. data/spec/unit/resource/capability_finder_spec.rb +6 -1
  175. data/spec/unit/resource/catalog_spec.rb +1 -1
  176. data/spec/unit/resource/type_spec.rb +1 -1
  177. data/spec/unit/resource_spec.rb +11 -10
  178. data/spec/unit/settings_spec.rb +543 -228
  179. data/spec/unit/ssl/base_spec.rb +0 -1
  180. data/spec/unit/ssl/host_spec.rb +0 -5
  181. data/spec/unit/ssl/ssl_provider_spec.rb +14 -8
  182. data/spec/unit/transaction/additional_resource_generator_spec.rb +3 -7
  183. data/spec/unit/transaction/event_manager_spec.rb +14 -11
  184. data/spec/unit/transaction_spec.rb +13 -4
  185. data/spec/unit/type/file/content_spec.rb +0 -1
  186. data/spec/unit/type/file/selinux_spec.rb +0 -2
  187. data/spec/unit/type/file_spec.rb +0 -6
  188. data/spec/unit/type/group_spec.rb +13 -6
  189. data/spec/unit/type/resources_spec.rb +7 -7
  190. data/spec/unit/type/service_spec.rb +1 -1
  191. data/spec/unit/type/tidy_spec.rb +0 -1
  192. data/spec/unit/type_spec.rb +2 -2
  193. data/spec/unit/util/at_fork_spec.rb +2 -2
  194. data/spec/unit/util/autoload_spec.rb +5 -1
  195. data/spec/unit/util/backups_spec.rb +1 -2
  196. data/spec/unit/util/execution_spec.rb +15 -11
  197. data/spec/unit/util/inifile_spec.rb +6 -14
  198. data/spec/unit/util/log_spec.rb +8 -7
  199. data/spec/unit/util/logging_spec.rb +3 -3
  200. data/spec/unit/util/posix_spec.rb +363 -15
  201. data/spec/unit/util/rubygems_spec.rb +2 -2
  202. data/spec/unit/util/selinux_spec.rb +76 -52
  203. data/spec/unit/util/storage_spec.rb +3 -1
  204. data/spec/unit/util/suidmanager_spec.rb +44 -41
  205. data/spec/unit/util/windows/sid_spec.rb +6 -0
  206. data/spec/unit/util_spec.rb +13 -6
  207. metadata +23 -14
  208. data/spec/integration/application/config_spec.rb +0 -74
  209. data/spec/lib/matchers/include.rb +0 -27
  210. data/spec/lib/matchers/include_spec.rb +0 -32
  211. data/spec/unit/face/catalog_spec.rb +0 -6
  212. data/spec/unit/face/module_spec.rb +0 -3
@@ -0,0 +1,255 @@
1
+ require 'spec_helper'
2
+
3
+ require 'puppet/node/facts'
4
+ require 'puppet/indirector/facts/json'
5
+
6
+ def dir_containing_json_facts(hash)
7
+ jsondir = tmpdir('json_facts')
8
+
9
+ Puppet[:client_datadir] = jsondir
10
+ dir = File.join(jsondir, 'facts')
11
+ Dir.mkdir(dir)
12
+ hash.each_pair do |file, facts|
13
+ File.open(File.join(dir, file), 'wb') do |f|
14
+ f.write(JSON.dump(facts))
15
+ end
16
+ end
17
+ end
18
+
19
+ describe Puppet::Node::Facts::Json do
20
+ include PuppetSpec::Files
21
+
22
+ it "should be a subclass of the Json terminus" do
23
+ expect(Puppet::Node::Facts::Json.superclass).to equal(Puppet::Indirector::JSON)
24
+ end
25
+
26
+ it "should have documentation" do
27
+ expect(Puppet::Node::Facts::Json.doc).not_to be_nil
28
+ expect(Puppet::Node::Facts::Json.doc).not_to be_empty
29
+ end
30
+
31
+ it "should be registered with the facts indirection" do
32
+ indirection = Puppet::Indirector::Indirection.instance(:facts)
33
+ expect(Puppet::Node::Facts::Json.indirection).to equal(indirection)
34
+ end
35
+
36
+ it "should have its name set to :json" do
37
+ expect(Puppet::Node::Facts::Json.name).to eq(:json)
38
+ end
39
+
40
+ it "should allow network requests" do
41
+ # Doesn't allow json as a network format, but allows `puppet facts upload`
42
+ # to update the JSON cache on a master.
43
+ expect(Puppet::Node::Facts::Json.new.allow_remote_requests?).to be(true)
44
+ end
45
+
46
+ describe "#search" do
47
+ def assert_search_matches(matching, nonmatching, query)
48
+ request = Puppet::Indirector::Request.new(:inventory, :search, nil, nil, query)
49
+
50
+ dir_containing_json_facts(matching.merge(nonmatching))
51
+
52
+ results = Puppet::Node::Facts::Json.new.search(request)
53
+ expect(results).to match_array(matching.values.map {|facts| facts.name})
54
+ end
55
+
56
+ it "should return node names that match the search query options" do
57
+ assert_search_matches({
58
+ 'matching.json' => Puppet::Node::Facts.new("matchingnode", "architecture" => "i386", 'processor_count' => '4'),
59
+ 'matching1.json' => Puppet::Node::Facts.new("matchingnode1", "architecture" => "i386", 'processor_count' => '4', 'randomfact' => 'foo')
60
+ },
61
+ {
62
+ "nonmatching.json" => Puppet::Node::Facts.new("nonmatchingnode", "architecture" => "powerpc", 'processor_count' => '4'),
63
+ "nonmatching1.json" => Puppet::Node::Facts.new("nonmatchingnode1", "architecture" => "powerpc", 'processor_count' => '5'),
64
+ "nonmatching2.json" => Puppet::Node::Facts.new("nonmatchingnode2", "architecture" => "i386", 'processor_count' => '5'),
65
+ "nonmatching3.json" => Puppet::Node::Facts.new("nonmatchingnode3", 'processor_count' => '4'),
66
+ },
67
+ {'facts.architecture' => 'i386', 'facts.processor_count' => '4'}
68
+ )
69
+ end
70
+
71
+ it "should return empty array when no nodes match the search query options" do
72
+ assert_search_matches({}, {
73
+ "nonmatching.json" => Puppet::Node::Facts.new("nonmatchingnode", "architecture" => "powerpc", 'processor_count' => '10'),
74
+ "nonmatching1.json" => Puppet::Node::Facts.new("nonmatchingnode1", "architecture" => "powerpc", 'processor_count' => '5'),
75
+ "nonmatching2.json" => Puppet::Node::Facts.new("nonmatchingnode2", "architecture" => "i386", 'processor_count' => '5'),
76
+ "nonmatching3.json" => Puppet::Node::Facts.new("nonmatchingnode3", 'processor_count' => '4'),
77
+ },
78
+ {'facts.processor_count.lt' => '4', 'facts.processor_count.gt' => '4'}
79
+ )
80
+ end
81
+
82
+ it "should return node names that match the search query options with the greater than operator" do
83
+ assert_search_matches({
84
+ 'matching.json' => Puppet::Node::Facts.new("matchingnode", "architecture" => "i386", 'processor_count' => '5'),
85
+ 'matching1.json' => Puppet::Node::Facts.new("matchingnode1", "architecture" => "powerpc", 'processor_count' => '10', 'randomfact' => 'foo')
86
+ },
87
+ {
88
+ "nonmatching.json" => Puppet::Node::Facts.new("nonmatchingnode", "architecture" => "powerpc", 'processor_count' => '4'),
89
+ "nonmatching2.json" => Puppet::Node::Facts.new("nonmatchingnode2", "architecture" => "i386", 'processor_count' => '3'),
90
+ "nonmatching3.json" => Puppet::Node::Facts.new("nonmatchingnode3" ),
91
+ },
92
+ {'facts.processor_count.gt' => '4'}
93
+ )
94
+ end
95
+
96
+ it "should return node names that match the search query options with the less than operator" do
97
+ assert_search_matches({
98
+ 'matching.json' => Puppet::Node::Facts.new("matchingnode", "architecture" => "i386", 'processor_count' => '5'),
99
+ 'matching1.json' => Puppet::Node::Facts.new("matchingnode1", "architecture" => "powerpc", 'processor_count' => '30', 'randomfact' => 'foo')
100
+ },
101
+ {
102
+ "nonmatching.json" => Puppet::Node::Facts.new("nonmatchingnode", "architecture" => "powerpc", 'processor_count' => '50' ),
103
+ "nonmatching2.json" => Puppet::Node::Facts.new("nonmatchingnode2", "architecture" => "i386", 'processor_count' => '100'),
104
+ "nonmatching3.json" => Puppet::Node::Facts.new("nonmatchingnode3" ),
105
+ },
106
+ {'facts.processor_count.lt' => '50'}
107
+ )
108
+ end
109
+
110
+ it "should return node names that match the search query options with the less than or equal to operator" do
111
+ assert_search_matches({
112
+ 'matching.json' => Puppet::Node::Facts.new("matchingnode", "architecture" => "i386", 'processor_count' => '5'),
113
+ 'matching1.json' => Puppet::Node::Facts.new("matchingnode1", "architecture" => "powerpc", 'processor_count' => '50', 'randomfact' => 'foo')
114
+ },
115
+ {
116
+ "nonmatching.json" => Puppet::Node::Facts.new("nonmatchingnode", "architecture" => "powerpc", 'processor_count' => '100' ),
117
+ "nonmatching2.json" => Puppet::Node::Facts.new("nonmatchingnode2", "architecture" => "i386", 'processor_count' => '5000'),
118
+ "nonmatching3.json" => Puppet::Node::Facts.new("nonmatchingnode3" ),
119
+ },
120
+ {'facts.processor_count.le' => '50'}
121
+ )
122
+ end
123
+
124
+ it "should return node names that match the search query options with the greater than or equal to operator" do
125
+ assert_search_matches({
126
+ 'matching.json' => Puppet::Node::Facts.new("matchingnode", "architecture" => "i386", 'processor_count' => '100'),
127
+ 'matching1.json' => Puppet::Node::Facts.new("matchingnode1", "architecture" => "powerpc", 'processor_count' => '50', 'randomfact' => 'foo')
128
+ },
129
+ {
130
+ "nonmatching.json" => Puppet::Node::Facts.new("nonmatchingnode", "architecture" => "powerpc", 'processor_count' => '40'),
131
+ "nonmatching2.json" => Puppet::Node::Facts.new("nonmatchingnode2", "architecture" => "i386", 'processor_count' => '9' ),
132
+ "nonmatching3.json" => Puppet::Node::Facts.new("nonmatchingnode3" ),
133
+ },
134
+ {'facts.processor_count.ge' => '50'}
135
+ )
136
+ end
137
+
138
+ it "should return node names that match the search query options with the not equal operator" do
139
+ assert_search_matches({
140
+ 'matching.json' => Puppet::Node::Facts.new("matchingnode", "architecture" => 'arm' ),
141
+ 'matching1.json' => Puppet::Node::Facts.new("matchingnode1", "architecture" => 'powerpc', 'randomfact' => 'foo')
142
+ },
143
+ {
144
+ "nonmatching.json" => Puppet::Node::Facts.new("nonmatchingnode", "architecture" => "i386" ),
145
+ "nonmatching2.json" => Puppet::Node::Facts.new("nonmatchingnode2", "architecture" => "i386", 'processor_count' => '9' ),
146
+ "nonmatching3.json" => Puppet::Node::Facts.new("nonmatchingnode3" ),
147
+ },
148
+ {'facts.architecture.ne' => 'i386'}
149
+ )
150
+ end
151
+
152
+ def apply_timestamp(facts, timestamp)
153
+ facts.timestamp = timestamp
154
+ facts
155
+ end
156
+
157
+ it "should be able to query based on meta.timestamp.gt" do
158
+ assert_search_matches({
159
+ '2010-11-01.json' => apply_timestamp(Puppet::Node::Facts.new("2010-11-01", {}), Time.parse("2010-11-01")),
160
+ '2010-11-10.json' => apply_timestamp(Puppet::Node::Facts.new("2010-11-10", {}), Time.parse("2010-11-10")),
161
+ },
162
+ {
163
+ '2010-10-01.json' => apply_timestamp(Puppet::Node::Facts.new("2010-10-01", {}), Time.parse("2010-10-01")),
164
+ '2010-10-10.json' => apply_timestamp(Puppet::Node::Facts.new("2010-10-10", {}), Time.parse("2010-10-10")),
165
+ '2010-10-15.json' => apply_timestamp(Puppet::Node::Facts.new("2010-10-15", {}), Time.parse("2010-10-15")),
166
+ },
167
+ {'meta.timestamp.gt' => '2010-10-15'}
168
+ )
169
+ end
170
+
171
+ it "should be able to query based on meta.timestamp.le" do
172
+ assert_search_matches({
173
+ '2010-10-01.json' => apply_timestamp(Puppet::Node::Facts.new("2010-10-01", {}), Time.parse("2010-10-01")),
174
+ '2010-10-10.json' => apply_timestamp(Puppet::Node::Facts.new("2010-10-10", {}), Time.parse("2010-10-10")),
175
+ '2010-10-15.json' => apply_timestamp(Puppet::Node::Facts.new("2010-10-15", {}), Time.parse("2010-10-15")),
176
+ },
177
+ {
178
+ '2010-11-01.json' => apply_timestamp(Puppet::Node::Facts.new("2010-11-01", {}), Time.parse("2010-11-01")),
179
+ '2010-11-10.json' => apply_timestamp(Puppet::Node::Facts.new("2010-11-10", {}), Time.parse("2010-11-10")),
180
+ },
181
+ {'meta.timestamp.le' => '2010-10-15'}
182
+ )
183
+ end
184
+
185
+ it "should be able to query based on meta.timestamp.lt" do
186
+ assert_search_matches({
187
+ '2010-10-01.json' => apply_timestamp(Puppet::Node::Facts.new("2010-10-01", {}), Time.parse("2010-10-01")),
188
+ '2010-10-10.json' => apply_timestamp(Puppet::Node::Facts.new("2010-10-10", {}), Time.parse("2010-10-10")),
189
+ },
190
+ {
191
+ '2010-11-01.json' => apply_timestamp(Puppet::Node::Facts.new("2010-11-01", {}), Time.parse("2010-11-01")),
192
+ '2010-11-10.json' => apply_timestamp(Puppet::Node::Facts.new("2010-11-10", {}), Time.parse("2010-11-10")),
193
+ '2010-10-15.json' => apply_timestamp(Puppet::Node::Facts.new("2010-10-15", {}), Time.parse("2010-10-15")),
194
+ },
195
+ {'meta.timestamp.lt' => '2010-10-15'}
196
+ )
197
+ end
198
+
199
+ it "should be able to query based on meta.timestamp.ge" do
200
+ assert_search_matches({
201
+ '2010-11-01.json' => apply_timestamp(Puppet::Node::Facts.new("2010-11-01", {}), Time.parse("2010-11-01")),
202
+ '2010-11-10.json' => apply_timestamp(Puppet::Node::Facts.new("2010-11-10", {}), Time.parse("2010-11-10")),
203
+ '2010-10-15.json' => apply_timestamp(Puppet::Node::Facts.new("2010-10-15", {}), Time.parse("2010-10-15")),
204
+ },
205
+ {
206
+ '2010-10-01.json' => apply_timestamp(Puppet::Node::Facts.new("2010-10-01", {}), Time.parse("2010-10-01")),
207
+ '2010-10-10.json' => apply_timestamp(Puppet::Node::Facts.new("2010-10-10", {}), Time.parse("2010-10-10")),
208
+ },
209
+ {'meta.timestamp.ge' => '2010-10-15'}
210
+ )
211
+ end
212
+
213
+ it "should be able to query based on meta.timestamp.eq" do
214
+ assert_search_matches({
215
+ '2010-10-15.json' => apply_timestamp(Puppet::Node::Facts.new("2010-10-15", {}), Time.parse("2010-10-15")),
216
+ },
217
+ {
218
+ '2010-11-01.json' => apply_timestamp(Puppet::Node::Facts.new("2010-11-01", {}), Time.parse("2010-11-01")),
219
+ '2010-11-10.json' => apply_timestamp(Puppet::Node::Facts.new("2010-11-10", {}), Time.parse("2010-11-10")),
220
+ '2010-10-01.json' => apply_timestamp(Puppet::Node::Facts.new("2010-10-01", {}), Time.parse("2010-10-01")),
221
+ '2010-10-10.json' => apply_timestamp(Puppet::Node::Facts.new("2010-10-10", {}), Time.parse("2010-10-10")),
222
+ },
223
+ {'meta.timestamp.eq' => '2010-10-15'}
224
+ )
225
+ end
226
+
227
+ it "should be able to query based on meta.timestamp" do
228
+ assert_search_matches({
229
+ '2010-10-15.json' => apply_timestamp(Puppet::Node::Facts.new("2010-10-15", {}), Time.parse("2010-10-15")),
230
+ },
231
+ {
232
+ '2010-11-01.json' => apply_timestamp(Puppet::Node::Facts.new("2010-11-01", {}), Time.parse("2010-11-01")),
233
+ '2010-11-10.json' => apply_timestamp(Puppet::Node::Facts.new("2010-11-10", {}), Time.parse("2010-11-10")),
234
+ '2010-10-01.json' => apply_timestamp(Puppet::Node::Facts.new("2010-10-01", {}), Time.parse("2010-10-01")),
235
+ '2010-10-10.json' => apply_timestamp(Puppet::Node::Facts.new("2010-10-10", {}), Time.parse("2010-10-10")),
236
+ },
237
+ {'meta.timestamp' => '2010-10-15'}
238
+ )
239
+ end
240
+
241
+ it "should be able to query based on meta.timestamp.ne" do
242
+ assert_search_matches({
243
+ '2010-11-01.json' => apply_timestamp(Puppet::Node::Facts.new("2010-11-01", {}), Time.parse("2010-11-01")),
244
+ '2010-11-10.json' => apply_timestamp(Puppet::Node::Facts.new("2010-11-10", {}), Time.parse("2010-11-10")),
245
+ '2010-10-01.json' => apply_timestamp(Puppet::Node::Facts.new("2010-10-01", {}), Time.parse("2010-10-01")),
246
+ '2010-10-10.json' => apply_timestamp(Puppet::Node::Facts.new("2010-10-10", {}), Time.parse("2010-10-10")),
247
+ },
248
+ {
249
+ '2010-10-15.json' => apply_timestamp(Puppet::Node::Facts.new("2010-10-15", {}), Time.parse("2010-10-15")),
250
+ },
251
+ {'meta.timestamp.ne' => '2010-10-15'}
252
+ )
253
+ end
254
+ end
255
+ end
@@ -5,22 +5,40 @@ require 'puppet/indirector/file_bucket_file/file'
5
5
  require 'puppet/indirector/file_bucket_file/rest'
6
6
 
7
7
  describe Puppet::FileBucketFile::Selector do
8
+ let(:model) { Puppet::FileBucket::File.new('') }
9
+ let(:indirection) { Puppet::FileBucket::File.indirection }
10
+ let(:terminus) { indirection.terminus(:selector) }
11
+
8
12
  %w[head find save search destroy].each do |method|
9
13
  describe "##{method}" do
10
14
  it "should proxy to rest terminus for https requests" do
11
- request = double('request', :protocol => 'https')
15
+ key = "https://example.com/path/to/file"
12
16
 
13
- expect_any_instance_of(Puppet::FileBucketFile::Rest).to receive(method).with(request)
17
+ expect(indirection.terminus(:rest)).to receive(method)
14
18
 
15
- subject.send(method, request)
19
+ if method == 'save'
20
+ terminus.send(method, indirection.request(method, key, model))
21
+ else
22
+ terminus.send(method, indirection.request(method, key, nil))
23
+ end
16
24
  end
17
25
 
18
26
  it "should proxy to file terminus for other requests" do
19
- request = double('request', :protocol => 'file')
20
-
21
- expect_any_instance_of(Puppet::FileBucketFile::File).to receive(method).with(request)
22
-
23
- subject.send(method, request)
27
+ key = "file:///path/to/file"
28
+
29
+ case method
30
+ when 'save'
31
+ expect(indirection.terminus(:file)).to receive(method)
32
+ terminus.send(method, indirection.request(method, key, model))
33
+ when 'find', 'head'
34
+ expect(indirection.terminus(:file)).to receive(method)
35
+ terminus.send(method, indirection.request(method, key, nil))
36
+ else
37
+ # file terminus doesn't implement search or destroy
38
+ expect {
39
+ terminus.send(method, indirection.request(method, key, nil))
40
+ }.to raise_error(NoMethodError)
41
+ end
24
42
  end
25
43
  end
26
44
  end
@@ -178,29 +178,25 @@ describe Puppet::Indirector::Indirection do
178
178
 
179
179
  describe "creates a request" do
180
180
  it "should create it with its name as the request's indirection name" do
181
- expect(Puppet::Indirector::Request).to receive(:new).with(@indirection.name, anything, anything)
182
- @indirection.request(:funtest, "yayness")
181
+ expect(@indirection.request(:funtest, "yayness", nil).indirection_name).to eq(@indirection.name)
183
182
  end
184
183
 
185
184
  it "should require a method and key" do
186
- expect(Puppet::Indirector::Request).to receive(:new).with(anything, :funtest, "yayness")
187
- @indirection.request(:funtest, "yayness")
185
+ request = @indirection.request(:funtest, "yayness", nil)
186
+ expect(request.method).to eq(:funtest)
187
+ expect(request.key).to eq("yayness")
188
188
  end
189
189
 
190
190
  it "should support optional arguments" do
191
- expect(Puppet::Indirector::Request).to receive(:new).with(anything, anything, anything, {:one => :two})
192
- @indirection.request(:funtest, "yayness", :one => :two)
191
+ expect(@indirection.request(:funtest, "yayness", nil, :one => :two).options).to eq(:one => :two)
193
192
  end
194
193
 
195
194
  it "should not pass options if none are supplied" do
196
- expect(Puppet::Indirector::Request).to receive(:new).with(anything, anything, anything)
197
- @indirection.request(:funtest, "yayness")
195
+ expect(@indirection.request(:funtest, "yayness", nil).options).to eq({})
198
196
  end
199
197
 
200
198
  it "should return the request" do
201
- request = double('request')
202
- expect(Puppet::Indirector::Request).to receive(:new).and_return(request)
203
- expect(@indirection.request(:funtest, "yayness")).to equal(request)
199
+ expect(@indirection.request(:funtest, "yayness", nil)).to be_a(Puppet::Indirector::Request)
204
200
  end
205
201
  end
206
202
 
@@ -833,7 +829,7 @@ describe Puppet::Indirector::Indirection do
833
829
  end
834
830
 
835
831
  it "should not create a terminus instance until one is actually needed" do
836
- expect(Puppet::Indirector).not_to receive(:terminus)
832
+ expect(@indirection).not_to receive(:terminus)
837
833
  Puppet::Indirector::Indirection.new(double('model'), :lazytest)
838
834
  end
839
835
 
@@ -19,7 +19,6 @@ describe Puppet::SSL::Key::File do
19
19
  allow(Puppet.settings).to receive(:use)
20
20
 
21
21
  @searcher = Puppet::SSL::Key::File.new
22
- allow(@searcher).to receive(:ca?).and_return(false)
23
22
  expect(@searcher.public_key_path("whatever")).to eq(File.expand_path("/public/key/dir/whatever.pem"))
24
23
  end
25
24
  end
@@ -0,0 +1,33 @@
1
+ require 'spec_helper'
2
+ require 'puppet/node'
3
+ require 'puppet/indirector/node/json'
4
+
5
+ describe Puppet::Node::Json do
6
+ describe '#save' do
7
+ subject(:indirection) { described_class.indirection }
8
+
9
+ let(:env) { Puppet::Node::Environment.create(:testing, []) }
10
+ let(:node) { Puppet::Node.new('node_name', :environment => env) }
11
+ let(:file) { File.join(Puppet[:client_datadir], "node", "node_name.json") }
12
+
13
+ before do
14
+ indirection.terminus_class = :json
15
+ end
16
+
17
+ it 'saves the instance of the node as JSON to disk' do
18
+ indirection.save(node)
19
+ json = Puppet::FileSystem.read(file, :encoding => 'bom|utf-8')
20
+ content = Puppet::Util::Json.load(json)
21
+ expect(content["name"]).to eq('node_name')
22
+ end
23
+
24
+ context 'when node cannot be saved' do
25
+ it 'raises Errno::EISDIR' do
26
+ FileUtils.mkdir_p(file)
27
+ expect {
28
+ indirection.save(node)
29
+ }.to raise_error(Errno::EISDIR, /node_name.json/)
30
+ end
31
+ end
32
+ end
33
+ end
@@ -1,9 +1,10 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  require 'puppet/transaction/report'
4
- require 'puppet/indirector/report/yaml'
4
+ require 'puppet/indirector/report/json'
5
5
 
6
- describe Puppet::Transaction::Report::Yaml do
6
+ describe Puppet::Transaction::Report::Json do
7
+ include PuppetSpec::Files
7
8
  describe '#save' do
8
9
  subject(:indirection) { described_class.indirection }
9
10
 
@@ -17,19 +18,17 @@ describe Puppet::Transaction::Report::Yaml do
17
18
  let(:file) { request.path(:me) }
18
19
 
19
20
  before do
20
- indirection.terminus_class = :yaml
21
- end
21
+ Puppet[:lastrunreport] = File.join(Puppet[:statedir], "last_run_report.json")
22
22
 
23
- it 'is saves a report' do
24
- indirection.save(report)
23
+ indirection.terminus_class = :json
25
24
  end
26
25
 
27
- it 'saves the instance of the report as YAML to disk' do
26
+ it 'saves the instance of the report as JSON to disk' do
27
+
28
28
  indirection.save(report)
29
- content = Puppet::Util::Yaml.safe_load_file(
30
- Puppet[:lastrunreport], [Puppet::Transaction::Report]
31
- )
32
- expect(content.host).to eq(certname)
29
+ json = Puppet::FileSystem.read(Puppet[:lastrunreport], :encoding => 'bom|utf-8')
30
+ content = Puppet::Util::Json.load(json)
31
+ expect(content["host"]).to eq(certname)
33
32
  end
34
33
 
35
34
  it 'allows mode overwrite' do
@@ -37,8 +36,7 @@ describe Puppet::Transaction::Report::Yaml do
37
36
  indirection.save(report)
38
37
 
39
38
  if Puppet::Util::Platform.windows?
40
- require 'puppet/util/windows/security'
41
- mode = Puppet::Util::Windows::Security.get_mode(file)
39
+ mode = File.stat(file).mode
42
40
  else
43
41
  mode = Puppet::FileSystem.stat(file).mode
44
42
  end
@@ -62,21 +60,12 @@ describe Puppet::Transaction::Report::Yaml do
62
60
  end
63
61
  end
64
62
 
65
- context 'when repport is invalid' do
66
- it 'logs error' do
67
- expect(Puppet).to receive(:send_log).with(:err, /Could not save yaml ziggy: can't dump anonymous class/)
68
-
69
- report.configuration_version = Class.new
70
- indirection.save(report)
71
- end
72
- end
73
-
74
63
  context 'when report cannot be saved' do
75
- it 'raises Errno::EISDIR' do
64
+ it 'raises Error' do
76
65
  FileUtils.mkdir_p(file)
77
66
  expect {
78
67
  indirection.save(report)
79
- }.to raise_error(Errno::EISDIR, /last_run_report.yaml/)
68
+ }.to raise_error(Errno::EISDIR, /last_run_report.json/)
80
69
  end
81
70
  end
82
71
  end