puppet 6.18.0-x86-mingw32 → 6.21.1-x86-mingw32

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 (276) hide show
  1. checksums.yaml +4 -4
  2. data/CODEOWNERS +2 -16
  3. data/Gemfile +2 -0
  4. data/Gemfile.lock +37 -34
  5. data/README.md +1 -2
  6. data/Rakefile +4 -12
  7. data/lib/puppet/agent/locker.rb +0 -7
  8. data/lib/puppet/application.rb +10 -6
  9. data/lib/puppet/application/agent.rb +9 -3
  10. data/lib/puppet/application/apply.rb +3 -2
  11. data/lib/puppet/application/device.rb +1 -0
  12. data/lib/puppet/application/doc.rb +1 -1
  13. data/lib/puppet/application/filebucket.rb +2 -2
  14. data/lib/puppet/application/lookup.rb +5 -5
  15. data/lib/puppet/application/script.rb +1 -0
  16. data/lib/puppet/application_support.rb +7 -0
  17. data/lib/puppet/configurer.rb +50 -8
  18. data/lib/puppet/defaults.rb +67 -35
  19. data/lib/puppet/environments.rb +84 -59
  20. data/lib/puppet/face/catalog.rb +1 -1
  21. data/lib/puppet/face/config.rb +56 -16
  22. data/lib/puppet/face/epp.rb +12 -2
  23. data/lib/puppet/face/facts.rb +60 -0
  24. data/lib/puppet/face/node.rb +3 -3
  25. data/lib/puppet/face/node/clean.rb +2 -2
  26. data/lib/puppet/face/status.rb +1 -1
  27. data/lib/puppet/ffi/posix.rb +10 -0
  28. data/lib/puppet/ffi/posix/constants.rb +14 -0
  29. data/lib/puppet/ffi/posix/functions.rb +24 -0
  30. data/lib/puppet/file_bucket/dipper.rb +1 -1
  31. data/lib/puppet/functions/epp.rb +1 -0
  32. data/lib/puppet/functions/inline_epp.rb +1 -0
  33. data/lib/puppet/functions/new.rb +8 -3
  34. data/lib/puppet/http.rb +1 -0
  35. data/lib/puppet/http/client.rb +1 -1
  36. data/lib/puppet/http/resolver.rb +5 -8
  37. data/lib/puppet/http/resolver/server_list.rb +18 -36
  38. data/lib/puppet/http/resolver/settings.rb +4 -4
  39. data/lib/puppet/http/resolver/srv.rb +5 -5
  40. data/lib/puppet/http/service.rb +3 -1
  41. data/lib/puppet/http/service/compiler.rb +1 -1
  42. data/lib/puppet/http/service/file_server.rb +1 -1
  43. data/lib/puppet/http/service/puppetserver.rb +39 -0
  44. data/lib/puppet/http/session.rb +5 -4
  45. data/lib/puppet/indirector/catalog/compiler.rb +1 -1
  46. data/lib/puppet/indirector/fact_search.rb +60 -0
  47. data/lib/puppet/indirector/facts/json.rb +27 -0
  48. data/lib/puppet/indirector/facts/yaml.rb +4 -59
  49. data/lib/puppet/indirector/json.rb +5 -1
  50. data/lib/puppet/indirector/msgpack.rb +1 -1
  51. data/lib/puppet/indirector/node/json.rb +8 -0
  52. data/lib/puppet/indirector/report/json.rb +34 -0
  53. data/lib/puppet/indirector/request.rb +4 -4
  54. data/lib/puppet/indirector/yaml.rb +1 -1
  55. data/lib/puppet/module_tool/applications/installer.rb +48 -2
  56. data/lib/puppet/module_tool/errors/shared.rb +17 -2
  57. data/lib/puppet/network/formats.rb +2 -1
  58. data/lib/puppet/network/http/api/master/v3/environments.rb +0 -1
  59. data/lib/puppet/node/facts.rb +17 -0
  60. data/lib/puppet/pal/pal_impl.rb +70 -17
  61. data/lib/puppet/parser/ast/leaf.rb +3 -2
  62. data/lib/puppet/parser/templatewrapper.rb +1 -1
  63. data/lib/puppet/pops/evaluator/collectors/abstract_collector.rb +1 -3
  64. data/lib/puppet/pops/evaluator/deferred_resolver.rb +5 -3
  65. data/lib/puppet/pops/evaluator/evaluator_impl.rb +22 -3
  66. data/lib/puppet/pops/evaluator/runtime3_converter.rb +2 -2
  67. data/lib/puppet/pops/model/ast_transformer.rb +1 -1
  68. data/lib/puppet/pops/types/p_meta_type.rb +1 -1
  69. data/lib/puppet/pops/types/p_type_set_type.rb +4 -0
  70. data/lib/puppet/property/list.rb +1 -1
  71. data/lib/puppet/provider/group/groupadd.rb +13 -8
  72. data/lib/puppet/provider/package/apt.rb +34 -2
  73. data/lib/puppet/provider/package/aptitude.rb +6 -0
  74. data/lib/puppet/provider/package/dpkg.rb +1 -1
  75. data/lib/puppet/provider/package/pip2.rb +17 -0
  76. data/lib/puppet/provider/package/puppetserver_gem.rb +180 -0
  77. data/lib/puppet/provider/package/yum.rb +1 -0
  78. data/lib/puppet/provider/service/debian.rb +2 -0
  79. data/lib/puppet/provider/user/aix.rb +2 -2
  80. data/lib/puppet/provider/user/useradd.rb +62 -8
  81. data/lib/puppet/reference/configuration.rb +6 -5
  82. data/lib/puppet/resource/type.rb +2 -1
  83. data/lib/puppet/rest/route.rb +2 -2
  84. data/lib/puppet/settings.rb +62 -20
  85. data/lib/puppet/settings/alias_setting.rb +37 -0
  86. data/lib/puppet/settings/base_setting.rb +26 -2
  87. data/lib/puppet/transaction/report.rb +11 -7
  88. data/lib/puppet/type/file/source.rb +1 -1
  89. data/lib/puppet/type/filebucket.rb +1 -1
  90. data/lib/puppet/type/package.rb +3 -3
  91. data/lib/puppet/util/autoload.rb +1 -8
  92. data/lib/puppet/util/connection.rb +8 -8
  93. data/lib/puppet/util/fact_dif.rb +62 -0
  94. data/lib/puppet/util/posix.rb +54 -5
  95. data/lib/puppet/util/rubygems.rb +5 -1
  96. data/lib/puppet/util/run_mode.rb +5 -1
  97. data/lib/puppet/util/windows/service.rb +1 -1
  98. data/lib/puppet/version.rb +1 -1
  99. data/locales/puppet.pot +289 -268
  100. data/man/man5/puppet.conf.5 +33 -17
  101. data/man/man8/puppet-agent.8 +7 -4
  102. data/man/man8/puppet-apply.8 +2 -2
  103. data/man/man8/puppet-catalog.8 +1 -1
  104. data/man/man8/puppet-config.8 +6 -6
  105. data/man/man8/puppet-describe.8 +1 -1
  106. data/man/man8/puppet-device.8 +2 -2
  107. data/man/man8/puppet-doc.8 +1 -1
  108. data/man/man8/puppet-epp.8 +1 -1
  109. data/man/man8/puppet-facts.8 +32 -1
  110. data/man/man8/puppet-filebucket.8 +3 -3
  111. data/man/man8/puppet-generate.8 +1 -1
  112. data/man/man8/puppet-help.8 +1 -1
  113. data/man/man8/puppet-key.8 +1 -1
  114. data/man/man8/puppet-lookup.8 +1 -1
  115. data/man/man8/puppet-man.8 +1 -1
  116. data/man/man8/puppet-module.8 +1 -1
  117. data/man/man8/puppet-node.8 +7 -4
  118. data/man/man8/puppet-parser.8 +1 -1
  119. data/man/man8/puppet-plugin.8 +1 -1
  120. data/man/man8/puppet-report.8 +4 -1
  121. data/man/man8/puppet-resource.8 +1 -1
  122. data/man/man8/puppet-script.8 +2 -2
  123. data/man/man8/puppet-ssl.8 +1 -1
  124. data/man/man8/puppet-status.8 +2 -2
  125. data/man/man8/puppet.8 +2 -2
  126. data/spec/fixtures/integration/application/agent/cached_deferred_catalog.json +91 -0
  127. data/spec/fixtures/unit/provider/package/puppetserver_gem/gem-list-local-packages +30 -0
  128. data/spec/fixtures/unit/provider/user/aix/aix_passwd_file.out +4 -0
  129. data/spec/integration/application/agent_spec.rb +183 -22
  130. data/spec/integration/application/apply_spec.rb +19 -0
  131. data/spec/integration/application/filebucket_spec.rb +7 -7
  132. data/spec/integration/application/plugin_spec.rb +3 -3
  133. data/spec/integration/configurer_spec.rb +14 -0
  134. data/spec/integration/defaults_spec.rb +19 -1
  135. data/spec/integration/environments/setting_hooks_spec.rb +1 -1
  136. data/spec/integration/resource/type_collection_spec.rb +2 -6
  137. data/spec/integration/transaction_spec.rb +4 -9
  138. data/spec/integration/util/windows/adsi_spec.rb +5 -3
  139. data/spec/integration/util/windows/registry_spec.rb +0 -10
  140. data/spec/lib/puppet_spec/settings.rb +6 -1
  141. data/spec/shared_contexts/types_setup.rb +2 -0
  142. data/spec/spec_helper.rb +1 -4
  143. data/spec/unit/agent_spec.rb +8 -6
  144. data/spec/unit/application/agent_spec.rb +0 -1
  145. data/spec/unit/application/config_spec.rb +224 -4
  146. data/spec/unit/application/doc_spec.rb +2 -2
  147. data/spec/unit/application/facts_spec.rb +3 -1
  148. data/spec/unit/application/filebucket_spec.rb +0 -2
  149. data/spec/unit/application_spec.rb +60 -13
  150. data/spec/unit/configurer_spec.rb +39 -6
  151. data/spec/unit/confine/feature_spec.rb +1 -1
  152. data/spec/unit/confine_spec.rb +8 -2
  153. data/spec/unit/defaults_spec.rb +20 -1
  154. data/spec/unit/environments_spec.rb +176 -32
  155. data/spec/unit/face/config_spec.rb +62 -11
  156. data/spec/unit/face/node_spec.rb +2 -13
  157. data/spec/unit/file_serving/configuration/parser_spec.rb +0 -1
  158. data/spec/unit/file_serving/metadata_spec.rb +3 -3
  159. data/spec/unit/file_serving/terminus_helper_spec.rb +11 -4
  160. data/spec/unit/file_system_spec.rb +1 -2
  161. data/spec/unit/forge/module_release_spec.rb +2 -7
  162. data/spec/unit/functions/inline_epp_spec.rb +26 -1
  163. data/spec/unit/http/resolver_spec.rb +24 -4
  164. data/spec/unit/http/service/ca_spec.rb +2 -2
  165. data/spec/unit/http/service/compiler_spec.rb +51 -2
  166. data/spec/unit/http/service/file_server_spec.rb +2 -2
  167. data/spec/unit/http/service/puppetserver_spec.rb +82 -0
  168. data/spec/unit/http/service/report_spec.rb +2 -2
  169. data/spec/unit/http/service_spec.rb +1 -1
  170. data/spec/unit/http/session_spec.rb +8 -20
  171. data/spec/unit/indirector/catalog/json_spec.rb +1 -1
  172. data/spec/unit/indirector/catalog/rest_spec.rb +1 -1
  173. data/spec/unit/indirector/face_spec.rb +0 -1
  174. data/spec/unit/indirector/facts/facter_spec.rb +0 -1
  175. data/spec/unit/indirector/facts/json_spec.rb +255 -0
  176. data/spec/unit/indirector/facts/rest_spec.rb +1 -1
  177. data/spec/unit/indirector/file_bucket_file/selector_spec.rb +26 -8
  178. data/spec/unit/indirector/indirection_spec.rb +8 -12
  179. data/spec/unit/indirector/json_spec.rb +8 -8
  180. data/spec/unit/indirector/key/file_spec.rb +0 -1
  181. data/spec/unit/indirector/msgpack_spec.rb +8 -8
  182. data/spec/unit/indirector/node/json_spec.rb +33 -0
  183. data/spec/unit/indirector/node/rest_spec.rb +1 -1
  184. data/spec/{integration/indirector/report/yaml.rb → unit/indirector/report/json_spec.rb} +13 -24
  185. data/spec/unit/indirector/report/yaml_spec.rb +72 -8
  186. data/spec/unit/indirector/request_spec.rb +4 -4
  187. data/spec/unit/indirector/rest_spec.rb +1 -1
  188. data/spec/unit/indirector/status/rest_spec.rb +1 -1
  189. data/spec/unit/indirector/yaml_spec.rb +7 -7
  190. data/spec/unit/indirector_spec.rb +2 -2
  191. data/spec/unit/module_tool/applications/installer_spec.rb +66 -0
  192. data/spec/unit/network/authconfig_spec.rb +0 -3
  193. data/spec/unit/network/http/api/indirected_routes_spec.rb +0 -9
  194. data/spec/unit/network/http/api/master/v3/environments_spec.rb +12 -23
  195. data/spec/unit/network/http/handler_spec.rb +0 -5
  196. data/spec/unit/parser/compiler_spec.rb +3 -19
  197. data/spec/unit/parser/resource_spec.rb +14 -8
  198. data/spec/unit/parser/templatewrapper_spec.rb +4 -3
  199. data/spec/unit/pops/evaluator/deferred_resolver_spec.rb +20 -0
  200. data/spec/unit/property_spec.rb +1 -0
  201. data/spec/unit/provider/exec_spec.rb +4 -3
  202. data/spec/unit/provider/group/groupadd_spec.rb +5 -2
  203. data/spec/unit/provider/nameservice_spec.rb +66 -65
  204. data/spec/unit/provider/package/apt_spec.rb +28 -23
  205. data/spec/unit/provider/package/aptitude_spec.rb +1 -1
  206. data/spec/unit/provider/package/base_spec.rb +6 -5
  207. data/spec/unit/provider/package/dpkg_spec.rb +22 -7
  208. data/spec/unit/provider/package/openbsd_spec.rb +2 -0
  209. data/spec/unit/provider/package/pacman_spec.rb +18 -12
  210. data/spec/unit/provider/package/pip2_spec.rb +36 -0
  211. data/spec/unit/provider/package/pip_spec.rb +6 -11
  212. data/spec/unit/provider/package/pkgdmg_spec.rb +0 -4
  213. data/spec/unit/provider/package/puppetserver_gem_spec.rb +137 -0
  214. data/spec/unit/provider/package/yum_spec.rb +31 -0
  215. data/spec/unit/provider/service/base_spec.rb +2 -4
  216. data/spec/unit/provider/service/bsd_spec.rb +5 -1
  217. data/spec/unit/provider/service/daemontools_spec.rb +1 -1
  218. data/spec/unit/provider/service/debian_spec.rb +3 -5
  219. data/spec/unit/provider/service/freebsd_spec.rb +1 -1
  220. data/spec/unit/provider/service/gentoo_spec.rb +4 -5
  221. data/spec/unit/provider/service/init_spec.rb +4 -5
  222. data/spec/unit/provider/service/launchd_spec.rb +5 -6
  223. data/spec/unit/provider/service/openrc_spec.rb +4 -5
  224. data/spec/unit/provider/service/openwrt_spec.rb +1 -1
  225. data/spec/unit/provider/service/redhat_spec.rb +1 -1
  226. data/spec/unit/provider/service/runit_spec.rb +2 -1
  227. data/spec/unit/provider/service/smf_spec.rb +1 -1
  228. data/spec/unit/provider/service/src_spec.rb +3 -5
  229. data/spec/unit/provider/service/systemd_spec.rb +3 -1
  230. data/spec/unit/provider/service/upstart_spec.rb +4 -5
  231. data/spec/unit/provider/user/aix_spec.rb +5 -0
  232. data/spec/unit/provider/user/hpux_spec.rb +1 -1
  233. data/spec/unit/provider/user/pw_spec.rb +2 -0
  234. data/spec/unit/provider/user/useradd_spec.rb +56 -3
  235. data/spec/unit/provider_spec.rb +8 -10
  236. data/spec/unit/puppet_pal_catalog_spec.rb +45 -0
  237. data/spec/unit/resource/capability_finder_spec.rb +6 -1
  238. data/spec/unit/resource/type_spec.rb +1 -1
  239. data/spec/unit/resource_spec.rb +11 -10
  240. data/spec/unit/rest/route_spec.rb +4 -4
  241. data/spec/unit/settings_spec.rb +576 -239
  242. data/spec/unit/ssl/base_spec.rb +0 -1
  243. data/spec/unit/ssl/host_spec.rb +0 -5
  244. data/spec/unit/ssl/ssl_provider_spec.rb +14 -8
  245. data/spec/unit/transaction/additional_resource_generator_spec.rb +3 -7
  246. data/spec/unit/transaction/event_manager_spec.rb +14 -11
  247. data/spec/unit/transaction/report_spec.rb +2 -0
  248. data/spec/unit/transaction_spec.rb +13 -4
  249. data/spec/unit/type/file/content_spec.rb +0 -1
  250. data/spec/unit/type/file/selinux_spec.rb +0 -2
  251. data/spec/unit/type/file/source_spec.rb +1 -1
  252. data/spec/unit/type/file_spec.rb +0 -6
  253. data/spec/unit/type/filebucket_spec.rb +1 -1
  254. data/spec/unit/type/group_spec.rb +13 -6
  255. data/spec/unit/type/resources_spec.rb +7 -7
  256. data/spec/unit/type/service_spec.rb +1 -1
  257. data/spec/unit/type/tidy_spec.rb +0 -1
  258. data/spec/unit/type_spec.rb +2 -2
  259. data/spec/unit/util/at_fork_spec.rb +2 -2
  260. data/spec/unit/util/autoload_spec.rb +5 -1
  261. data/spec/unit/util/backups_spec.rb +1 -2
  262. data/spec/unit/util/execution_spec.rb +15 -11
  263. data/spec/unit/util/inifile_spec.rb +6 -14
  264. data/spec/unit/util/log_spec.rb +8 -7
  265. data/spec/unit/util/logging_spec.rb +3 -3
  266. data/spec/unit/util/posix_spec.rb +363 -15
  267. data/spec/unit/util/rubygems_spec.rb +2 -2
  268. data/spec/unit/util/run_mode_spec.rb +6 -6
  269. data/spec/unit/util/selinux_spec.rb +76 -52
  270. data/spec/unit/util/storage_spec.rb +3 -1
  271. data/spec/unit/util/suidmanager_spec.rb +44 -41
  272. data/spec/unit/util_spec.rb +13 -6
  273. metadata +32 -10
  274. data/spec/integration/application/config_spec.rb +0 -74
  275. data/spec/unit/face/catalog_spec.rb +0 -6
  276. data/spec/unit/face/module_spec.rb +0 -3
@@ -138,7 +138,7 @@ trace = true
138
138
  Puppet[:log_level] = 'info'
139
139
  allow(Puppet::FileSystem).to receive(:open).with(path, anything, anything).and_yield(StringIO.new)
140
140
  expect {
141
- subject.set('foo', 'bar')
141
+ subject.set('certname', 'bar')
142
142
  }.to output("\e[1;33mResolving settings from section 'main' in environment 'production'\e[0m\n").to_stderr
143
143
  end
144
144
 
@@ -146,19 +146,19 @@ trace = true
146
146
  Puppet[:log_level] = 'info'
147
147
  allow(Puppet::FileSystem).to receive(:open).with(path, anything, anything).and_yield(StringIO.new)
148
148
  expect {
149
- subject.set('foo', 'bar', {:section => "baz"})
149
+ subject.set('certname', 'bar', {:section => "baz"})
150
150
  }.to output("\e[1;33mResolving settings from section 'baz' in environment 'production'\e[0m\n").to_stderr
151
151
  end
152
152
 
153
153
  it "writes to the correct puppet config file" do
154
154
  expect(Puppet::FileSystem).to receive(:open).with(path, anything, anything)
155
- subject.set('foo', 'bar')
155
+ subject.set('certname', 'bar')
156
156
  end
157
157
 
158
158
  it "creates a config file if one does not exist" do
159
159
  allow(Puppet::FileSystem).to receive(:open).with(path, anything, anything).and_yield(StringIO.new)
160
160
  expect(Puppet::FileSystem).to receive(:touch).with(path)
161
- subject.set('foo', 'bar')
161
+ subject.set('certname', 'bar')
162
162
  end
163
163
 
164
164
  it "sets the supplied config/value in the default section (main)" do
@@ -167,8 +167,8 @@ trace = true
167
167
  manipulator = Puppet::Settings::IniFile::Manipulator.new(config)
168
168
  allow(Puppet::Settings::IniFile::Manipulator).to receive(:new).and_return(manipulator)
169
169
 
170
- expect(manipulator).to receive(:set).with("main", "foo", "bar")
171
- subject.set('foo', 'bar')
170
+ expect(manipulator).to receive(:set).with("main", "certname", "bar")
171
+ subject.set('certname', 'bar')
172
172
  end
173
173
 
174
174
  it "sets the value in the supplied section" do
@@ -177,8 +177,8 @@ trace = true
177
177
  manipulator = Puppet::Settings::IniFile::Manipulator.new(config)
178
178
  allow(Puppet::Settings::IniFile::Manipulator).to receive(:new).and_return(manipulator)
179
179
 
180
- expect(manipulator).to receive(:set).with("baz", "foo", "bar")
181
- subject.set('foo', 'bar', {:section => "baz"})
180
+ expect(manipulator).to receive(:set).with("baz", "certname", "bar")
181
+ subject.set('certname', 'bar', {:section => "baz"})
182
182
  end
183
183
 
184
184
  it "does not duplicate an existing default section when a section is not specified" do
@@ -190,15 +190,48 @@ trace = true
190
190
  myfile = StringIO.new(contents)
191
191
  allow(Puppet::FileSystem).to receive(:open).with(path, anything, anything).and_yield(myfile)
192
192
 
193
- subject.set('foo', 'bar')
193
+ subject.set('certname', 'bar')
194
194
 
195
- expect(myfile.string).to match(/foo = bar/)
195
+ expect(myfile.string).to match(/certname = bar/)
196
196
  expect(myfile.string).not_to match(/main.*main/)
197
197
  end
198
198
 
199
199
  it "opens the file with UTF-8 encoding" do
200
200
  expect(Puppet::FileSystem).to receive(:open).with(path, nil, 'r+:UTF-8')
201
- subject.set('foo', 'bar')
201
+ subject.set('certname', 'bar')
202
+ end
203
+
204
+ it "sets settings into the [server] section when setting [master] section settings" do
205
+ initial_contents = <<~CONFIG
206
+ [master]
207
+ node_terminus = none
208
+ reports = log
209
+ CONFIG
210
+
211
+ myinitialfile = StringIO.new(initial_contents)
212
+ allow(Puppet::FileSystem).to receive(:open).with(path, anything, anything).and_yield(myinitialfile)
213
+
214
+ expect {
215
+ subject.set('node_terminus', 'exec', {:section => 'master'})
216
+ }.to output("Deleted setting from 'master': 'node_terminus = none', and adding it to 'server' section\n").to_stdout
217
+
218
+ expect(myinitialfile.string).to match(<<~CONFIG)
219
+ [master]
220
+ reports = log
221
+ [server]
222
+ node_terminus = exec
223
+ CONFIG
224
+ end
225
+
226
+ it "setting [master] section settings, sets settings into [server] section instead" do
227
+ myinitialfile = StringIO.new("")
228
+ allow(Puppet::FileSystem).to receive(:open).with(path, anything, anything).and_yield(myinitialfile)
229
+ subject.set('node_terminus', 'exec', {:section => 'master'})
230
+
231
+ expect(myinitialfile.string).to match(<<~CONFIG)
232
+ [server]
233
+ node_terminus = exec
234
+ CONFIG
202
235
  end
203
236
  end
204
237
 
@@ -249,6 +282,24 @@ trace = true
249
282
  expect(Puppet).to receive(:warning).with("No setting found in configuration file for section 'main' setting name 'setting'")
250
283
  subject.delete('setting', {:section => 'main'})
251
284
  end
285
+
286
+ ['master', 'server'].each do |section|
287
+ describe "when deleting from [#{section}] section" do
288
+ it "deletes section values from both [server] and [master] sections" do
289
+ allow(Puppet::FileSystem).to receive(:open).with(path, anything, anything).and_yield(StringIO.new)
290
+ config = Puppet::Settings::IniFile.new([Puppet::Settings::IniFile::DefaultSection.new])
291
+ manipulator = Puppet::Settings::IniFile::Manipulator.new(config)
292
+ allow(Puppet::Settings::IniFile::Manipulator).to receive(:new).and_return(manipulator)
293
+
294
+ expect(manipulator).to receive(:delete).with('master', 'setting').and_return('setting=value')
295
+ expect(manipulator).to receive(:delete).with('server', 'setting').and_return('setting=value')
296
+ expect {
297
+ subject.delete('setting', {:section => section})
298
+ }.to output(/Deleted setting from 'master': 'setting'\nDeleted setting from 'server': 'setting'\n/).to_stdout
299
+ end
300
+ end
301
+ end
302
+
252
303
  end
253
304
 
254
305
  shared_examples_for :config_printing_a_section do |section|
@@ -15,13 +15,6 @@ describe Puppet::Face[:node, '0.0.1'] do
15
15
  end
16
16
 
17
17
  describe 'when running #clean' do
18
- before :each do
19
- allow(Puppet::Node::Facts.indirection).to receive(:terminus_class=)
20
- allow(Puppet::Node::Facts.indirection).to receive(:cache_class=)
21
- allow(Puppet::Node).to receive(:terminus_class=)
22
- allow(Puppet::Node).to receive(:cache_class=)
23
- end
24
-
25
18
  it 'should invoke #cleanup' do
26
19
  expect(subject).to receive(:cleanup).with('hostname')
27
20
  subject.clean('hostname')
@@ -30,10 +23,6 @@ describe Puppet::Face[:node, '0.0.1'] do
30
23
 
31
24
  describe "clean action" do
32
25
  before :each do
33
- allow(Puppet::Node::Facts.indirection).to receive(:terminus_class=)
34
- allow(Puppet::Node::Facts.indirection).to receive(:cache_class=)
35
- allow(Puppet::Node).to receive(:terminus_class=)
36
- allow(Puppet::Node).to receive(:cache_class=)
37
26
  allow(subject).to receive(:cleanup)
38
27
  end
39
28
 
@@ -74,9 +63,9 @@ describe Puppet::Face[:node, '0.0.1'] do
74
63
  subject.clean('hostname')
75
64
  end
76
65
 
77
- it "should run in master mode" do
66
+ it "should run in server mode" do
78
67
  subject.clean('hostname')
79
- expect(Puppet.run_mode).to be_master
68
+ expect(Puppet.run_mode).to be_server
80
69
  end
81
70
 
82
71
  it "should set node cache as yaml" do
@@ -87,7 +87,6 @@ describe Puppet::FileServing::Configuration::Parser do
87
87
  before do
88
88
  @mount = double('testmount', :name => "one", :validate => true)
89
89
  expect(Puppet::FileServing::Mount::File).to receive(:new).with("one").and_return(@mount)
90
- allow(@parser).to receive(:add_modules_mount)
91
90
  end
92
91
 
93
92
  it "should set the mount path to the path attribute from that section" do
@@ -266,9 +266,9 @@ describe Puppet::FileServing::Metadata, :uses_checksums => true do
266
266
  path = tmpfile('bar')
267
267
  FileUtils.touch(path)
268
268
 
269
- allow(Puppet::Util::Windows::Security).to receive(:get_owner).with(path, :use).and_raise(invalid_error)
270
- allow(Puppet::Util::Windows::Security).to receive(:get_group).with(path, :use).and_raise(invalid_error)
271
- allow(Puppet::Util::Windows::Security).to receive(:get_mode).with(path, :use).and_raise(invalid_error)
269
+ allow(Puppet::Util::Windows::Security).to receive(:get_owner).with(path).and_raise(invalid_error)
270
+ allow(Puppet::Util::Windows::Security).to receive(:get_group).with(path).and_raise(invalid_error)
271
+ allow(Puppet::Util::Windows::Security).to receive(:get_mode).with(path).and_raise(invalid_error)
272
272
 
273
273
  stat = Puppet::FileSystem.stat(path)
274
274
 
@@ -2,13 +2,20 @@ require 'spec_helper'
2
2
 
3
3
  require 'puppet/file_serving/terminus_helper'
4
4
 
5
+ class Puppet::FileServing::TestHelper
6
+ include Puppet::FileServing::TerminusHelper
7
+
8
+ attr_reader :model
9
+
10
+ def initialize(model)
11
+ @model = model
12
+ end
13
+ end
14
+
5
15
  describe Puppet::FileServing::TerminusHelper do
6
16
  before do
7
- @helper = Object.new
8
- @helper.extend(Puppet::FileServing::TerminusHelper)
9
-
10
17
  @model = double('model')
11
- allow(@helper).to receive(:model).and_return(@model)
18
+ @helper = Puppet::FileServing::TestHelper.new(@model)
12
19
 
13
20
  @request = double('request', :key => "url", :options => {})
14
21
 
@@ -872,8 +872,7 @@ describe "Puppet::FileSystem" do
872
872
 
873
873
  # regardless of slash direction, return value is drive letter
874
874
  expanded = Puppet::FileSystem.expand_path(slash)
875
- expect(expanded).to eq(ENV['SystemDrive'] + File::SEPARATOR)
876
- expect(expanded).to eq(File.expand_path(slash))
875
+ expect(expanded).to match(/^[a-z]:/i)
877
876
  end
878
877
  end
879
878
 
@@ -22,13 +22,8 @@ describe Puppet::Forge::ModuleRelease do
22
22
  let(:uri) { " "}
23
23
  let(:release) { Puppet::Forge::ModuleRelease.new(ssl_repository, JSON.parse(release_json)) }
24
24
 
25
- let(:mock_file) {
26
- mock_io = StringIO.new
27
- allow(mock_io).to receive(:path).and_return('/dev/null')
28
- mock_io
29
- }
30
-
31
- let(:mock_dir) { '/tmp' }
25
+ let(:mock_file) { double('file', path: '/dev/null') }
26
+ let(:mock_dir) { tmpdir('dir') }
32
27
 
33
28
  let(:destination) { tmpfile('forge_module_release') }
34
29
 
@@ -1,8 +1,10 @@
1
-
2
1
  require 'spec_helper'
3
2
 
3
+ require 'puppet_spec/compiler'
4
+
4
5
  describe "the inline_epp function" do
5
6
  include PuppetSpec::Files
7
+ include PuppetSpec::Compiler
6
8
 
7
9
  let :node do Puppet::Node.new('localhost') end
8
10
  let :compiler do Puppet::Parser::Compiler.new(node) end
@@ -73,6 +75,29 @@ describe "the inline_epp function" do
73
75
  expect(eval_template("string was: <%= $string %>")).to eq("string was: the string value")
74
76
  end
75
77
 
78
+ context "when using Sensitive" do
79
+ it "returns an unwrapped sensitive value as a String" do
80
+ expect(eval_and_collect_notices(<<~END)).to eq(["opensesame"])
81
+ notice(inline_epp("<%= Sensitive('opensesame').unwrap %>"))
82
+ END
83
+ end
84
+
85
+ it "rewraps a sensitive value" do
86
+ # note entire result is redacted, not just sensitive part
87
+ expect(eval_and_collect_notices(<<~END)).to eq(["Sensitive [value redacted]"])
88
+ notice(inline_epp("This is sensitive <%= Sensitive('opensesame') %>"))
89
+ END
90
+ end
91
+
92
+ it "can be double wrapped" do
93
+ catalog = compile_to_catalog(<<~END)
94
+ notify { 'title':
95
+ message => Sensitive(inline_epp("<%= Sensitive('opensesame') %>"))
96
+ }
97
+ END
98
+ expect(catalog.resource(:notify, 'title')['message']).to eq('opensesame')
99
+ end
100
+ end
76
101
 
77
102
  def eval_template_with_args(content, args_hash)
78
103
  epp_function.call(scope, content, args_hash)
@@ -43,9 +43,25 @@ describe Puppet::HTTP::Resolver do
43
43
  expect(service.url.to_s).to eq("https://ca.example.com:8141/puppet-ca/v1")
44
44
  end
45
45
 
46
- it 'logs unsuccessful HTTP 500 responses' do
47
- Puppet[:log_level] = "debug"
46
+ it 'includes extra http headers' do
47
+ Puppet[:http_extra_headers] = 'region:us-west'
48
+
49
+ stub_request(:get, "https://ca.example.com:8141/status/v1/simple/master")
50
+ .with(headers: {'Region' => 'us-west'})
51
+
52
+ subject.resolve(session, :ca)
53
+ end
54
+
55
+ it 'uses the provided ssl context during resolution' do
56
+ stub_request(:get, "https://ca.example.com:8141/status/v1/simple/master").to_return(status: 200)
57
+
58
+ other_ctx = Puppet::SSL::SSLContext.new
59
+ expect(client).to receive(:connect).with(URI("https://ca.example.com:8141/status/v1/simple/master"), options: {ssl_context: other_ctx}).and_call_original
60
+
61
+ subject.resolve(session, :ca, ssl_context: other_ctx)
62
+ end
48
63
 
64
+ it 'logs unsuccessful HTTP 500 responses' do
49
65
  stub_request(:get, "https://ca.example.com:8141/status/v1/simple/master").to_return(status: [500, 'Internal Server Error'])
50
66
  stub_request(:get, "https://apple.example.com:8142/status/v1/simple/master").to_return(status: 200)
51
67
 
@@ -54,11 +70,15 @@ describe Puppet::HTTP::Resolver do
54
70
  expect(@logs.map(&:message)).to include(/Puppet server ca.example.com:8141 is unavailable: 500 Internal Server Error/)
55
71
  end
56
72
 
57
- it 'fails if no servers in server_list are accessible' do
73
+ it 'cancels resolution if no servers in server_list are accessible' do
58
74
  stub_request(:get, "https://ca.example.com:8141/status/v1/simple/master").to_return(status: 503)
59
75
  stub_request(:get, "https://apple.example.com:8142/status/v1/simple/master").to_return(status: 503)
60
76
 
61
- expect { subject.resolve(session, :ca) }.to raise_error(Puppet::Error, /^Could not select a functional puppet master from server_list:/)
77
+ canceled = false
78
+ canceled_handler = lambda { |cancel| canceled = cancel }
79
+
80
+ expect(subject.resolve(session, :ca, canceled_handler: canceled_handler)).to eq(nil)
81
+ expect(canceled).to eq(true)
62
82
  end
63
83
 
64
84
  it 'cycles through server_list until a valid server is found' do
@@ -38,11 +38,11 @@ describe Puppet::HTTP::Service::Ca do
38
38
  subject.get_certificate('ca')
39
39
  end
40
40
 
41
- it 'fallbacks to server and masterport' do
41
+ it 'fallbacks to server and serverport' do
42
42
  Puppet[:ca_server] = nil
43
43
  Puppet[:ca_port] = nil
44
44
  Puppet[:server] = 'ca2.example.com'
45
- Puppet[:masterport] = 8142
45
+ Puppet[:serverport] = 8142
46
46
 
47
47
  stub_request(:get, "https://ca2.example.com:8142/puppet-ca/v1/certificate/ca").to_return(body: pem)
48
48
 
@@ -16,7 +16,7 @@ describe Puppet::HTTP::Service::Compiler do
16
16
 
17
17
  before :each do
18
18
  Puppet[:server] = 'compiler.example.com'
19
- Puppet[:masterport] = 8140
19
+ Puppet[:serverport] = 8140
20
20
 
21
21
  Puppet::Node::Facts.indirection.terminus_class = :memory
22
22
  end
@@ -37,7 +37,7 @@ describe Puppet::HTTP::Service::Compiler do
37
37
  context 'when routing to the compiler service' do
38
38
  it 'defaults the server and port based on settings' do
39
39
  Puppet[:server] = 'compiler2.example.com'
40
- Puppet[:masterport] = 8141
40
+ Puppet[:serverport] = 8141
41
41
 
42
42
  stub_request(:post, "https://compiler2.example.com:8141/puppet/v3/catalog/ziggy?environment=testing")
43
43
  .to_return(body: formatter.render(catalog), headers: {'Content-Type' => formatter.mime })
@@ -131,6 +131,26 @@ describe Puppet::HTTP::Service::Compiler do
131
131
  subject.post_catalog(certname, environment: 'production', facts: facts, checksum_type: %w[sha256 sha384])
132
132
  end
133
133
 
134
+ it 'does not accept msgpack by default' do
135
+ stub_request(:post, uri)
136
+ .with(headers: {'Accept' => 'application/vnd.puppet.rich+json, application/json, text/pson'})
137
+ .to_return(**catalog_response)
138
+
139
+ allow(Puppet.features).to receive(:msgpack?).and_return(false)
140
+
141
+ subject.post_catalog(certname, environment: environment, facts: facts)
142
+ end
143
+
144
+ it 'accepts msgpack & rich_json_msgpack if the gem is present' do
145
+ stub_request(:post, uri)
146
+ .with(headers: {'Accept' => 'application/vnd.puppet.rich+json, application/json, application/vnd.puppet.rich+msgpack, application/x-msgpack, text/pson'})
147
+ .to_return(**catalog_response)
148
+
149
+ allow(Puppet.features).to receive(:msgpack?).and_return(true)
150
+
151
+ subject.post_catalog(certname, environment: environment, facts: facts)
152
+ end
153
+
134
154
  it 'returns a deserialized catalog' do
135
155
  stub_request(:post, uri)
136
156
  .to_return(**catalog_response)
@@ -140,6 +160,35 @@ describe Puppet::HTTP::Service::Compiler do
140
160
  expect(cat.name).to eq(certname)
141
161
  end
142
162
 
163
+ it 'deserializes the catalog from msgpack', if: Puppet.features.msgpack? do
164
+ body = catalog.to_msgpack
165
+ formatter = Puppet::Network::FormatHandler.format(:msgpack)
166
+ catalog_response = { body: body, headers: {'Content-Type' => formatter.mime }}
167
+
168
+ stub_request(:post, uri)
169
+ .to_return(**catalog_response)
170
+
171
+ _, cat = subject.post_catalog(certname, environment: 'production', facts: facts)
172
+ expect(cat).to be_a(Puppet::Resource::Catalog)
173
+ expect(cat.name).to eq(certname)
174
+ end
175
+
176
+ it 'deserializes the catalog from rich msgpack', if: Puppet.features.msgpack? do
177
+ body = Puppet.override(rich_data: true) do
178
+ catalog.to_msgpack
179
+ end
180
+
181
+ formatter = Puppet::Network::FormatHandler.format(:rich_data_msgpack)
182
+ catalog_response = { body: body, headers: {'Content-Type' => formatter.mime }}
183
+
184
+ stub_request(:post, uri)
185
+ .to_return(**catalog_response)
186
+
187
+ _, cat = subject.post_catalog(certname, environment: 'production', facts: facts)
188
+ expect(cat).to be_a(Puppet::Resource::Catalog)
189
+ expect(cat.name).to eq(certname)
190
+ end
191
+
143
192
  it 'returns the request response' do
144
193
  stub_request(:post, uri)
145
194
  .to_return(**catalog_response)
@@ -12,7 +12,7 @@ describe Puppet::HTTP::Service::FileServer do
12
12
 
13
13
  before :each do
14
14
  Puppet[:server] = 'www.example.com'
15
- Puppet[:masterport] = 443
15
+ Puppet[:serverport] = 443
16
16
  end
17
17
 
18
18
  context 'when making requests' do
@@ -31,7 +31,7 @@ describe Puppet::HTTP::Service::FileServer do
31
31
  context 'when routing to the file service' do
32
32
  it 'defaults the server and port based on settings' do
33
33
  Puppet[:server] = 'file.example.com'
34
- Puppet[:masterport] = 8141
34
+ Puppet[:serverport] = 8141
35
35
 
36
36
  stub_request(:get, "https://file.example.com:8141/puppet/v3/file_content/:mount/:path?environment=testing")
37
37
 
@@ -0,0 +1,82 @@
1
+ require 'spec_helper'
2
+ require 'puppet/http'
3
+
4
+ describe Puppet::HTTP::Service::Puppetserver do
5
+ let(:ssl_context) { Puppet::SSL::SSLContext.new }
6
+ let(:client) { Puppet::HTTP::Client.new(ssl_context: ssl_context) }
7
+ let(:subject) { client.create_session.route_to(:puppetserver) }
8
+
9
+ before :each do
10
+ Puppet[:server] = 'puppetserver.example.com'
11
+ end
12
+
13
+ context 'when making requests' do
14
+ it 'includes default HTTP headers' do
15
+ stub_request(:get, "https://puppetserver.example.com:8140/status/v1/simple/master").with do |request|
16
+ expect(request.headers).to include({'X-Puppet-Version' => /./, 'User-Agent' => /./})
17
+ expect(request.headers).to_not include('X-Puppet-Profiling')
18
+ end.to_return(body: "running", headers: {'Content-Type' => 'text/plain;charset=utf-8'})
19
+
20
+ subject.get_simple_status
21
+ end
22
+
23
+ it 'includes extra headers' do
24
+ Puppet[:http_extra_headers] = 'region:us-west'
25
+
26
+ stub_request(:get, "https://puppetserver.example.com:8140/status/v1/simple/master")
27
+ .with(headers: {'Region' => 'us-west'})
28
+ .to_return(body: "running", headers: {'Content-Type' => 'text/plain;charset=utf-8'})
29
+
30
+ subject.get_simple_status
31
+ end
32
+ end
33
+
34
+ context 'when routing to the puppetserver service' do
35
+ it 'defaults the server and port based on settings' do
36
+ Puppet[:server] = 'compiler2.example.com'
37
+ Puppet[:serverport] = 8141
38
+
39
+ stub_request(:get, "https://compiler2.example.com:8141/status/v1/simple/master")
40
+ .to_return(body: "running", headers: {'Content-Type' => 'text/plain;charset=utf-8'})
41
+
42
+ subject.get_simple_status
43
+ end
44
+ end
45
+
46
+ context 'when getting puppetserver status' do
47
+ let(:url) { "https://puppetserver.example.com:8140/status/v1/simple/master" }
48
+
49
+ it 'returns the request response and status' do
50
+ stub_request(:get, url)
51
+ .to_return(body: "running", headers: {'Content-Type' => 'text/plain;charset=utf-8'})
52
+
53
+ resp, status = subject.get_simple_status
54
+ expect(resp).to be_a(Puppet::HTTP::Response)
55
+ expect(status).to eq('running')
56
+ end
57
+
58
+ it 'raises a response error if unsuccessful' do
59
+ stub_request(:get, url).to_return(status: [500, 'Internal Server Error'])
60
+
61
+ expect {
62
+ subject.get_simple_status
63
+ }.to raise_error do |err|
64
+ expect(err).to be_an_instance_of(Puppet::HTTP::ResponseError)
65
+ expect(err.message).to eq("Internal Server Error")
66
+ expect(err.response.code).to eq(500)
67
+ end
68
+ end
69
+
70
+ it 'accepts an ssl context' do
71
+ stub_request(:get, url)
72
+ .to_return(body: "running", headers: {'Content-Type' => 'text/plain;charset=utf-8'})
73
+
74
+ other_ctx = Puppet::SSL::SSLContext.new
75
+ expect(client).to receive(:connect).with(URI(url), options: {ssl_context: other_ctx}).and_call_original
76
+
77
+ session = client.create_session
78
+ service = Puppet::HTTP::Service.create_service(client, session, :puppetserver, 'puppetserver.example.com', 8140)
79
+ service.get_simple_status(ssl_context: other_ctx)
80
+ end
81
+ end
82
+ end