puppet 6.19.1-x64-mingw32 → 6.23.0-x64-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 (293) hide show
  1. checksums.yaml +4 -4
  2. data/CODEOWNERS +2 -16
  3. data/Gemfile +3 -1
  4. data/Gemfile.lock +51 -40
  5. data/ext/osx/puppet.plist +2 -0
  6. data/ext/project_data.yaml +2 -2
  7. data/lib/puppet/application.rb +10 -6
  8. data/lib/puppet/application/agent.rb +12 -4
  9. data/lib/puppet/application/apply.rb +4 -2
  10. data/lib/puppet/application/device.rb +2 -0
  11. data/lib/puppet/application/filebucket.rb +2 -2
  12. data/lib/puppet/application/resource.rb +2 -1
  13. data/lib/puppet/application/script.rb +2 -0
  14. data/lib/puppet/application/ssl.rb +11 -0
  15. data/lib/puppet/application_support.rb +7 -0
  16. data/lib/puppet/configurer.rb +28 -18
  17. data/lib/puppet/configurer/downloader.rb +2 -1
  18. data/lib/puppet/defaults.rb +51 -23
  19. data/lib/puppet/environments.rb +54 -55
  20. data/lib/puppet/face/config.rb +10 -0
  21. data/lib/puppet/face/epp.rb +12 -2
  22. data/lib/puppet/face/facts.rb +158 -0
  23. data/lib/puppet/ffi/posix.rb +10 -0
  24. data/lib/puppet/ffi/posix/constants.rb +14 -0
  25. data/lib/puppet/ffi/posix/functions.rb +24 -0
  26. data/lib/puppet/file_serving/fileset.rb +14 -2
  27. data/lib/puppet/file_system/memory_file.rb +8 -1
  28. data/lib/puppet/file_system/windows.rb +2 -0
  29. data/lib/puppet/functions/all.rb +1 -1
  30. data/lib/puppet/functions/camelcase.rb +1 -1
  31. data/lib/puppet/functions/capitalize.rb +2 -2
  32. data/lib/puppet/functions/downcase.rb +2 -2
  33. data/lib/puppet/functions/epp.rb +1 -0
  34. data/lib/puppet/functions/get.rb +5 -5
  35. data/lib/puppet/functions/group_by.rb +13 -5
  36. data/lib/puppet/functions/inline_epp.rb +1 -0
  37. data/lib/puppet/functions/lest.rb +1 -1
  38. data/lib/puppet/functions/new.rb +100 -100
  39. data/lib/puppet/functions/partition.rb +12 -4
  40. data/lib/puppet/functions/require.rb +5 -5
  41. data/lib/puppet/functions/sort.rb +3 -3
  42. data/lib/puppet/functions/tree_each.rb +7 -9
  43. data/lib/puppet/functions/type.rb +4 -4
  44. data/lib/puppet/functions/upcase.rb +2 -2
  45. data/lib/puppet/http/resolver/server_list.rb +15 -4
  46. data/lib/puppet/http/service/compiler.rb +69 -0
  47. data/lib/puppet/http/service/file_server.rb +2 -1
  48. data/lib/puppet/indirector/catalog/compiler.rb +1 -0
  49. data/lib/puppet/indirector/fact_search.rb +60 -0
  50. data/lib/puppet/indirector/facts/facter.rb +24 -3
  51. data/lib/puppet/indirector/facts/json.rb +27 -0
  52. data/lib/puppet/indirector/facts/yaml.rb +3 -58
  53. data/lib/puppet/indirector/file_metadata/rest.rb +1 -0
  54. data/lib/puppet/indirector/json.rb +5 -1
  55. data/lib/puppet/indirector/node/json.rb +8 -0
  56. data/lib/puppet/indirector/report/json.rb +34 -0
  57. data/lib/puppet/module_tool/applications/installer.rb +48 -2
  58. data/lib/puppet/module_tool/errors/shared.rb +17 -2
  59. data/lib/puppet/network/formats.rb +69 -1
  60. data/lib/puppet/network/http/factory.rb +4 -0
  61. data/lib/puppet/pal/pal_impl.rb +70 -17
  62. data/lib/puppet/parser/ast/leaf.rb +3 -2
  63. data/lib/puppet/parser/functions/fqdn_rand.rb +14 -6
  64. data/lib/puppet/parser/templatewrapper.rb +1 -1
  65. data/lib/puppet/pops/evaluator/deferred_resolver.rb +5 -3
  66. data/lib/puppet/pops/evaluator/evaluator_impl.rb +22 -3
  67. data/lib/puppet/pops/model/ast_transformer.rb +1 -1
  68. data/lib/puppet/pops/types/p_sem_ver_type.rb +8 -2
  69. data/lib/puppet/pops/types/p_sensitive_type.rb +10 -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/dnfmodule.rb +1 -1
  75. data/lib/puppet/provider/package/nim.rb +11 -6
  76. data/lib/puppet/provider/service/debian.rb +2 -0
  77. data/lib/puppet/provider/service/systemd.rb +14 -4
  78. data/lib/puppet/provider/service/windows.rb +38 -0
  79. data/lib/puppet/provider/user/aix.rb +2 -2
  80. data/lib/puppet/provider/user/directoryservice.rb +25 -12
  81. data/lib/puppet/provider/user/useradd.rb +62 -8
  82. data/lib/puppet/reference/configuration.rb +7 -6
  83. data/lib/puppet/settings.rb +33 -28
  84. data/lib/puppet/settings/alias_setting.rb +37 -0
  85. data/lib/puppet/settings/base_setting.rb +26 -2
  86. data/lib/puppet/settings/environment_conf.rb +1 -0
  87. data/lib/puppet/transaction/additional_resource_generator.rb +1 -1
  88. data/lib/puppet/type/file.rb +19 -1
  89. data/lib/puppet/type/file/selcontext.rb +1 -1
  90. data/lib/puppet/type/package.rb +3 -3
  91. data/lib/puppet/type/service.rb +18 -38
  92. data/lib/puppet/type/tidy.rb +21 -2
  93. data/lib/puppet/type/user.rb +38 -20
  94. data/lib/puppet/util/autoload.rb +1 -8
  95. data/lib/puppet/util/fact_dif.rb +81 -0
  96. data/lib/puppet/util/monkey_patches.rb +7 -0
  97. data/lib/puppet/util/posix.rb +54 -5
  98. data/lib/puppet/util/rubygems.rb +5 -1
  99. data/lib/puppet/util/selinux.rb +30 -4
  100. data/lib/puppet/util/windows/adsi.rb +46 -0
  101. data/lib/puppet/util/windows/api_types.rb +1 -1
  102. data/lib/puppet/util/windows/principal.rb +9 -2
  103. data/lib/puppet/util/windows/service.rb +1 -1
  104. data/lib/puppet/util/windows/sid.rb +4 -2
  105. data/lib/puppet/version.rb +1 -1
  106. data/locales/puppet.pot +372 -288
  107. data/man/man5/puppet.conf.5 +282 -254
  108. data/man/man8/puppet-agent.8 +2 -2
  109. data/man/man8/puppet-apply.8 +2 -2
  110. data/man/man8/puppet-catalog.8 +1 -1
  111. data/man/man8/puppet-config.8 +1 -1
  112. data/man/man8/puppet-describe.8 +1 -1
  113. data/man/man8/puppet-device.8 +2 -2
  114. data/man/man8/puppet-doc.8 +1 -1
  115. data/man/man8/puppet-epp.8 +1 -1
  116. data/man/man8/puppet-facts.8 +90 -1
  117. data/man/man8/puppet-filebucket.8 +3 -3
  118. data/man/man8/puppet-generate.8 +1 -1
  119. data/man/man8/puppet-help.8 +1 -1
  120. data/man/man8/puppet-key.8 +1 -1
  121. data/man/man8/puppet-lookup.8 +1 -1
  122. data/man/man8/puppet-man.8 +1 -1
  123. data/man/man8/puppet-module.8 +1 -1
  124. data/man/man8/puppet-node.8 +4 -1
  125. data/man/man8/puppet-parser.8 +1 -1
  126. data/man/man8/puppet-plugin.8 +1 -1
  127. data/man/man8/puppet-report.8 +4 -1
  128. data/man/man8/puppet-resource.8 +1 -1
  129. data/man/man8/puppet-script.8 +2 -2
  130. data/man/man8/puppet-ssl.8 +5 -1
  131. data/man/man8/puppet-status.8 +1 -1
  132. data/man/man8/puppet.8 +2 -2
  133. data/spec/fixtures/integration/application/agent/cached_deferred_catalog.json +91 -0
  134. data/spec/fixtures/ssl/127.0.0.1-key.pem +107 -57
  135. data/spec/fixtures/ssl/127.0.0.1.pem +52 -31
  136. data/spec/fixtures/ssl/bad-basic-constraints.pem +57 -35
  137. data/spec/fixtures/ssl/bad-int-basic-constraints.pem +57 -35
  138. data/spec/fixtures/ssl/ca.pem +57 -35
  139. data/spec/fixtures/ssl/crl.pem +28 -18
  140. data/spec/fixtures/ssl/ec-key.pem +11 -11
  141. data/spec/fixtures/ssl/ec.pem +33 -24
  142. data/spec/fixtures/ssl/encrypted-ec-key.pem +12 -12
  143. data/spec/fixtures/ssl/encrypted-key.pem +108 -58
  144. data/spec/fixtures/ssl/intermediate-agent-crl.pem +28 -19
  145. data/spec/fixtures/ssl/intermediate-agent.pem +57 -36
  146. data/spec/fixtures/ssl/intermediate-crl.pem +31 -21
  147. data/spec/fixtures/ssl/intermediate.pem +57 -36
  148. data/spec/fixtures/ssl/pluto-key.pem +107 -57
  149. data/spec/fixtures/ssl/pluto.pem +52 -30
  150. data/spec/fixtures/ssl/request-key.pem +107 -57
  151. data/spec/fixtures/ssl/request.pem +47 -26
  152. data/spec/fixtures/ssl/revoked-key.pem +107 -57
  153. data/spec/fixtures/ssl/revoked.pem +52 -30
  154. data/spec/fixtures/ssl/signed-key.pem +107 -57
  155. data/spec/fixtures/ssl/signed.pem +52 -30
  156. data/spec/fixtures/ssl/tampered-cert.pem +52 -30
  157. data/spec/fixtures/ssl/tampered-csr.pem +47 -26
  158. data/spec/fixtures/ssl/unknown-127.0.0.1-key.pem +107 -57
  159. data/spec/fixtures/ssl/unknown-127.0.0.1.pem +50 -29
  160. data/spec/fixtures/ssl/unknown-ca-key.pem +107 -57
  161. data/spec/fixtures/ssl/unknown-ca.pem +55 -33
  162. data/spec/fixtures/unit/provider/service/systemd/list_unit_files_services_vendor_preset +9 -0
  163. data/spec/fixtures/unit/provider/user/aix/aix_passwd_file.out +4 -0
  164. data/spec/integration/application/agent_spec.rb +160 -3
  165. data/spec/integration/application/apply_spec.rb +19 -0
  166. data/spec/integration/application/plugin_spec.rb +1 -1
  167. data/spec/integration/application/resource_spec.rb +30 -0
  168. data/spec/integration/defaults_spec.rb +0 -7
  169. data/spec/integration/environments/setting_hooks_spec.rb +1 -1
  170. data/spec/integration/http/client_spec.rb +12 -0
  171. data/spec/integration/indirector/direct_file_server_spec.rb +1 -3
  172. data/spec/integration/resource/type_collection_spec.rb +2 -6
  173. data/spec/integration/transaction_spec.rb +4 -9
  174. data/spec/integration/util/windows/adsi_spec.rb +21 -1
  175. data/spec/integration/util/windows/principal_spec.rb +21 -0
  176. data/spec/integration/util/windows/registry_spec.rb +6 -10
  177. data/spec/lib/puppet/test_ca.rb +2 -2
  178. data/spec/lib/puppet_spec/settings.rb +6 -1
  179. data/spec/spec_helper.rb +12 -5
  180. data/spec/unit/agent_spec.rb +8 -6
  181. data/spec/unit/application/agent_spec.rb +7 -3
  182. data/spec/unit/application/config_spec.rb +224 -4
  183. data/spec/unit/application/facts_spec.rb +482 -3
  184. data/spec/unit/application/filebucket_spec.rb +0 -2
  185. data/spec/unit/application/ssl_spec.rb +23 -0
  186. data/spec/unit/application_spec.rb +51 -9
  187. data/spec/unit/configurer/downloader_spec.rb +6 -0
  188. data/spec/unit/configurer_spec.rb +23 -0
  189. data/spec/unit/confine/feature_spec.rb +1 -1
  190. data/spec/unit/confine_spec.rb +8 -2
  191. data/spec/unit/defaults_spec.rb +36 -1
  192. data/spec/unit/environments_spec.rb +221 -68
  193. data/spec/unit/face/config_spec.rb +27 -32
  194. data/spec/unit/face/facts_spec.rb +4 -0
  195. data/spec/unit/face/node_spec.rb +0 -11
  196. data/spec/unit/file_serving/configuration/parser_spec.rb +0 -1
  197. data/spec/unit/file_serving/fileset_spec.rb +60 -0
  198. data/spec/unit/file_serving/metadata_spec.rb +3 -3
  199. data/spec/unit/file_serving/terminus_helper_spec.rb +11 -4
  200. data/spec/unit/file_system_spec.rb +9 -0
  201. data/spec/unit/forge/module_release_spec.rb +2 -7
  202. data/spec/unit/functions/inline_epp_spec.rb +26 -1
  203. data/spec/unit/gettext/config_spec.rb +12 -0
  204. data/spec/unit/http/service/compiler_spec.rb +172 -0
  205. data/spec/unit/http/service_spec.rb +1 -1
  206. data/spec/unit/indirector/catalog/compiler_spec.rb +14 -10
  207. data/spec/unit/indirector/face_spec.rb +0 -1
  208. data/spec/unit/indirector/facts/facter_spec.rb +95 -1
  209. data/spec/unit/indirector/facts/json_spec.rb +255 -0
  210. data/spec/unit/indirector/file_bucket_file/selector_spec.rb +26 -8
  211. data/spec/unit/indirector/indirection_spec.rb +8 -12
  212. data/spec/unit/indirector/key/file_spec.rb +0 -1
  213. data/spec/unit/indirector/node/json_spec.rb +33 -0
  214. data/spec/{integration/indirector/report/yaml.rb → unit/indirector/report/json_spec.rb} +13 -24
  215. data/spec/unit/indirector/report/yaml_spec.rb +72 -8
  216. data/spec/unit/indirector_spec.rb +2 -2
  217. data/spec/unit/module_tool/applications/installer_spec.rb +66 -0
  218. data/spec/unit/network/authconfig_spec.rb +0 -3
  219. data/spec/unit/network/formats_spec.rb +41 -0
  220. data/spec/unit/network/http/api/indirected_routes_spec.rb +0 -9
  221. data/spec/unit/network/http/factory_spec.rb +19 -0
  222. data/spec/unit/network/http/handler_spec.rb +0 -5
  223. data/spec/unit/parser/compiler_spec.rb +3 -19
  224. data/spec/unit/parser/functions/fqdn_rand_spec.rb +15 -1
  225. data/spec/unit/parser/resource_spec.rb +14 -8
  226. data/spec/unit/parser/templatewrapper_spec.rb +4 -3
  227. data/spec/unit/pops/evaluator/deferred_resolver_spec.rb +20 -0
  228. data/spec/unit/pops/types/p_sem_ver_type_spec.rb +18 -0
  229. data/spec/unit/pops/types/p_sensitive_type_spec.rb +18 -0
  230. data/spec/unit/property_spec.rb +1 -0
  231. data/spec/unit/provider/group/groupadd_spec.rb +5 -2
  232. data/spec/unit/provider/nameservice_spec.rb +66 -65
  233. data/spec/unit/provider/package/apt_spec.rb +28 -23
  234. data/spec/unit/provider/package/aptitude_spec.rb +1 -1
  235. data/spec/unit/provider/package/base_spec.rb +6 -5
  236. data/spec/unit/provider/package/dnfmodule_spec.rb +10 -1
  237. data/spec/unit/provider/package/nim_spec.rb +42 -0
  238. data/spec/unit/provider/package/pacman_spec.rb +18 -12
  239. data/spec/unit/provider/package/pip_spec.rb +6 -11
  240. data/spec/unit/provider/package/pkgdmg_spec.rb +0 -4
  241. data/spec/unit/provider/service/init_spec.rb +1 -0
  242. data/spec/unit/provider/service/openwrt_spec.rb +3 -1
  243. data/spec/unit/provider/service/systemd_spec.rb +53 -8
  244. data/spec/unit/provider/service/windows_spec.rb +202 -0
  245. data/spec/unit/provider/user/aix_spec.rb +5 -0
  246. data/spec/unit/provider/user/directoryservice_spec.rb +67 -35
  247. data/spec/unit/provider/user/hpux_spec.rb +1 -1
  248. data/spec/unit/provider/user/pw_spec.rb +2 -0
  249. data/spec/unit/provider/user/useradd_spec.rb +71 -3
  250. data/spec/unit/provider_spec.rb +8 -10
  251. data/spec/unit/puppet_pal_catalog_spec.rb +45 -0
  252. data/spec/unit/resource/capability_finder_spec.rb +6 -1
  253. data/spec/unit/resource/catalog_spec.rb +1 -1
  254. data/spec/unit/resource/type_spec.rb +1 -1
  255. data/spec/unit/resource_spec.rb +11 -10
  256. data/spec/unit/settings_spec.rb +419 -242
  257. data/spec/unit/ssl/base_spec.rb +0 -1
  258. data/spec/unit/ssl/host_spec.rb +0 -5
  259. data/spec/unit/ssl/ssl_provider_spec.rb +14 -8
  260. data/spec/unit/ssl/state_machine_spec.rb +19 -5
  261. data/spec/unit/transaction/additional_resource_generator_spec.rb +3 -9
  262. data/spec/unit/transaction/event_manager_spec.rb +14 -11
  263. data/spec/unit/transaction_spec.rb +18 -11
  264. data/spec/unit/type/file/content_spec.rb +0 -1
  265. data/spec/unit/type/file/selinux_spec.rb +3 -5
  266. data/spec/unit/type/file_spec.rb +0 -6
  267. data/spec/unit/type/group_spec.rb +13 -6
  268. data/spec/unit/type/resources_spec.rb +7 -7
  269. data/spec/unit/type/service_spec.rb +60 -189
  270. data/spec/unit/type/tidy_spec.rb +17 -8
  271. data/spec/unit/type/user_spec.rb +45 -0
  272. data/spec/unit/type_spec.rb +2 -2
  273. data/spec/unit/util/at_fork_spec.rb +2 -2
  274. data/spec/unit/util/autoload_spec.rb +5 -1
  275. data/spec/unit/util/backups_spec.rb +1 -2
  276. data/spec/unit/util/execution_spec.rb +15 -11
  277. data/spec/unit/util/inifile_spec.rb +6 -14
  278. data/spec/unit/util/log_spec.rb +8 -7
  279. data/spec/unit/util/logging_spec.rb +3 -3
  280. data/spec/unit/util/posix_spec.rb +363 -15
  281. data/spec/unit/util/rubygems_spec.rb +2 -2
  282. data/spec/unit/util/selinux_spec.rb +163 -68
  283. data/spec/unit/util/storage_spec.rb +3 -1
  284. data/spec/unit/util/suidmanager_spec.rb +44 -41
  285. data/spec/unit/util/windows/sid_spec.rb +6 -0
  286. data/spec/unit/util_spec.rb +13 -6
  287. data/tasks/generate_cert_fixtures.rake +2 -2
  288. metadata +33 -16
  289. data/spec/integration/application/config_spec.rb +0 -74
  290. data/spec/lib/matchers/include.rb +0 -27
  291. data/spec/lib/matchers/include_spec.rb +0 -32
  292. data/spec/unit/face/catalog_spec.rb +0 -6
  293. data/spec/unit/face/module_spec.rb +0 -3
@@ -47,7 +47,6 @@ describe Puppet::SSL::Certificate do
47
47
  describe "when initializing wrapped class from a file with #read" do
48
48
  it "should open the file with ASCII encoding" do
49
49
  path = '/foo/bar/cert'
50
- allow(Puppet::SSL::Base).to receive(:valid_certname).and_return(true)
51
50
  expect(Puppet::FileSystem).to receive(:read).with(path, :encoding => Encoding::ASCII).and_return("bar")
52
51
  @base.read(path)
53
52
  end
@@ -263,8 +263,6 @@ describe Puppet::SSL::Host, if: !Puppet::Util::Platform.jruby? do
263
263
  end
264
264
 
265
265
  it "should send a new request to the CA for signing" do
266
- @http = double("http")
267
- allow(@host).to receive(:http_client).and_return(@http)
268
266
  allow(@host).to receive(:ssl_store).and_return(double("ssl store"))
269
267
  allow(@host).to receive(:key).and_return(key)
270
268
  request = double("request")
@@ -307,7 +305,6 @@ describe Puppet::SSL::Host, if: !Puppet::Util::Platform.jruby? do
307
305
  Puppet[:certdir] = tmpdir('certs')
308
306
  allow(@host).to receive(:key).and_return(double("key"))
309
307
  allow(@host).to receive(:validate_certificate_with_key)
310
- allow(@host).to receive(:http_client).and_return(@http)
311
308
  allow(@host).to receive(:ssl_store).and_return(double("ssl store"))
312
309
  end
313
310
 
@@ -464,8 +461,6 @@ describe Puppet::SSL::Host, if: !Puppet::Util::Platform.jruby? do
464
461
  @revoked_cert = @pki[:revoked_root_node_cert]
465
462
  localcacert = Puppet.settings[:localcacert]
466
463
  Puppet::Util.replace_file(localcacert, 0644) {|f| f.write @pki[:ca_bundle] }
467
- @http = double('http')
468
- allow(@host).to receive(:http_client).and_return(@http)
469
464
  end
470
465
 
471
466
  after do
@@ -271,14 +271,20 @@ describe Puppet::SSL::SSLProvider do
271
271
  end
272
272
 
273
273
  # This option is only available in openssl 1.1
274
- it 'raises if root cert signature is invalid', if: defined?(OpenSSL::X509::V_FLAG_CHECK_SS_SIGNATURE) do
275
- ca = global_cacerts.first
276
- ca.sign(wrong_key, OpenSSL::Digest::SHA256.new)
277
-
278
- expect {
279
- subject.create_context(**config.merge(cacerts: global_cacerts))
280
- }.to raise_error(Puppet::SSL::CertVerifyError,
281
- "Invalid signature for certificate 'CN=Test CA'")
274
+ # OpenSSL 1.1.1h no longer reports expired root CAs when using "verify".
275
+ # This regression was fixed in 1.1.1i, so only skip this test if we're on
276
+ # the affected version.
277
+ # See: https://github.com/openssl/openssl/pull/13585
278
+ if Puppet::Util::Package.versioncmp(OpenSSL::OPENSSL_LIBRARY_VERSION.split[1], '1.1.1h') != 0
279
+ it 'raises if root cert signature is invalid', if: defined?(OpenSSL::X509::V_FLAG_CHECK_SS_SIGNATURE) do
280
+ ca = global_cacerts.first
281
+ ca.sign(wrong_key, OpenSSL::Digest::SHA256.new)
282
+
283
+ expect {
284
+ subject.create_context(**config.merge(cacerts: global_cacerts))
285
+ }.to raise_error(Puppet::SSL::CertVerifyError,
286
+ "Invalid signature for certificate 'CN=Test CA'")
287
+ end
282
288
  end
283
289
 
284
290
  it 'raises if intermediate CA signature is invalid' do
@@ -31,6 +31,14 @@ describe Puppet::SSL::StateMachine, unless: Puppet::Util::Platform.jruby? do
31
31
  allow(Kernel).to receive(:sleep)
32
32
  end
33
33
 
34
+ def expected_digest(name, content)
35
+ OpenSSL::Digest.new(name).hexdigest(content)
36
+ end
37
+
38
+ def to_fingerprint(digest)
39
+ digest.scan(/../).join(':').upcase
40
+ end
41
+
34
42
  context 'when passing keyword arguments' do
35
43
  it "accepts digest" do
36
44
  expect(described_class.new(digest: 'SHA512').digest).to eq('SHA512')
@@ -395,29 +403,35 @@ describe Puppet::SSL::StateMachine, unless: Puppet::Util::Platform.jruby? do
395
403
 
396
404
  it 'verifies CA cert bundle if a ca_fingerprint is given case-insensitively' do
397
405
  Puppet[:log_level] = :info
398
- machine = described_class.new(digest: 'SHA256', ca_fingerprint: 'caacf69bbbcdad9dbcda92dd2da3608b639d1aea4c314d6cc6823cdb32d8e0f8')
406
+
407
+ digest = expected_digest('SHA256', cacert_pem)
408
+ fingerprint = to_fingerprint(digest)
409
+ machine = described_class.new(digest: 'SHA256', ca_fingerprint: digest.downcase)
399
410
  state = Puppet::SSL::StateMachine::NeedCACerts.new(machine)
400
411
  state.next_state
401
412
 
402
- expect(@logs).to include(an_object_having_attributes(message: "Verified CA bundle with digest (SHA256) CA:AC:F6:9B:BB:CD:AD:9D:BC:DA:92:DD:2D:A3:60:8B:63:9D:1A:EA:4C:31:4D:6C:C6:82:3C:DB:32:D8:E0:F8"))
413
+ expect(@logs).to include(an_object_having_attributes(message: "Verified CA bundle with digest (SHA256) #{fingerprint}"))
403
414
  end
404
415
 
405
416
  it 'verifies CA cert bundle using non-default fingerprint' do
406
417
  Puppet[:log_level] = :info
407
- machine = described_class.new(digest: 'SHA512', ca_fingerprint: '3c9d1482b878913ad95c9631feac5090cb05c6eab9496178d6fd5c14a023da3b1a8650a3cbaac516d9a48caf0b0742e1ed7eebf55105c024c74834a45056a9d9')
418
+
419
+ digest = expected_digest('SHA512', cacert_pem)
420
+ machine = described_class.new(digest: 'SHA512', ca_fingerprint: digest)
408
421
  state = Puppet::SSL::StateMachine::NeedCACerts.new(machine)
409
422
  state.next_state
410
423
 
411
- expect(@logs).to include(an_object_having_attributes(message: "Verified CA bundle with digest (SHA512) 3C:9D:14:82:B8:78:91:3A:D9:5C:96:31:FE:AC:50:90:CB:05:C6:EA:B9:49:61:78:D6:FD:5C:14:A0:23:DA:3B:1A:86:50:A3:CB:AA:C5:16:D9:A4:8C:AF:0B:07:42:E1:ED:7E:EB:F5:51:05:C0:24:C7:48:34:A4:50:56:A9:D9"))
424
+ expect(@logs).to include(an_object_having_attributes(message: "Verified CA bundle with digest (SHA512) #{to_fingerprint(digest)}"))
412
425
  end
413
426
 
414
427
  it 'returns an error if verification fails' do
415
428
  machine = described_class.new(digest: 'SHA256', ca_fingerprint: 'wrong!')
416
429
  state = Puppet::SSL::StateMachine::NeedCACerts.new(machine)
417
430
 
431
+ fingerprint = to_fingerprint(expected_digest('SHA256', cacert_pem))
418
432
  st = state.next_state
419
433
  expect(st).to be_an_instance_of(Puppet::SSL::StateMachine::Error)
420
- expect(st.message).to eq("CA bundle with digest (SHA256) CA:AC:F6:9B:BB:CD:AD:9D:BC:DA:92:DD:2D:A3:60:8B:63:9D:1A:EA:4C:31:4D:6C:C6:82:3C:DB:32:D8:E0:F8 did not match expected digest WR:ON:G!")
434
+ expect(st.message).to eq("CA bundle with digest (SHA256) #{fingerprint} did not match expected digest WR:ON:G!")
421
435
  end
422
436
  end
423
437
  end
@@ -33,10 +33,6 @@ describe Puppet::Transaction::AdditionalResourceGenerator do
33
33
 
34
34
  newparam(:code)
35
35
 
36
- def respond_to?(method_name)
37
- method_name == self[:kind] || super
38
- end
39
-
40
36
  def eval_generate
41
37
  eval_code
42
38
  end
@@ -97,8 +93,6 @@ describe Puppet::Transaction::AdditionalResourceGenerator do
97
93
  end
98
94
  end
99
95
 
100
-
101
-
102
96
  after(:each) do
103
97
  Puppet::Type.rmtype(:gen_empty)
104
98
  Puppet::Type.rmtype(:eval_after)
@@ -314,13 +308,13 @@ describe Puppet::Transaction::AdditionalResourceGenerator do
314
308
 
315
309
  it "sets resources_failed_to_generate to true if resource#eval_generate raises an exception" do
316
310
  catalog = compile_to_ral(<<-MANIFEST)
317
- notify { 'hello': }
311
+ generator { thing: }
318
312
  MANIFEST
319
313
 
320
- allow(catalog.resource("Notify[hello]")).to receive(:eval_generate).and_raise(RuntimeError)
314
+ allow(catalog.resource("Generator[thing]")).to receive(:eval_generate).and_raise(RuntimeError)
321
315
  relationship_graph = relationship_graph_for(catalog)
322
316
  generator = Puppet::Transaction::AdditionalResourceGenerator.new(catalog, relationship_graph, prioritizer)
323
- generator.eval_generate(catalog.resource("Notify[hello]"))
317
+ generator.eval_generate(catalog.resource("Generator[thing]"))
324
318
 
325
319
  expect(generator.resources_failed_to_generate).to be_truthy
326
320
  end
@@ -152,6 +152,9 @@ describe Puppet::Transaction::EventManager do
152
152
 
153
153
  @resource = Puppet::Type.type(:file).new :path => make_absolute("/my/file")
154
154
  @event = Puppet::Transaction::Event.new(:name => :event, :resource => @resource)
155
+
156
+ @resource.class.send(:define_method, :callback1) {}
157
+ @resource.class.send(:define_method, :callback2) {}
155
158
  end
156
159
 
157
160
  it "should call the required callback once for each set of associated events" do
@@ -178,7 +181,7 @@ describe Puppet::Transaction::EventManager do
178
181
 
179
182
  allow(@resource).to receive(:callback1)
180
183
 
181
- @manager.process_events(@resource) #x
184
+ @manager.process_events(@resource)
182
185
 
183
186
  expect(@transaction.resource_status(@resource).events.length).to eq(1)
184
187
  end
@@ -211,9 +214,11 @@ describe Puppet::Transaction::EventManager do
211
214
  @event2 = Puppet::Transaction::Event.new(:name => :event, :resource => @resource)
212
215
  @event2.status = "success"
213
216
  expect(@manager).to receive(:queued_events).with(@resource).and_yield(:callback1, [@event, @event2])
217
+ @resource.class.send(:define_method, :callback1) {}
214
218
  end
215
219
 
216
220
  it "should call the callback" do
221
+
217
222
  expect(@resource).to receive(:callback1)
218
223
 
219
224
  @manager.process_events(@resource)
@@ -225,6 +230,7 @@ describe Puppet::Transaction::EventManager do
225
230
  allow(@event).to receive(:status).and_return("noop")
226
231
  allow(@resource).to receive(:event).and_return(Puppet::Transaction::Event.new)
227
232
  expect(@manager).to receive(:queued_events).with(@resource).and_yield(:callback1, [@event])
233
+ @resource.class.send(:define_method, :callback1) {}
228
234
  end
229
235
 
230
236
  it "should log" do
@@ -254,6 +260,7 @@ describe Puppet::Transaction::EventManager do
254
260
  allow(@resource).to receive(:event).and_return(Puppet::Transaction::Event.new)
255
261
  allow(@resource).to receive(:noop?).and_return(true)
256
262
  expect(@manager).to receive(:queued_events).with(@resource).and_yield(:callback1, [@event])
263
+ @resource.class.send(:define_method, :callback1) {}
257
264
  end
258
265
 
259
266
  it "should log" do
@@ -279,7 +286,7 @@ describe Puppet::Transaction::EventManager do
279
286
 
280
287
  describe "and the callback fails" do
281
288
  before do
282
- expect(@resource).to receive(:callback1).and_raise("a failure")
289
+ @resource.class.send(:define_method, :callback1) { raise "a failure" }
283
290
 
284
291
  expect(@manager).to receive(:queued_events).and_yield(:callback1, [@event])
285
292
  end
@@ -323,16 +330,12 @@ describe Puppet::Transaction::EventManager do
323
330
 
324
331
  describe "when queueing then processing events for a given resource" do
325
332
  before do
326
- @transaction = Puppet::Transaction.new(Puppet::Resource::Catalog.new, nil, nil)
327
- @manager = Puppet::Transaction::EventManager.new(@transaction)
333
+ @catalog = Puppet::Resource::Catalog.new
334
+ @target = Puppet::Type.type(:exec).new(name: 'target', path: ENV['PATH'])
335
+ @resource = Puppet::Type.type(:exec).new(name: 'resource', path: ENV['PATH'], notify: @target)
336
+ @catalog.add_resource(@resource, @target)
328
337
 
329
- @resource = Puppet::Type.type(:file).new :path => make_absolute("/my/file")
330
- @target = Puppet::Type.type(:file).new :path => make_absolute("/your/file")
331
-
332
- @graph = allow('graph')
333
- allow(@graph).to receive(:matching_edges).and_return([])
334
- allow(@graph).to receive(:matching_edges).with(anything, @resource).and_return([double('edge', :target => @target, :callback => :refresh)])
335
- allow(@manager).to receive(:relationship_graph).and_return(@graph)
338
+ @manager = Puppet::Transaction::EventManager.new(Puppet::Transaction.new(@catalog, nil, nil))
336
339
 
337
340
  @event = Puppet::Transaction::Event.new(:name => :notify, :resource => @target)
338
341
  @event2 = Puppet::Transaction::Event.new(:name => :service_start, :resource => @target, :invalidate_refreshes => true)
@@ -20,6 +20,19 @@ describe Puppet::Transaction do
20
20
  transaction
21
21
  end
22
22
 
23
+ before(:all) do
24
+ Puppet::Type.newtype(:transaction_generator) do
25
+ newparam(:name) { isnamevar }
26
+
27
+ def generate
28
+ end
29
+ end
30
+ end
31
+
32
+ after(:all) do
33
+ Puppet::Type.rmtype(:transaction_generator)
34
+ end
35
+
23
36
  before do
24
37
  @basepath = make_absolute("/what/ever")
25
38
  @transaction = Puppet::Transaction.new(Puppet::Resource::Catalog.new, nil, Puppet::Graph::SequentialPrioritizer.new)
@@ -323,9 +336,9 @@ describe Puppet::Transaction do
323
336
  describe "when generating resources before traversal" do
324
337
  let(:catalog) { Puppet::Resource::Catalog.new }
325
338
  let(:transaction) { Puppet::Transaction.new(catalog, nil, Puppet::Graph::SequentialPrioritizer.new) }
326
- let(:generator) { Puppet::Type.type(:notify).new :title => "generator" }
339
+ let(:generator) { Puppet::Type.type(:transaction_generator).new :title => "generator" }
327
340
  let(:generated) do
328
- %w[a b c].map { |name| Puppet::Type.type(:notify).new(:name => name) }
341
+ %w[a b c].map { |name| Puppet::Type.type(:transaction_generator).new(:name => name) }
329
342
  end
330
343
 
331
344
  before :each do
@@ -666,7 +679,7 @@ describe Puppet::Transaction do
666
679
  end
667
680
 
668
681
  describe "and new resources are generated" do
669
- let(:generator) { Puppet::Type.type(:notify).new :title => "generator" }
682
+ let(:generator) { Puppet::Type.type(:transaction_generator).new :title => "generator" }
670
683
  let(:generated) do
671
684
  %w[a b c].map { |name| Puppet::Type.type(:package).new :title => "foo", :name => name, :provider => :apt }
672
685
  end
@@ -780,13 +793,8 @@ describe Puppet::Transaction do
780
793
  end
781
794
 
782
795
  it "should call Selinux.matchpathcon_fini in case Selinux is enabled ", :if => Puppet.features.posix? do
783
- unless defined?(Selinux)
784
- module Selinux
785
- def self.is_selinux_enabled
786
- true
787
- end
788
- end
789
- end
796
+ selinux = double('selinux', is_selinux_enabled: true, matchpathcon_fini: nil)
797
+ stub_const('Selinux', selinux)
790
798
 
791
799
  resource = Puppet::Type.type(:file).new(:path => make_absolute("/tmp/foo"))
792
800
  transaction = transaction_with_resource(resource)
@@ -828,7 +836,6 @@ describe Puppet::Transaction do
828
836
  before do
829
837
  @resource = Puppet::Type.type(:notify).new :title => "foobar"
830
838
  @catalog.add_resource @resource
831
- allow(@transaction).to receive(:add_dynamically_generated_resources)
832
839
  end
833
840
 
834
841
  it 'should stop processing if :stop_processing? is true' do
@@ -11,7 +11,6 @@ describe Puppet::Type.type(:file).attrclass(:content), :uses_checksums => true d
11
11
 
12
12
  before do
13
13
  File.open(filename, 'w') {|f| f.write "initial file content"}
14
- allow(described_class).to receive(:standalone?).and_return(false)
15
14
  end
16
15
 
17
16
  around do |example|
@@ -7,10 +7,8 @@ require 'spec_helper'
7
7
 
8
8
  before do
9
9
  @path = make_absolute("/my/file")
10
- @resource = Puppet::Type.type(:file).new :path => @path
10
+ @resource = Puppet::Type.type(:file).new(:path => @path, :ensure => :file)
11
11
  @sel = property.new :resource => @resource
12
- allow(@sel).to receive(:normalize_selinux_category).with("s0").and_return("s0")
13
- allow(@sel).to receive(:normalize_selinux_category).with(nil).and_return(nil)
14
12
  end
15
13
 
16
14
  it "retrieve on #{param} should return :absent if the file isn't statable" do
@@ -52,13 +50,13 @@ require 'spec_helper'
52
50
  end
53
51
 
54
52
  it "should handle no default gracefully" do
55
- expect(@sel).to receive(:get_selinux_default_context).with(@path).and_return(nil)
53
+ expect(@sel).to receive(:get_selinux_default_context).with(@path, :file).and_return(nil)
56
54
  expect(@sel.default).to be_nil
57
55
  end
58
56
 
59
57
  it "should be able to detect matchpathcon defaults" do
60
58
  allow(@sel).to receive(:debug)
61
- expect(@sel).to receive(:get_selinux_default_context).with(@path).and_return("user_u:role_r:type_t:s0")
59
+ expect(@sel).to receive(:get_selinux_default_context).with(@path, :file).and_return("user_u:role_r:type_t:s0")
62
60
  expectedresult = case param
63
61
  when :seluser; "user_u"
64
62
  when :selrole; "role_r"
@@ -344,12 +344,6 @@ describe Puppet::Type.type(:file) do
344
344
  end
345
345
 
346
346
  describe "#flush" do
347
- it "should flush all properties that respond to :flush" do
348
- file[:source] = File.expand_path(__FILE__)
349
- expect(file.parameter(:source)).to receive(:flush)
350
- file.flush
351
- end
352
-
353
347
  it "should reset its stat reference" do
354
348
  FileUtils.touch(path)
355
349
  stat1 = file.stat
@@ -60,9 +60,12 @@ describe Puppet::Type.type(:group) do
60
60
  end
61
61
 
62
62
  it "delegates the existence check to its provider" do
63
- provider = @class.provide(:testing) {}
63
+ provider = @class.provide(:testing) do
64
+ def exists?
65
+ true
66
+ end
67
+ end
64
68
  provider_instance = provider.new
65
- expect(provider_instance).to receive(:exists?).and_return(true)
66
69
 
67
70
  type = @class.new(:name => "group", :provider => provider_instance)
68
71
 
@@ -77,20 +80,24 @@ describe Puppet::Type.type(:group) do
77
80
  def members
78
81
  []
79
82
  end
83
+
84
+ def members_insync?(current, should)
85
+ current == should
86
+ end
87
+
88
+ def members_to_s(values)
89
+ values.map { |v| "#{v} ()" }.join(', ')
90
+ end
80
91
  end
81
92
  end
82
93
  let (:provider_instance) { provider.new }
83
94
  let (:type) { @class.new(:name => "group", :provider => provider_instance, :members => ['user1']) }
84
95
 
85
96
  it "insync? calls members_insync?" do
86
- expect(provider_instance).to receive(:members_insync?).with(['user1'], ['user1']).and_return(true)
87
97
  expect(type.property(:members).insync?(['user1'])).to be_truthy
88
98
  end
89
99
 
90
100
  it "is_to_s and should_to_s call members_to_s" do
91
- expect(provider_instance).to receive(:members_to_s).with(['user1', 'user2']).and_return("user1 (), user2 ()")
92
- expect(provider_instance).to receive(:members_to_s).with(['user1']).and_return("user1 ()")
93
-
94
101
  expect(type.property(:members).is_to_s('user1')).to eq('user1 ()')
95
102
  expect(type.property(:members).should_to_s('user1,user2')).to eq('user1 (), user2 ()')
96
103
  end
@@ -6,6 +6,9 @@ Puppet::Type.newtype(:purgeable_test) do
6
6
  newparam(:name) {}
7
7
  end
8
8
  Puppet::Type.type(:purgeable_test).provide(:purgeable_test) do
9
+ def self.instances
10
+ []
11
+ end
9
12
  end
10
13
 
11
14
  resources = Puppet::Type.type(:resources)
@@ -46,19 +49,16 @@ describe resources do
46
49
  end
47
50
 
48
51
  it "cannot be set to true for a resource type that does not accept ensure" do
49
- allow(instance.resource_type).to receive(:respond_to?).and_return(true)
50
- allow(instance.resource_type).to receive(:validproperty?).and_return(false)
51
- expect { instance[:purge] = 'yes' }.to raise_error Puppet::Error
52
+ allow(instance.resource_type).to receive(:validproperty?).with(:ensure).and_return(false)
53
+ expect { instance[:purge] = 'yes' }.to raise_error Puppet::Error, /Purging is only supported on types that accept 'ensure'/
52
54
  end
53
55
 
54
56
  it "cannot be set to true for a resource type that does not have instances" do
55
- allow(instance.resource_type).to receive(:respond_to?).and_return(false)
56
- allow(instance.resource_type).to receive(:validproperty?).and_return(true)
57
- expect { instance[:purge] = 'yes' }.to raise_error Puppet::Error
57
+ allow(instance.resource_type).to receive(:respond_to?).with(:instances).and_return(false)
58
+ expect { instance[:purge] = 'yes' }.to raise_error Puppet::Error, /Purging resources of type file is not supported/
58
59
  end
59
60
 
60
61
  it "can be set to true for a resource type that has instances and can accept ensure" do
61
- allow(instance.resource_type).to receive(:respond_to?).and_return(true)
62
62
  allow(instance.resource_type).to receive(:validproperty?).and_return(true)
63
63
  expect { instance[:purge] = 'yes' }.to_not raise_error
64
64
  end
@@ -72,50 +72,65 @@ describe test_title, "when validating attribute values" do
72
72
  allow(@provider.class).to receive(:supports_parameter?).and_return(true)
73
73
  end
74
74
 
75
- it "should support :true as a value" do
76
- srv = Puppet::Type.type(:service).new(:name => "yay", :enable => :true)
77
- expect(srv.should(:enable)).to eq(:true)
78
- end
75
+ describe "for value without required features" do
76
+ before :each do
77
+ allow(@provider).to receive(:satisfies?)
78
+ end
79
79
 
80
- it "should support :false as a value" do
81
- srv = Puppet::Type.type(:service).new(:name => "yay", :enable => :false)
82
- expect(srv.should(:enable)).to eq(:false)
83
- end
80
+ it "should not support :mask as a value" do
81
+ expect { Puppet::Type.type(:service).new(:name => "yay", :enable => :mask) }.to raise_error(
82
+ Puppet::ResourceError,
83
+ /Provider .+ must have features 'maskable' to set 'enable' to 'mask'/
84
+ )
85
+ end
84
86
 
85
- it "should support :mask as a value" do
86
- srv = Puppet::Type.type(:service).new(:name => "yay", :enable => :mask)
87
- expect(srv.should(:enable)).to eq(:mask)
88
- end
87
+ it "should not support :manual as a value" do
88
+ expect { Puppet::Type.type(:service).new(:name => "yay", :enable => :manual) }.to raise_error(
89
+ Puppet::ResourceError,
90
+ /Provider .+ must have features 'manual_startable' to set 'enable' to 'manual'/
91
+ )
92
+ end
89
93
 
90
- it "should support :manual as a value on Windows" do
91
- allow(Puppet::Util::Platform).to receive(:windows?).and_return(true)
92
- srv = Puppet::Type.type(:service).new(:name => "yay", :enable => :manual)
93
- expect(srv.should(:enable)).to eq(:manual)
94
+ it "should not support :mask as a value" do
95
+ expect { Puppet::Type.type(:service).new(:name => "yay", :enable => :delayed) }.to raise_error(
96
+ Puppet::ResourceError,
97
+ /Provider .+ must have features 'delayed_startable' to set 'enable' to 'delayed'/
98
+ )
99
+ end
94
100
  end
95
101
 
96
- it "should support :delayed as a value on Windows" do
97
- allow(Puppet::Util::Platform).to receive(:windows?).and_return(true)
102
+ describe "for value with required features" do
103
+ before :each do
104
+ allow(@provider).to receive(:satisfies?).and_return(:true)
105
+ end
98
106
 
99
- srv = Puppet::Type.type(:service).new(:name => "yay", :enable => :delayed)
100
- expect(srv.should(:enable)).to eq(:delayed)
101
- end
107
+ it "should support :true as a value" do
108
+ srv = Puppet::Type.type(:service).new(:name => "yay", :enable => :true)
109
+ expect(srv.should(:enable)).to eq(:true)
110
+ end
102
111
 
103
- it "should not support :manual as a value when not on Windows" do
104
- allow(Puppet::Util::Platform).to receive(:windows?).and_return(false)
112
+ it "should support :false as a value" do
113
+ srv = Puppet::Type.type(:service).new(:name => "yay", :enable => :false)
114
+ expect(srv.should(:enable)).to eq(:false)
115
+ end
105
116
 
106
- expect { Puppet::Type.type(:service).new(:name => "yay", :enable => :manual) }.to raise_error(
107
- Puppet::Error,
108
- /Setting enable to manual is only supported on Microsoft Windows\./
109
- )
110
- end
117
+ it "should support :mask as a value" do
118
+ srv = Puppet::Type.type(:service).new(:name => "yay", :enable => :mask)
119
+ expect(srv.should(:enable)).to eq(:mask)
120
+ end
111
121
 
112
- it "should not support :delayed as a value when not on Windows" do
113
- allow(Puppet::Util::Platform).to receive(:windows?).and_return(false)
122
+ it "should support :manual as a value on Windows" do
123
+ allow(Puppet::Util::Platform).to receive(:windows?).and_return(true)
124
+ srv = Puppet::Type.type(:service).new(:name => "yay", :enable => :manual)
125
+ expect(srv.should(:enable)).to eq(:manual)
126
+ end
114
127
 
115
- expect { Puppet::Type.type(:service).new(:name => "yay", :enable => :delayed) }.to raise_error(
116
- Puppet::Error,
117
- /Setting enable to delayed is only supported on Microsoft Windows\./
118
- )
128
+ it "should support :delayed as a value on Windows" do
129
+ allow(Puppet::Util::Platform).to receive(:windows?).and_return(true)
130
+
131
+ srv = Puppet::Type.type(:service).new(:name => "yay", :enable => :delayed)
132
+ expect(srv.should(:enable)).to eq(:delayed)
133
+ end
119
134
  end
120
135
  end
121
136
 
@@ -150,105 +165,24 @@ describe test_title, "when validating attribute values" do
150
165
  provider_class_with_logon_credentials = Puppet::Type.type(:service).provide(:simple) do
151
166
  has_features :manages_logon_credentials
152
167
  def logonpassword=(value) end
168
+ def logonaccount_insync?(current) end
153
169
  end
154
170
  allow(Puppet::Type.type(:service)).to receive(:defaultprovider).and_return(provider_class_with_logon_credentials)
155
171
  end
156
172
 
157
173
  describe "the 'logonaccount' property" do
158
- it "should not be munged nor checked when not on Windows" do
159
- allow(Puppet::Util::Platform).to receive(:windows?).and_return(false)
160
- service = Puppet::Type.type(:service).new(:name => "yay", :logonaccount => 'NonWindowsUser')
174
+ let(:service) {Puppet::Type.type(:service).new(:name => "yay", :logonaccount => 'myUser')}
161
175
 
162
- expect { service }.not_to raise_error
163
- expect(service[:logonaccount]).to eq('NonWindowsUser')
176
+ it "should let superclass implementation resolve insyncness when provider does not respond to the 'logonaccount_insync?' method" do
177
+ allow(service.provider).to receive(:respond_to?).with(:logonaccount_insync?).and_return(false)
178
+ expect(service.property(:logonaccount).insync?('myUser')).to eq(true)
164
179
  end
165
180
 
166
- context "when on Windows", :if => Puppet::Util::Platform.windows? do
167
- before do
168
- allow(Puppet::Util::Windows::User).to receive(:password_is?).and_return(true)
169
- allow(Puppet::Util::Windows::ADSI).to receive(:computer_name).and_return("myPC")
170
- allow(Puppet::Util::Windows::User).to receive(:get_rights).and_return('SeServiceLogonRight')
171
- end
172
-
173
- it "should fail when the `Log On As A Service` right is missing from given user" do
174
- allow(Puppet::Util::Windows::SID).to receive(:name_to_principal).and_return(Puppet::Util::Windows::SID::Principal.new("myUser", nil, nil, "myPC", :SidTypeUser))
175
- allow(Puppet::Util::Windows::User).to receive(:get_rights).with('myPC\\myUser').and_return("")
176
-
177
- expect { Puppet::Type.type(:service).new(:name => "yay", :logonaccount => 'myUser') }.to raise_error(Puppet::Error, /"myPC\\myUser" is missing the 'Log On As A Service' right./)
178
- end
179
-
180
- it "should fail when the `Log On As A Service` right is set to denied for given user" do
181
- allow(Puppet::Util::Windows::SID).to receive(:name_to_principal).and_return(Puppet::Util::Windows::SID::Principal.new("myUser", nil, nil, "myPC", :SidTypeUser))
182
- allow(Puppet::Util::Windows::User).to receive(:get_rights).with('myPC\\myUser').and_return("SeDenyServiceLogonRight")
183
-
184
- expect { Puppet::Type.type(:service).new(:name => "yay", :logonaccount => 'myUser') }.to raise_error(Puppet::Error, /"myPC\\myUser" has the 'Log On As A Service' right set to denied./)
185
- end
186
-
187
- it "should not fail when given user has the `Log On As A Service` right" do
188
- allow(Puppet::Util::Windows::SID).to receive(:name_to_principal).and_return(Puppet::Util::Windows::SID::Principal.new("myUser", nil, nil, "myPC", :SidTypeUser))
189
- allow(Puppet::Util::Windows::User).to receive(:get_rights).with('myPC\\myUser').and_return("SeServiceLogonRight")
190
-
191
- expect { Puppet::Type.type(:service).new(:name => "yay", :logonaccount => 'myUser') }.not_to raise_error
192
- end
193
-
194
- it "should not fail when given user is a default system account even if the `Log On As A Service` right is missing" do
195
- allow(Puppet::Util::Windows::SID).to receive(:name_to_principal).and_return(Puppet::Util::Windows::SID::Principal.new("LOCAL SERVICE", nil, nil, "NT AUTHORITY", :SidTypeUser))
196
- allow(Puppet::Util::Windows::User).to receive(:default_system_account?).and_return(true)
197
-
198
- expect(Puppet::Util::Windows::User).not_to receive(:get_rights)
199
- expect { Puppet::Type.type(:service).new(:name => "yay", :logonaccount => 'myUser') }.not_to raise_error
200
- end
201
-
202
- ['LocalSystem', '.\LocalSystem', 'myPC\LocalSystem', 'lOcALsysTem'].each do |user_input|
203
- it "should succesfully munge #{user_input} to 'LocalSystem'" do
204
- service = Puppet::Type.type(:service).new(:name => "yay", :logonaccount => user_input)
205
-
206
- expect { service }.not_to raise_error
207
- expect(service[:logonaccount]).to eq('LocalSystem')
208
- end
209
- end
210
-
211
- it "should succesfully munge local account" do
212
- allow(Puppet::Util::Windows::SID).to receive(:name_to_principal).and_return(Puppet::Util::Windows::SID::Principal.new("myUser", nil, nil, "myPC", :SidTypeUser))
213
- service = Puppet::Type.type(:service).new(:name => "yay", :logonaccount => 'myUser')
214
-
215
- expect { service }.not_to raise_error
216
- expect(service[:logonaccount]).to eq('.\myUser')
217
- end
218
-
219
- it "should succesfully munge domain account" do
220
- allow(Puppet::Util::Windows::SID).to receive(:name_to_principal).and_return(Puppet::Util::Windows::SID::Principal.new("DomainUser", nil, nil, "myDomain", :SidTypeUser))
221
- service = Puppet::Type.type(:service).new(:name => "yay", :logonaccount => 'DomainUser')
222
-
223
- expect { service }.not_to raise_error
224
- expect(service[:logonaccount]).to eq('myDomain\DomainUser')
225
- end
226
-
227
- it "should succesfully munge well known user" do
228
- allow(Puppet::Util::Windows::SID).to receive(:name_to_principal).and_return(Puppet::Util::Windows::SID::Principal.new("LOCAL SERVICE", nil, nil, "NT AUTHORITY", :SidTypeWellKnownGroup))
229
- service = Puppet::Type.type(:service).new(:name => "yay", :logonaccount => 'LocalService')
230
-
231
- expect { service }.not_to raise_error
232
- expect(service[:logonaccount]).to eq('NT AUTHORITY\LOCAL SERVICE')
233
- end
234
-
235
- it "should succesfully munge a SID" do
236
- allow(Puppet::Util::Windows::SID).to receive(:name_to_principal).and_return(Puppet::Util::Windows::SID::Principal.new("NETWORK SERVICE", nil, nil, "NT AUTHORITY", :SidTypeUser))
237
- service = Puppet::Type.type(:service).new(:name => "yay", :logonaccount => 'S-1-5-20')
238
-
239
- expect { service }.not_to raise_error
240
- expect(service[:logonaccount]).to eq('NT AUTHORITY\NETWORK SERVICE')
241
- end
242
-
243
- it "should fail when account is invalid" do
244
- allow(Puppet::Util::Windows::SID).to receive(:name_to_principal).and_return(nil)
245
- expect { Puppet::Type.type(:service).new(:name => "yay", :logonaccount => 'InvalidUser') }.to raise_error(Puppet::Error, /"InvalidUser" is not a valid account/)
246
- end
247
-
248
- it "should fail when sid type is not user or well known user" do
249
- allow(Puppet::Util::Windows::SID).to receive(:name_to_principal).and_return(Puppet::Util::Windows::SID::Principal.new("Administrators", nil, nil, "BUILTIN", :SidTypeAlias))
250
- expect { Puppet::Type.type(:service).new(:name => "yay", :logonaccount => 'Administrators') }.to raise_error(Puppet::Error, /"Administrators" is not a valid account/)
251
- end
181
+ it "should let provider resolve insyncness when provider responds to the 'logonaccount_insync?' method" do
182
+ allow(service.provider).to receive(:respond_to?).with(:logonaccount_insync?, any_args).and_return(true)
183
+ allow(service.provider).to receive(:logonaccount_insync?).and_return(false)
184
+
185
+ expect(service.property(:logonaccount).insync?('myUser')).to eq(false)
252
186
  end
253
187
  end
254
188
 
@@ -258,7 +192,6 @@ describe test_title, "when validating attribute values" do
258
192
  end
259
193
 
260
194
  it "should default to empty string when only logonaccount is being managed" do
261
- allow(Puppet::Util::Platform).to receive(:windows?).and_return(false)
262
195
  service = Puppet::Type.type(:service).new(:name => "yay", :logonaccount => 'myUser')
263
196
 
264
197
  expect { service }.not_to raise_error
@@ -271,70 +204,8 @@ describe test_title, "when validating attribute values" do
271
204
  end
272
205
 
273
206
  it "should fail when logonpassword includes the ':' character" do
274
- allow(Puppet::Util::Platform).to receive(:windows?).and_return(false)
275
207
  expect { Puppet::Type.type(:service).new(:name => "yay", :logonaccount => 'myUser', :logonpassword => 'my:Pass') }.to raise_error(Puppet::Error, /Passwords cannot include ':'/)
276
208
  end
277
-
278
- it "should not further check the password against given account when not on Windows" do
279
- allow(Puppet::Util::Platform).to receive(:windows?).and_return(false)
280
- expect { Puppet::Type.type(:service).new(:name => "yay", :logonaccount => 'myUser', :logonpassword => 'myPass') }.not_to raise_error
281
- end
282
-
283
- context "when on Windows", :if => Puppet::Util::Platform.windows? do
284
- before do
285
- allow(Puppet::Util::Windows::ADSI).to receive(:computer_name).and_return("myPC")
286
- allow(Puppet::Util::Windows::SID).to receive(:name_to_principal).and_return(name_to_principal_result)
287
- allow(Puppet::Util::Windows::User).to receive(:get_rights).and_return('SeServiceLogonRight')
288
- end
289
-
290
- it "should pass validation when given account is 'LocalSystem'" do
291
- allow(Puppet::Util::Windows::User).to receive(:localsystem?).with('LocalSystem').and_return(true)
292
- allow(Puppet::Util::Windows::User).to receive(:default_system_account?).with('LocalSystem').and_return(false)
293
-
294
- expect(Puppet::Util::Windows::SID).not_to receive(:name_to_principal)
295
- expect(Puppet::Util::Windows::User).not_to receive(:password_is?)
296
- expect { Puppet::Type.type(:service).new(:name => "yay", :logonaccount => 'LocalSystem') }.not_to raise_error
297
- end
298
-
299
- ['LOCAL SERVICE', 'NETWORK SERVICE', 'SYSTEM'].each do |predefined_local_account|
300
- describe "when given account is #{predefined_local_account}" do
301
- let(:name_to_principal_result) do
302
- Puppet::Util::Windows::SID::Principal.new(predefined_local_account, nil, nil, "NT AUTHORITY", :SidTypeUser)
303
- end
304
-
305
- it "should pass validation" do
306
- allow(Puppet::Util::Windows::User).to receive(:localsystem?).with(predefined_local_account).and_return(false)
307
- expect(Puppet::Util::Windows::User).to receive(:default_system_account?).with(predefined_local_account).and_return(true)
308
- expect(Puppet::Util::Windows::User).to receive(:default_system_account?).with("NT AUTHORITY\\#{predefined_local_account}").and_return(true)
309
-
310
- expect(Puppet::Util::Windows::User).not_to receive(:password_is?)
311
- expect { Puppet::Type.type(:service).new(:name => "yay", :logonaccount => predefined_local_account) }.not_to raise_error
312
- end
313
- end
314
- end
315
-
316
- let(:name_to_principal_result) do
317
- Puppet::Util::Windows::SID::Principal.new("myUser", nil, nil, "myPC", :SidTypeUser)
318
- end
319
-
320
- describe "when given logonaccount is not a predefined local account" do
321
- before do
322
- allow(Puppet::Util::Windows::User).to receive(:localsystem?).with('myUser').and_return(false)
323
- allow(Puppet::Util::Windows::User).to receive(:default_system_account?).with('myUser').and_return(false)
324
- allow(Puppet::Util::Windows::User).to receive(:default_system_account?).with('.\\myUser').and_return(false)
325
- end
326
-
327
- it "should pass validation if password is proven correct" do
328
- allow(Puppet::Util::Windows::User).to receive(:password_is?).with('myUser', 'myPass', '.').and_return(true)
329
- expect { Puppet::Type.type(:service).new(:name => "yay", :logonaccount => 'myUser', :logonpassword => 'myPass') }.not_to raise_error
330
- end
331
-
332
- it "should not pass validation if password check fails" do
333
- allow(Puppet::Util::Windows::User).to receive(:password_is?).with('myUser', 'myWrongPass', '.').and_return(false)
334
- expect { Puppet::Type.type(:service).new(:name => "yay", :logonaccount => 'myUser', :logonpassword => 'myWrongPass') }.to raise_error(Puppet::Error, /The given password is invalid for user '.\\myUser'/)
335
- end
336
- end
337
- end
338
209
  end
339
210
  end
340
211
 
@@ -488,7 +359,7 @@ describe test_title, "when changing the host" do
488
359
  it "insyncness should be resolved by provider instead of superclass implementation when provider responds to the 'enabled_insync?' method" do
489
360
  allow(@service.provider.class).to receive(:supports_parameter?).and_return(true)
490
361
  @service[:enable] = true
491
- allow(@service.provider).to receive(:respond_to?).with(:enabled_insync?).and_return(true)
362
+ allow(@service.provider).to receive(:respond_to?).with(:enabled_insync?, any_args).and_return(true)
492
363
  allow(@service.provider).to receive(:enabled_insync?).and_return(false)
493
364
 
494
365
  expect(@service.property(:enable).insync?(:true)).to eq(false)