puppet 6.13.0-x86-mingw32 → 6.18.0-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 (461) hide show
  1. checksums.yaml +4 -4
  2. data/CODEOWNERS +2 -7
  3. data/CONTRIBUTING.md +7 -13
  4. data/Gemfile +4 -2
  5. data/Gemfile.lock +36 -32
  6. data/README.md +17 -24
  7. data/ext/windows/service/daemon.rb +3 -3
  8. data/lib/puppet.rb +33 -9
  9. data/lib/puppet/agent.rb +20 -14
  10. data/lib/puppet/application/agent.rb +26 -17
  11. data/lib/puppet/application/apply.rb +18 -20
  12. data/lib/puppet/application/describe.rb +7 -5
  13. data/lib/puppet/application/device.rb +2 -2
  14. data/lib/puppet/application/filebucket.rb +19 -15
  15. data/lib/puppet/application/lookup.rb +16 -4
  16. data/lib/puppet/application/plugin.rb +1 -0
  17. data/lib/puppet/application/ssl.rb +4 -4
  18. data/lib/puppet/configurer.rb +58 -57
  19. data/lib/puppet/configurer/downloader.rb +31 -10
  20. data/lib/puppet/configurer/plugin_handler.rb +10 -1
  21. data/lib/puppet/confine.rb +2 -2
  22. data/lib/puppet/confine/any.rb +1 -1
  23. data/lib/puppet/context/trusted_information.rb +14 -8
  24. data/lib/puppet/daemon.rb +13 -27
  25. data/lib/puppet/defaults.rb +92 -12
  26. data/lib/puppet/environments.rb +4 -5
  27. data/lib/puppet/face/facts.rb +1 -1
  28. data/lib/puppet/face/help.rb +29 -3
  29. data/lib/puppet/face/module/search.rb +5 -0
  30. data/lib/puppet/face/plugin.rb +2 -2
  31. data/lib/puppet/feature/base.rb +1 -1
  32. data/lib/puppet/file_serving/http_metadata.rb +14 -2
  33. data/lib/puppet/file_serving/metadata.rb +4 -1
  34. data/lib/puppet/file_serving/mount/locales.rb +1 -2
  35. data/lib/puppet/file_serving/mount/pluginfacts.rb +1 -2
  36. data/lib/puppet/file_serving/mount/plugins.rb +1 -2
  37. data/lib/puppet/file_serving/terminus_selector.rb +7 -8
  38. data/lib/puppet/file_system/file_impl.rb +17 -13
  39. data/lib/puppet/file_system/uniquefile.rb +12 -16
  40. data/lib/puppet/forge.rb +1 -1
  41. data/lib/puppet/forge/cache.rb +1 -1
  42. data/lib/puppet/forge/repository.rb +4 -7
  43. data/lib/puppet/functions/call.rb +1 -1
  44. data/lib/puppet/functions/eyaml_lookup_key.rb +13 -8
  45. data/lib/puppet/functions/filter.rb +1 -0
  46. data/lib/puppet/functions/lstrip.rb +4 -4
  47. data/lib/puppet/functions/reduce.rb +2 -4
  48. data/lib/puppet/functions/reverse_each.rb +1 -1
  49. data/lib/puppet/functions/rstrip.rb +4 -4
  50. data/lib/puppet/functions/step.rb +1 -1
  51. data/lib/puppet/functions/strip.rb +4 -4
  52. data/lib/puppet/gettext/config.rb +5 -5
  53. data/lib/puppet/gettext/module_translations.rb +4 -4
  54. data/lib/puppet/http.rb +3 -0
  55. data/lib/puppet/http/client.rb +263 -73
  56. data/lib/puppet/http/external_client.rb +90 -0
  57. data/lib/puppet/http/redirector.rb +43 -7
  58. data/lib/puppet/http/resolver.rb +46 -3
  59. data/lib/puppet/http/resolver/server_list.rb +76 -16
  60. data/lib/puppet/http/resolver/settings.rb +23 -3
  61. data/lib/puppet/http/resolver/srv.rb +29 -3
  62. data/lib/puppet/http/response.rb +87 -1
  63. data/lib/puppet/http/retry_after_handler.rb +39 -0
  64. data/lib/puppet/http/service.rb +97 -12
  65. data/lib/puppet/http/service/ca.rb +76 -14
  66. data/lib/puppet/http/service/compiler.rb +249 -16
  67. data/lib/puppet/http/service/file_server.rb +141 -20
  68. data/lib/puppet/http/service/report.rb +47 -17
  69. data/lib/puppet/http/session.rb +96 -7
  70. data/lib/puppet/indirector.rb +1 -1
  71. data/lib/puppet/indirector/catalog/rest.rb +34 -0
  72. data/lib/puppet/indirector/exec.rb +1 -1
  73. data/lib/puppet/indirector/facts/facter.rb +3 -3
  74. data/lib/puppet/indirector/facts/rest.rb +42 -0
  75. data/lib/puppet/indirector/file_bucket_file/rest.rb +48 -0
  76. data/lib/puppet/indirector/file_content/http.rb +5 -0
  77. data/lib/puppet/indirector/file_content/rest.rb +30 -0
  78. data/lib/puppet/indirector/file_metadata/http.rb +28 -8
  79. data/lib/puppet/indirector/file_metadata/rest.rb +52 -0
  80. data/lib/puppet/indirector/hiera.rb +4 -0
  81. data/lib/puppet/indirector/indirection.rb +1 -1
  82. data/lib/puppet/indirector/node/rest.rb +24 -0
  83. data/lib/puppet/indirector/report/processor.rb +2 -2
  84. data/lib/puppet/indirector/report/rest.rb +19 -0
  85. data/lib/puppet/indirector/report/yaml.rb +23 -0
  86. data/lib/puppet/indirector/request.rb +1 -1
  87. data/lib/puppet/indirector/rest.rb +12 -0
  88. data/lib/puppet/indirector/status/rest.rb +18 -0
  89. data/lib/puppet/loaders.rb +6 -0
  90. data/lib/puppet/metatype/manager.rb +80 -80
  91. data/lib/puppet/module.rb +1 -2
  92. data/lib/puppet/network/format_support.rb +2 -2
  93. data/lib/puppet/network/http/api/indirected_routes.rb +1 -1
  94. data/lib/puppet/network/http/api/master/v3/environment.rb +3 -0
  95. data/lib/puppet/network/http/base_pool.rb +7 -2
  96. data/lib/puppet/network/http/compression.rb +7 -0
  97. data/lib/puppet/network/http/connection.rb +2 -0
  98. data/lib/puppet/network/http/connection_adapter.rb +184 -0
  99. data/lib/puppet/network/http/nocache_pool.rb +1 -0
  100. data/lib/puppet/network/http/pool.rb +8 -5
  101. data/lib/puppet/network/http/route.rb +2 -2
  102. data/lib/puppet/network/http_pool.rb +2 -1
  103. data/lib/puppet/node/environment.rb +22 -5
  104. data/lib/puppet/pal/catalog_compiler.rb +5 -0
  105. data/lib/puppet/pal/pal_impl.rb +30 -31
  106. data/lib/puppet/parameter.rb +1 -1
  107. data/lib/puppet/parser/ast/leaf.rb +5 -5
  108. data/lib/puppet/parser/ast/pops_bridge.rb +0 -4
  109. data/lib/puppet/parser/compiler.rb +43 -33
  110. data/lib/puppet/parser/compiler/catalog_validator/env_relationship_validator.rb +2 -0
  111. data/lib/puppet/parser/compiler/catalog_validator/site_validator.rb +2 -0
  112. data/lib/puppet/parser/environment_compiler.rb +4 -1
  113. data/lib/puppet/parser/functions.rb +18 -9
  114. data/lib/puppet/parser/functions/create_resources.rb +11 -7
  115. data/lib/puppet/parser/functions/filter.rb +1 -0
  116. data/lib/puppet/parser/resource.rb +3 -2
  117. data/lib/puppet/parser/resource/param.rb +6 -0
  118. data/lib/puppet/parser/type_loader.rb +2 -2
  119. data/lib/puppet/pops/adaptable.rb +7 -13
  120. data/lib/puppet/pops/adapters.rb +8 -4
  121. data/lib/puppet/pops/evaluator/evaluator_impl.rb +5 -5
  122. data/lib/puppet/pops/issues.rb +5 -0
  123. data/lib/puppet/pops/loader/runtime3_type_loader.rb +4 -2
  124. data/lib/puppet/pops/loaders.rb +24 -15
  125. data/lib/puppet/pops/lookup/context.rb +1 -1
  126. data/lib/puppet/pops/lookup/hiera_config.rb +14 -1
  127. data/lib/puppet/pops/resource/resource_type_impl.rb +2 -0
  128. data/lib/puppet/pops/types/iterable.rb +34 -8
  129. data/lib/puppet/pops/validation/checker4_0.rb +29 -15
  130. data/lib/puppet/pops/validation/validator_factory_4_0.rb +1 -0
  131. data/lib/puppet/provider/file/windows.rb +1 -1
  132. data/lib/puppet/provider/group/groupadd.rb +9 -4
  133. data/lib/puppet/provider/group/windows_adsi.rb +3 -3
  134. data/lib/puppet/provider/package/aix.rb +17 -2
  135. data/lib/puppet/provider/package/apt.rb +98 -1
  136. data/lib/puppet/provider/package/aptitude.rb +1 -1
  137. data/lib/puppet/provider/package/dnfmodule.rb +61 -14
  138. data/lib/puppet/provider/package/gem.rb +45 -9
  139. data/lib/puppet/provider/package/pacman.rb +2 -5
  140. data/lib/puppet/provider/package/pip.rb +143 -48
  141. data/lib/puppet/provider/package/pip3.rb +0 -2
  142. data/lib/puppet/provider/package/pkgdmg.rb +1 -1
  143. data/lib/puppet/provider/package/pkgng.rb +16 -4
  144. data/lib/puppet/provider/package/portage.rb +2 -2
  145. data/lib/puppet/provider/package/puppet_gem.rb +11 -2
  146. data/lib/puppet/provider/package/rpm.rb +6 -213
  147. data/lib/puppet/provider/package/yum.rb +100 -20
  148. data/lib/puppet/provider/package/zypper.rb +62 -1
  149. data/lib/puppet/provider/service/systemd.rb +22 -4
  150. data/lib/puppet/provider/service/windows.rb +23 -7
  151. data/lib/puppet/provider/user/aix.rb +1 -1
  152. data/lib/puppet/provider/user/user_role_add.rb +1 -1
  153. data/lib/puppet/provider/user/useradd.rb +16 -5
  154. data/lib/puppet/provider/user/windows_adsi.rb +18 -1
  155. data/lib/puppet/reports/http.rb +15 -9
  156. data/lib/puppet/resource.rb +2 -1
  157. data/lib/puppet/resource/type.rb +8 -0
  158. data/lib/puppet/resource/type_collection.rb +20 -16
  159. data/lib/puppet/runtime.rb +31 -1
  160. data/lib/puppet/settings.rb +3 -1
  161. data/lib/puppet/settings/http_extra_headers_setting.rb +25 -0
  162. data/lib/puppet/ssl.rb +1 -0
  163. data/lib/puppet/ssl/host.rb +4 -4
  164. data/lib/puppet/ssl/oids.rb +1 -0
  165. data/lib/puppet/ssl/ssl_context.rb +2 -2
  166. data/lib/puppet/ssl/ssl_provider.rb +20 -1
  167. data/lib/puppet/ssl/state_machine.rb +81 -35
  168. data/lib/puppet/ssl/validator/default_validator.rb +1 -1
  169. data/lib/puppet/ssl/verifier_adapter.rb +9 -1
  170. data/lib/puppet/test/test_helper.rb +21 -14
  171. data/lib/puppet/transaction.rb +2 -2
  172. data/lib/puppet/transaction/persistence.rb +1 -1
  173. data/lib/puppet/transaction/report.rb +3 -3
  174. data/lib/puppet/trusted_external.rb +29 -1
  175. data/lib/puppet/type.rb +21 -8
  176. data/lib/puppet/type/file.rb +51 -13
  177. data/lib/puppet/type/file/checksum.rb +4 -4
  178. data/lib/puppet/type/file/source.rb +75 -64
  179. data/lib/puppet/type/notify.rb +2 -2
  180. data/lib/puppet/type/package.rb +41 -3
  181. data/lib/puppet/type/service.rb +59 -8
  182. data/lib/puppet/type/user.rb +19 -29
  183. data/lib/puppet/util.rb +41 -3
  184. data/lib/puppet/util/at_fork.rb +1 -1
  185. data/lib/puppet/util/autoload.rb +13 -25
  186. data/lib/puppet/util/character_encoding.rb +9 -5
  187. data/lib/puppet/util/checksums.rb +19 -4
  188. data/lib/puppet/util/execution.rb +2 -2
  189. data/lib/puppet/util/fileparsing.rb +2 -2
  190. data/lib/puppet/util/instance_loader.rb +14 -10
  191. data/lib/puppet/util/log/destinations.rb +1 -10
  192. data/lib/puppet/util/package/version/debian.rb +175 -0
  193. data/lib/puppet/util/package/version/gem.rb +15 -0
  194. data/lib/puppet/util/package/version/pip.rb +167 -0
  195. data/lib/puppet/util/package/version/range.rb +53 -0
  196. data/lib/puppet/util/package/version/range/eq.rb +14 -0
  197. data/lib/puppet/util/package/version/range/gt.rb +14 -0
  198. data/lib/puppet/util/package/version/range/gt_eq.rb +14 -0
  199. data/lib/puppet/util/package/version/range/lt.rb +14 -0
  200. data/lib/puppet/util/package/version/range/lt_eq.rb +14 -0
  201. data/lib/puppet/util/package/version/range/min_max.rb +21 -0
  202. data/lib/puppet/util/package/version/range/simple.rb +11 -0
  203. data/lib/puppet/util/package/version/rpm.rb +73 -0
  204. data/lib/puppet/util/pidlock.rb +13 -7
  205. data/lib/puppet/util/platform.rb +5 -0
  206. data/lib/puppet/util/provider_features.rb +1 -1
  207. data/lib/puppet/util/reference.rb +1 -1
  208. data/lib/puppet/util/rpm_compare.rb +193 -0
  209. data/lib/puppet/util/windows.rb +1 -0
  210. data/lib/puppet/util/windows/adsi.rb +2 -2
  211. data/lib/puppet/util/windows/api_types.rb +60 -33
  212. data/lib/puppet/util/windows/eventlog.rb +1 -6
  213. data/lib/puppet/util/windows/monkey_patches/dir.rb +40 -0
  214. data/lib/puppet/util/windows/principal.rb +8 -6
  215. data/lib/puppet/util/windows/process.rb +15 -14
  216. data/lib/puppet/util/windows/registry.rb +11 -11
  217. data/lib/puppet/util/windows/security.rb +5 -4
  218. data/lib/puppet/util/windows/service.rb +43 -26
  219. data/lib/puppet/util/windows/sid.rb +3 -3
  220. data/lib/puppet/util/windows/user.rb +242 -8
  221. data/lib/puppet/version.rb +1 -1
  222. data/locales/puppet.pot +641 -511
  223. data/man/man5/puppet.conf.5 +75 -10
  224. data/man/man8/puppet-agent.8 +7 -7
  225. data/man/man8/puppet-apply.8 +1 -1
  226. data/man/man8/puppet-catalog.8 +1 -1
  227. data/man/man8/puppet-config.8 +1 -1
  228. data/man/man8/puppet-describe.8 +1 -1
  229. data/man/man8/puppet-device.8 +2 -2
  230. data/man/man8/puppet-doc.8 +1 -1
  231. data/man/man8/puppet-epp.8 +1 -1
  232. data/man/man8/puppet-facts.8 +1 -1
  233. data/man/man8/puppet-filebucket.8 +17 -2
  234. data/man/man8/puppet-generate.8 +1 -1
  235. data/man/man8/puppet-help.8 +6 -3
  236. data/man/man8/puppet-key.8 +1 -1
  237. data/man/man8/puppet-lookup.8 +2 -2
  238. data/man/man8/puppet-man.8 +1 -1
  239. data/man/man8/puppet-module.8 +4 -1
  240. data/man/man8/puppet-node.8 +1 -1
  241. data/man/man8/puppet-parser.8 +1 -1
  242. data/man/man8/puppet-plugin.8 +1 -1
  243. data/man/man8/puppet-report.8 +1 -1
  244. data/man/man8/puppet-resource.8 +1 -1
  245. data/man/man8/puppet-script.8 +1 -1
  246. data/man/man8/puppet-ssl.8 +2 -2
  247. data/man/man8/puppet-status.8 +1 -1
  248. data/man/man8/puppet.8 +2 -2
  249. data/spec/fixtures/integration/application/apply/environments/spec/modules/amod/lib/puppet/provider/applytest/applytest.rb +2 -0
  250. data/spec/fixtures/integration/application/apply/environments/spec/modules/amod/lib/puppet/type/applytest.rb +25 -0
  251. data/spec/fixtures/ssl/unknown-127.0.0.1-key.pem +67 -0
  252. data/spec/fixtures/ssl/unknown-127.0.0.1.pem +48 -0
  253. data/spec/fixtures/ssl/unknown-ca-key.pem +67 -0
  254. data/spec/fixtures/ssl/unknown-ca.pem +59 -0
  255. data/spec/fixtures/unit/forge/bacula-releases.json +128 -0
  256. data/spec/fixtures/unit/forge/bacula.tar.gz +0 -0
  257. data/spec/fixtures/unit/provider/package/dnfmodule/{dnf-module-list-installed.txt → dnf-module-list.txt} +8 -0
  258. data/spec/fixtures/unit/provider/package/pkgng/pkg.version +2 -0
  259. data/spec/fixtures/unit/provider/package/yum/yum-check-update-subscription-manager.txt +9 -0
  260. data/spec/fixtures/unit/provider/package/zypper/zypper-search-uninstalled.out +13 -0
  261. data/spec/fixtures/unit/provider/service/systemd/list_unit_files_services +9 -0
  262. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_fetch_if_not_on_the_local_disk.yml +1 -67
  263. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_not_update_if_content_on_disk_is_up-to-date.yml +1 -69
  264. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_update_if_content_differs_on_disk.yml +1 -69
  265. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_mtime_is_older_on_disk.yml +1 -67
  266. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_no_header_specified.yml +1 -65
  267. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_not_on_the_local_disk.yml +1 -67
  268. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_not_update_if_mtime_is_newer_on_disk.yml +1 -67
  269. data/spec/integration/application/agent_spec.rb +475 -0
  270. data/spec/integration/application/apply_spec.rb +279 -150
  271. data/spec/integration/application/config_spec.rb +74 -0
  272. data/spec/integration/application/doc_spec.rb +16 -6
  273. data/spec/integration/application/filebucket_spec.rb +239 -0
  274. data/spec/integration/application/help_spec.rb +42 -0
  275. data/spec/integration/application/lookup_spec.rb +13 -0
  276. data/spec/integration/application/module_spec.rb +68 -0
  277. data/spec/integration/application/plugin_spec.rb +123 -0
  278. data/spec/integration/data_binding_spec.rb +82 -0
  279. data/spec/integration/defaults_spec.rb +1 -2
  280. data/spec/integration/directory_environments_spec.rb +17 -17
  281. data/spec/integration/http/client_spec.rb +47 -37
  282. data/spec/integration/indirector/facts/facter_spec.rb +8 -6
  283. data/spec/integration/indirector/report/yaml.rb +83 -0
  284. data/spec/integration/network/http_pool_spec.rb +93 -20
  285. data/spec/integration/node/environment_spec.rb +15 -0
  286. data/spec/integration/parser/compiler_spec.rb +11 -0
  287. data/spec/integration/type/file_spec.rb +1 -1
  288. data/spec/integration/util/execution_spec.rb +22 -0
  289. data/spec/integration/util/windows/adsi_spec.rb +6 -1
  290. data/spec/integration/util/windows/monkey_patches/dir_spec.rb +11 -0
  291. data/spec/integration/util/windows/process_spec.rb +26 -32
  292. data/spec/integration/util/windows/registry_spec.rb +7 -7
  293. data/spec/integration/util/windows/user_spec.rb +47 -5
  294. data/spec/integration/util_spec.rb +7 -33
  295. data/spec/lib/puppet/test_ca.rb +2 -2
  296. data/spec/lib/puppet_spec/https.rb +16 -7
  297. data/spec/lib/puppet_spec/matchers.rb +0 -80
  298. data/spec/lib/puppet_spec/puppetserver.rb +127 -0
  299. data/spec/shared_contexts/https.rb +29 -0
  300. data/spec/unit/agent_spec.rb +80 -26
  301. data/spec/unit/application/agent_spec.rb +12 -9
  302. data/spec/unit/application/describe_spec.rb +88 -50
  303. data/spec/unit/application/device_spec.rb +2 -2
  304. data/spec/unit/application/face_base_spec.rb +6 -4
  305. data/spec/unit/application/facts_spec.rb +39 -10
  306. data/spec/unit/application/filebucket_spec.rb +22 -2
  307. data/spec/unit/application/man_spec.rb +52 -0
  308. data/spec/unit/application/resource_spec.rb +3 -1
  309. data/spec/unit/application/ssl_spec.rb +15 -2
  310. data/spec/unit/configurer/downloader_spec.rb +10 -0
  311. data/spec/unit/configurer/fact_handler_spec.rb +4 -4
  312. data/spec/unit/configurer/plugin_handler_spec.rb +36 -19
  313. data/spec/unit/configurer_spec.rb +64 -46
  314. data/spec/unit/confine_spec.rb +2 -1
  315. data/spec/unit/context/trusted_information_spec.rb +25 -2
  316. data/spec/unit/daemon_spec.rb +5 -64
  317. data/spec/unit/defaults_spec.rb +24 -1
  318. data/spec/unit/environments_spec.rb +8 -0
  319. data/spec/unit/face/config_spec.rb +3 -1
  320. data/spec/unit/face/module/search_spec.rb +17 -0
  321. data/spec/unit/face/plugin_spec.rb +12 -10
  322. data/spec/unit/file_serving/http_metadata_spec.rb +37 -14
  323. data/spec/unit/file_serving/mount/locales_spec.rb +2 -2
  324. data/spec/unit/file_serving/mount/pluginfacts_spec.rb +2 -2
  325. data/spec/unit/file_serving/mount/plugins_spec.rb +2 -2
  326. data/spec/unit/file_serving/terminus_selector_spec.rb +45 -26
  327. data/spec/unit/file_system/uniquefile_spec.rb +29 -0
  328. data/spec/unit/file_system_spec.rb +10 -0
  329. data/spec/unit/functions/lookup_spec.rb +13 -0
  330. data/spec/unit/http/client_spec.rb +321 -36
  331. data/spec/unit/http/external_client_spec.rb +201 -0
  332. data/spec/unit/http/resolver_spec.rb +34 -3
  333. data/spec/unit/http/response_spec.rb +75 -0
  334. data/spec/unit/http/service/ca_spec.rb +53 -12
  335. data/spec/unit/http/service/compiler_spec.rb +332 -28
  336. data/spec/unit/http/service/file_server_spec.rb +100 -12
  337. data/spec/unit/http/service/report_spec.rb +19 -9
  338. data/spec/unit/http/service_spec.rb +94 -6
  339. data/spec/unit/http/session_spec.rb +159 -8
  340. data/spec/unit/indirector/catalog/compiler_spec.rb +1 -0
  341. data/spec/unit/indirector/catalog/rest_spec.rb +59 -2
  342. data/spec/unit/indirector/facts/rest_spec.rb +79 -24
  343. data/spec/unit/indirector/file_bucket_file/rest_spec.rb +82 -2
  344. data/spec/unit/indirector/file_content/rest_spec.rb +53 -2
  345. data/spec/unit/indirector/file_metadata/http_spec.rb +194 -0
  346. data/spec/unit/indirector/file_metadata/rest_spec.rb +110 -2
  347. data/spec/unit/indirector/node/rest_spec.rb +57 -2
  348. data/spec/unit/indirector/report/rest_spec.rb +58 -51
  349. data/spec/unit/indirector/request_spec.rb +1 -1
  350. data/spec/unit/indirector/resource/ral_spec.rb +7 -8
  351. data/spec/unit/indirector/rest_spec.rb +13 -0
  352. data/spec/unit/indirector/status/rest_spec.rb +43 -2
  353. data/spec/unit/interface_spec.rb +3 -3
  354. data/spec/unit/module_tool/tar/mini_spec.rb +20 -0
  355. data/spec/unit/network/format_support_spec.rb +3 -2
  356. data/spec/unit/network/http/api/indirected_routes_spec.rb +2 -1
  357. data/spec/unit/network/http/connection_spec.rb +552 -190
  358. data/spec/unit/network/http/nocache_pool_spec.rb +22 -0
  359. data/spec/unit/network/http/pool_spec.rb +59 -13
  360. data/spec/unit/network/http_pool_spec.rb +63 -57
  361. data/spec/unit/network/http_spec.rb +1 -1
  362. data/spec/unit/node/environment_spec.rb +33 -0
  363. data/spec/unit/parser/ast/block_expression_spec.rb +1 -1
  364. data/spec/unit/parser/environment_compiler_spec.rb +7 -0
  365. data/spec/unit/parser/scope_spec.rb +1 -1
  366. data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +15 -1
  367. data/spec/unit/pops/loaders/loaders_spec.rb +71 -1
  368. data/spec/unit/pops/lookup/lookup_spec.rb +25 -0
  369. data/spec/unit/pops/types/type_calculator_spec.rb +1 -11
  370. data/spec/unit/provider/group/groupadd_spec.rb +22 -8
  371. data/spec/unit/provider/group/windows_adsi_spec.rb +43 -10
  372. data/spec/unit/provider/package/aix_spec.rb +29 -0
  373. data/spec/unit/provider/package/apt_spec.rb +107 -0
  374. data/spec/unit/provider/package/aptitude_spec.rb +1 -0
  375. data/spec/unit/provider/package/dnfmodule_spec.rb +54 -15
  376. data/spec/unit/provider/package/gem_spec.rb +40 -0
  377. data/spec/unit/provider/package/pacman_spec.rb +6 -21
  378. data/spec/unit/provider/package/pip_spec.rb +68 -19
  379. data/spec/unit/provider/package/pkgdmg_spec.rb +1 -1
  380. data/spec/unit/provider/package/pkgng_spec.rb +38 -0
  381. data/spec/unit/provider/package/portage_spec.rb +5 -0
  382. data/spec/unit/provider/package/puppet_gem_spec.rb +12 -1
  383. data/spec/unit/provider/package/rpm_spec.rb +0 -212
  384. data/spec/unit/provider/package/yum_spec.rb +243 -1
  385. data/spec/unit/provider/package/zypper_spec.rb +98 -0
  386. data/spec/unit/provider/service/init_spec.rb +42 -0
  387. data/spec/unit/provider/service/openbsd_spec.rb +9 -0
  388. data/spec/unit/provider/service/openwrt_spec.rb +1 -0
  389. data/spec/unit/provider/service/redhat_spec.rb +9 -0
  390. data/spec/unit/provider/service/systemd_spec.rb +93 -18
  391. data/spec/unit/provider/service/windows_spec.rb +50 -14
  392. data/spec/unit/provider/user/openbsd_spec.rb +1 -0
  393. data/spec/unit/provider/user/useradd_spec.rb +30 -16
  394. data/spec/unit/provider/user/windows_adsi_spec.rb +85 -3
  395. data/spec/unit/puppet_pal_2pec.rb +11 -0
  396. data/spec/unit/puppet_pal_catalog_spec.rb +43 -0
  397. data/spec/unit/puppet_spec.rb +33 -0
  398. data/spec/unit/reports/http_spec.rb +70 -52
  399. data/spec/unit/reports/store_spec.rb +17 -13
  400. data/spec/unit/resource_spec.rb +3 -3
  401. data/spec/unit/settings/autosign_setting_spec.rb +1 -1
  402. data/spec/unit/settings/http_extra_headers_spec.rb +64 -0
  403. data/spec/unit/ssl/host_spec.rb +4 -2
  404. data/spec/unit/ssl/oids_spec.rb +1 -0
  405. data/spec/unit/ssl/ssl_provider_spec.rb +69 -43
  406. data/spec/unit/ssl/state_machine_spec.rb +99 -13
  407. data/spec/unit/test/test_helper_spec.rb +17 -0
  408. data/spec/unit/transaction/persistence_spec.rb +15 -0
  409. data/spec/unit/transaction/report_spec.rb +5 -1
  410. data/spec/unit/transaction_spec.rb +0 -2
  411. data/spec/unit/type/file/ensure_spec.rb +1 -2
  412. data/spec/unit/type/file/source_spec.rb +89 -38
  413. data/spec/unit/type/file_spec.rb +122 -96
  414. data/spec/unit/type/service_spec.rb +218 -8
  415. data/spec/unit/type/user_spec.rb +32 -3
  416. data/spec/unit/type_spec.rb +50 -0
  417. data/spec/unit/util/at_fork_spec.rb +3 -2
  418. data/spec/unit/util/autoload_spec.rb +2 -1
  419. data/spec/unit/util/character_encoding_spec.rb +4 -4
  420. data/spec/unit/util/checksums_spec.rb +16 -0
  421. data/spec/unit/util/command_line_spec.rb +11 -6
  422. data/spec/unit/util/log/destinations_spec.rb +1 -29
  423. data/spec/unit/util/package/version/debian_spec.rb +83 -0
  424. data/spec/unit/util/package/version/pip_spec.rb +464 -0
  425. data/spec/unit/util/package/version/range_spec.rb +175 -0
  426. data/spec/unit/util/package/version/rpm_spec.rb +121 -0
  427. data/spec/unit/util/pidlock_spec.rb +102 -54
  428. data/spec/unit/util/rpm_compare_spec.rb +196 -0
  429. data/spec/unit/util/windows/adsi_spec.rb +4 -4
  430. data/spec/unit/util/windows/api_types_spec.rb +104 -40
  431. data/spec/unit/util/windows/service_spec.rb +4 -4
  432. data/spec/unit/util/windows/sid_spec.rb +2 -2
  433. data/spec/unit/util_spec.rb +3 -3
  434. data/spec/unit/x509/cert_provider_spec.rb +1 -1
  435. data/tasks/generate_cert_fixtures.rake +15 -1
  436. data/tasks/manpages.rake +5 -35
  437. metadata +84 -52
  438. data/COMMITTERS.md +0 -244
  439. data/spec/integration/faces/config_spec.rb +0 -91
  440. data/spec/integration/faces/documentation_spec.rb +0 -57
  441. data/spec/integration/faces/plugin_spec.rb +0 -61
  442. data/spec/integration/file_bucket/file_spec.rb +0 -50
  443. data/spec/integration/file_serving/content_spec.rb +0 -7
  444. data/spec/integration/file_serving/fileset_spec.rb +0 -12
  445. data/spec/integration/file_serving/metadata_spec.rb +0 -8
  446. data/spec/integration/file_serving/terminus_helper_spec.rb +0 -20
  447. data/spec/integration/file_system/uniquefile_spec.rb +0 -26
  448. data/spec/integration/module_tool/forge_spec.rb +0 -64
  449. data/spec/integration/module_tool/tar/mini_spec.rb +0 -28
  450. data/spec/integration/provider/service/init_spec.rb +0 -48
  451. data/spec/integration/provider/service/systemd_spec.rb +0 -25
  452. data/spec/integration/provider/service/windows_spec.rb +0 -50
  453. data/spec/integration/reference/providers_spec.rb +0 -21
  454. data/spec/integration/reports_spec.rb +0 -13
  455. data/spec/integration/ssl/certificate_request_spec.rb +0 -44
  456. data/spec/integration/ssl/host_spec.rb +0 -72
  457. data/spec/integration/ssl/key_spec.rb +0 -99
  458. data/spec/integration/test/test_helper_spec.rb +0 -31
  459. data/spec/shared_behaviours/file_serving_model.rb +0 -51
  460. data/spec/unit/face/man_spec.rb +0 -25
  461. data/spec/unit/man_spec.rb +0 -31
@@ -176,6 +176,19 @@ describe Puppet::Type.type(:package).provider(:zypper) do
176
176
  @provider.install
177
177
  end
178
178
 
179
+ it "should install the package with --no-gpg-checks" do
180
+ allow(@resource).to receive(:[]).with(:name).and_return("php5")
181
+ allow(@resource).to receive(:[]).with(:install_options).and_return(['--no-gpg-checks', {'-p' => '/vagrant/files/localrepo/'}])
182
+ allow(@resource).to receive(:should).with(:ensure).and_return("5.4.10-4.5.6")
183
+ allow(@resource).to receive(:allow_virtual?).and_return(false)
184
+ allow(@provider).to receive(:zypper_version).and_return("1.2.8")
185
+
186
+ expect(@provider).to receive(:zypper).with('--quiet', '--no-gpg-checks', :install,
187
+ '--auto-agree-with-licenses', '--no-confirm', '-p=/vagrant/files/localrepo/', 'php5-5.4.10-4.5.6')
188
+ expect(@provider).to receive(:query).and_return("php5 0 5.4.10 4.5.6 x86_64")
189
+ @provider.install
190
+ end
191
+
179
192
  it "should install package with hash install options" do
180
193
  allow(@resource).to receive(:[]).with(:name).and_return('vim')
181
194
  allow(@resource).to receive(:[]).with(:install_options).and_return([{ '--a' => 'foo', '--b' => '"quoted bar"' }])
@@ -226,4 +239,89 @@ describe Puppet::Type.type(:package).provider(:zypper) do
226
239
  @provider.uninstall
227
240
  end
228
241
  end
242
+
243
+ context 'when installing with VersionRange' do
244
+ let(:search_output) { File.read(my_fixture('zypper-search-uninstalled.out')) }
245
+
246
+ before(:each) do
247
+ allow(@resource).to receive(:[]).with(:name).and_return('vim')
248
+ allow(@resource).to receive(:allow_virtual?).and_return(false)
249
+ allow(@provider).to receive(:zypper_version).and_return('1.0.2')
250
+
251
+ expect(@provider).to receive(:zypper).with('search', '--match-exact', '--type', 'package', '--uninstalled-only', '-s', 'vim')
252
+ .and_return(search_output)
253
+ end
254
+
255
+ it 'does install the package if version is available' do
256
+ expect(@resource).to receive(:should).with(:ensure).and_return('>1.0')
257
+
258
+ expect(@provider).to receive(:zypper).with('--quiet', :install, '--auto-agree-with-licenses', '--no-confirm', 'vim-1.0.20040813-19.9')
259
+ expect(@provider).to receive(:query).and_return('vim 0 1.0.20040813 19.9 x86_64')
260
+
261
+ @provider.install
262
+ end
263
+
264
+ it 'does consider range as version if version in range is not available' do
265
+ allow(@resource).to receive(:should).with(:ensure).and_return('>2.0')
266
+
267
+ expect(@provider).to receive(:zypper).with('--quiet', :install, '--auto-agree-with-licenses', '--no-confirm', 'vim->2.0')
268
+ .and_raise(Puppet::ExecutionFailure.new('My Error'))
269
+
270
+ expect { @provider.install }.to raise_error(Puppet::ExecutionFailure, 'My Error')
271
+ end
272
+ end
273
+
274
+ describe 'insync?' do
275
+ subject { @provider.insync?('1.19-2') }
276
+
277
+ context 'when versions are matching' do
278
+ before { allow(@resource).to receive(:[]).with(:ensure).and_return('1.19-2') }
279
+
280
+ it { is_expected.to be true }
281
+ end
282
+
283
+ context 'when version are not matching' do
284
+ before { allow(@resource).to receive(:[]).with(:ensure).and_return('1.19-3') }
285
+
286
+ it { is_expected.to be false }
287
+ end
288
+
289
+ context 'when version is in gt range' do
290
+ before { allow(@resource).to receive(:[]).with(:ensure).and_return('>1.19-0') }
291
+
292
+ it { is_expected.to be true }
293
+ end
294
+
295
+ context 'when version is not in gt range' do
296
+ before { allow(@resource).to receive(:[]).with(:ensure).and_return('>1.19-2') }
297
+
298
+ it { is_expected.to be false }
299
+ end
300
+
301
+ context 'when version is in min-max range' do
302
+ before { allow(@resource).to receive(:[]).with(:ensure).and_return('>1.19-0 <1.19-3') }
303
+
304
+ it { is_expected.to be true }
305
+ end
306
+
307
+ context 'when version is not in min-max range' do
308
+ before { allow(@resource).to receive(:[]).with(:ensure).and_return('>1.19-0 <1.19-2') }
309
+
310
+ it { is_expected.to be false }
311
+ end
312
+
313
+ context 'when using eq range' do
314
+ context 'when ensure without release' do
315
+ before { allow(@resource).to receive(:[]).with(:ensure).and_return('1.19') }
316
+
317
+ it { is_expected.to be true }
318
+ end
319
+
320
+ context 'when ensure with release' do
321
+ before { allow(@resource).to receive(:[]).with(:ensure).and_return('1.19-2') }
322
+
323
+ it { is_expected.to be true }
324
+ end
325
+ end
326
+ end
229
327
  end
@@ -38,6 +38,47 @@ describe 'Puppet::Type::Service::Provider::Init', unless: Puppet::Util::Platform
38
38
  %w{functions.sh reboot.sh shutdown.sh functions halt killall single linuxconf reboot boot wait-for-state rcS module-init-tools}
39
39
  end
40
40
 
41
+ describe "when running on FreeBSD" do
42
+ before :each do
43
+ allow(Facter).to receive(:value).with(:operatingsystem).and_return('FreeBSD')
44
+ allow(Facter).to receive(:value).with(:osfamily).and_return('FreeBSD')
45
+ end
46
+
47
+ it "should set its default path to include /etc/rc.d and /usr/local/etc/rc.d" do
48
+ expect(provider_class.defpath).to eq(["/etc/rc.d", "/usr/local/etc/rc.d"])
49
+ end
50
+ end
51
+
52
+ describe "when running on HP-UX" do
53
+ before :each do
54
+ allow(Facter).to receive(:value).with(:operatingsystem).and_return('HP-UX')
55
+ end
56
+
57
+ it "should set its default path to include /sbin/init.d" do
58
+ expect(provider_class.defpath).to eq("/sbin/init.d")
59
+ end
60
+ end
61
+
62
+ describe "when running on Archlinux" do
63
+ before :each do
64
+ allow(Facter).to receive(:value).with(:operatingsystem).and_return('Archlinux')
65
+ end
66
+
67
+ it "should set its default path to include /etc/rc.d" do
68
+ expect(provider_class.defpath).to eq("/etc/rc.d")
69
+ end
70
+ end
71
+
72
+ describe "when not running on FreeBSD, HP-UX or Archlinux" do
73
+ before :each do
74
+ allow(Facter).to receive(:value).with(:operatingsystem).and_return('RedHat')
75
+ end
76
+
77
+ it "should set its default path to include /etc/init.d" do
78
+ expect(provider_class.defpath).to eq("/etc/init.d")
79
+ end
80
+ end
81
+
41
82
  describe "when getting all service instances" do
42
83
  before :each do
43
84
  allow(provider_class).to receive(:defpath).and_return('tmp')
@@ -150,6 +191,7 @@ describe 'Puppet::Type::Service::Provider::Init', unless: Puppet::Util::Platform
150
191
 
151
192
  describe "if the init script is present" do
152
193
  before :each do
194
+ allow(File).to receive(:directory?).and_call_original
153
195
  allow(File).to receive(:directory?).with("/service/path").and_return(true)
154
196
  allow(File).to receive(:directory?).with("/alt/service/path").and_return(true)
155
197
  allow(Puppet::FileSystem).to receive(:exist?).with("/service/path/myservice").and_return(true)
@@ -12,6 +12,15 @@ describe 'Puppet::Type::Service::Provider::Openbsd',
12
12
  allow(FileTest).to receive(:executable?).with('/usr/sbin/rcctl').and_return(true)
13
13
  end
14
14
 
15
+ # `execute` and `texecute` start a new process, consequently setting $CHILD_STATUS to a Process::Status instance,
16
+ # but because they are mocked, an external process is never executed and $CHILD_STATUS remain nil.
17
+ # In order to execute some parts of the code under test and to mock $CHILD_STATUS, we need this variable to be a
18
+ # Process::Status instance. We can achieve this by starting a process that does nothing (exit 0). By doing this,
19
+ # $CHILD_STATUS will be initialised with a instance of Process::Status and we will be able to mock it.
20
+ before(:all) do
21
+ `exit 0`
22
+ end
23
+
15
24
  context "#instances" do
16
25
  it "should have an instances method" do
17
26
  expect(provider_class).to respond_to :instances
@@ -28,6 +28,7 @@ describe 'Puppet::Type::Service::Provider::Openwrt',
28
28
  allow(FileTest).to receive(:executable?).with('/etc/rc.common').and_return(true)
29
29
 
30
30
  # All OpenWrt tests operate on the init script directly. It must exist.
31
+ allow(File).to receive(:directory?).and_call_original
31
32
  allow(File).to receive(:directory?).with('/etc/init.d').and_return(true)
32
33
 
33
34
  allow(Puppet::FileSystem).to receive(:exist?).with('/etc/init.d/myservice').and_return(true)
@@ -4,6 +4,15 @@ describe 'Puppet::Type::Service::Provider::Redhat',
4
4
  if: Puppet.features.posix? && !Puppet::Util::Platform.jruby?do
5
5
  let(:provider_class) { Puppet::Type.type(:service).provider(:redhat) }
6
6
 
7
+ # `execute` and `texecute` start a new process, consequently setting $CHILD_STATUS to a Process::Status instance,
8
+ # but because they are mocked, an external process is never executed and $CHILD_STATUS remain nil.
9
+ # In order to execute some parts of the code under test and to mock $CHILD_STATUS, we need this variable to be a
10
+ # Process::Status instance. We can achieve this by starting a process that does nothing (exit 0). By doing this,
11
+ # $CHILD_STATUS will be initialised with a instance of Process::Status and we will be able to mock it.
12
+ before(:all) do
13
+ `exit 0`
14
+ end
15
+
7
16
  before :each do
8
17
  @class = Puppet::Type.type(:service).provider(:redhat)
9
18
  @resource = double('resource')
@@ -1,18 +1,22 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe 'Puppet::Type::Service::Provider::Systemd', unless: Puppet::Util::Platform.jruby? do
3
+ describe 'Puppet::Type::Service::Provider::Systemd', unless: Puppet::Util::Platform.jruby? || Puppet::Util::Platform.windows? do
4
4
  let(:provider_class) { Puppet::Type.type(:service).provider(:systemd) }
5
- if Puppet::Util::Platform.windows?
6
- # Get a pid for $CHILD_STATUS to latch on to
7
- command = "cmd.exe /c \"exit 0\""
8
- Puppet::Util::Execution.execute(command, {:failonfail => false})
9
- end
10
5
 
11
6
  before :each do
12
7
  allow(Puppet::Type.type(:service)).to receive(:defaultprovider).and_return(provider_class)
13
8
  allow(provider_class).to receive(:which).with('systemctl').and_return('/bin/systemctl')
14
9
  end
15
10
 
11
+ # `execute` and `texecute` start a new process, consequently setting $CHILD_STATUS to a Process::Status instance,
12
+ # but because they are mocked, an external process is never executed and $CHILD_STATUS remain nil.
13
+ # In order to execute some parts of the code under test and to mock $CHILD_STATUS, we need this variable to be a
14
+ # Process::Status instance. We can achieve this by starting a process that does nothing (exit 0). By doing this,
15
+ # $CHILD_STATUS will be initialised with a instance of Process::Status and we will be able to mock it.
16
+ before(:all) do
17
+ `exit 0`
18
+ end
19
+
16
20
  let :provider do
17
21
  provider_class.new(:name => 'sshd.service')
18
22
  end
@@ -187,8 +191,18 @@ describe 'Puppet::Type::Service::Provider::Systemd', unless: Puppet::Util::Platf
187
191
  autovt@.service
188
192
  avahi-daemon.service
189
193
  blk-availability.service
194
+ apparmor.service
195
+ umountnfs.service
196
+ urandom.service
197
+ brandbot.service
190
198
  })
191
199
  end
200
+
201
+ it "should print a debug message when a service with the state `bad` is found" do
202
+ expect(provider_class).to receive(:systemctl).with('list-unit-files', '--type', 'service', '--full', '--all', '--no-pager').and_return(File.read(my_fixture('list_unit_files_services')))
203
+ expect(Puppet).to receive(:debug).with("apparmor.service marked as bad by `systemctl`. It is recommended to be further checked.")
204
+ provider_class.instances
205
+ end
192
206
  end
193
207
 
194
208
  describe "#start" do
@@ -269,43 +283,43 @@ Jun 14 21:43:23 foo.example.com systemd[1]: sshd.service lacks both ExecStart= a
269
283
  describe "#enabled?" do
270
284
  it "should return :true if the service is enabled" do
271
285
  provider = provider_class.new(Puppet::Type.type(:service).new(:name => 'sshd.service'))
272
- expect(provider).to receive(:execute).with(['/bin/systemctl','is-enabled', '--', 'sshd.service'], :failonfail => false).and_return("enabled\n")
273
- allow($CHILD_STATUS).to receive(:exitstatus).and_return(0)
286
+ expect(provider).to receive(:execute).with(['/bin/systemctl','is-enabled', '--', 'sshd.service'], :failonfail => false).
287
+ and_return(Puppet::Util::Execution::ProcessOutput.new("enabled\n", 0))
274
288
  expect(provider.enabled?).to eq(:true)
275
289
  end
276
290
 
277
291
  it "should return :true if the service is static" do
278
292
  provider = provider_class.new(Puppet::Type.type(:service).new(:name => 'sshd.service'))
279
- expect(provider).to receive(:execute).with(['/bin/systemctl','is-enabled','--', 'sshd.service'], :failonfail => false).and_return("static\n")
280
- allow($CHILD_STATUS).to receive(:exitstatus).and_return(0)
293
+ expect(provider).to receive(:execute).with(['/bin/systemctl','is-enabled','--', 'sshd.service'], :failonfail => false).
294
+ and_return(Puppet::Util::Execution::ProcessOutput.new("static\n", 0))
281
295
  expect(provider.enabled?).to eq(:true)
282
296
  end
283
297
 
284
298
  it "should return :false if the service is disabled" do
285
299
  provider = provider_class.new(Puppet::Type.type(:service).new(:name => 'sshd.service'))
286
- expect(provider).to receive(:execute).with(['/bin/systemctl','is-enabled', '--', 'sshd.service'], :failonfail => false).and_return("disabled\n")
287
- allow($CHILD_STATUS).to receive(:exitstatus).and_return(1)
300
+ expect(provider).to receive(:execute).with(['/bin/systemctl','is-enabled', '--', 'sshd.service'], :failonfail => false).
301
+ and_return(Puppet::Util::Execution::ProcessOutput.new("disabled\n", 1))
288
302
  expect(provider.enabled?).to eq(:false)
289
303
  end
290
304
 
291
305
  it "should return :false if the service is indirect" do
292
306
  provider = provider_class.new(Puppet::Type.type(:service).new(:name => 'sshd.service'))
293
- expect(provider).to receive(:execute).with(['/bin/systemctl','is-enabled', '--', 'sshd.service'], :failonfail => false).and_return("indirect\n")
294
- allow($CHILD_STATUS).to receive(:exitstatus).and_return(0)
307
+ expect(provider).to receive(:execute).with(['/bin/systemctl','is-enabled', '--', 'sshd.service'], :failonfail => false).
308
+ and_return(Puppet::Util::Execution::ProcessOutput.new("indirect\n", 0))
295
309
  expect(provider.enabled?).to eq(:false)
296
310
  end
297
311
 
298
312
  it "should return :false if the service is masked and the resource is attempting to be disabled" do
299
313
  provider = provider_class.new(Puppet::Type.type(:service).new(:name => 'sshd.service', :enable => false))
300
- expect(provider).to receive(:execute).with(['/bin/systemctl','is-enabled', '--', 'sshd.service'], :failonfail => false).and_return("masked\n")
301
- allow($CHILD_STATUS).to receive(:exitstatus).and_return(1)
314
+ expect(provider).to receive(:execute).with(['/bin/systemctl','is-enabled', '--', 'sshd.service'], :failonfail => false).
315
+ and_return(Puppet::Util::Execution::ProcessOutput.new("masked\n", 1))
302
316
  expect(provider.enabled?).to eq(:false)
303
317
  end
304
318
 
305
319
  it "should return :mask if the service is masked and the resource is attempting to be masked" do
306
320
  provider = provider_class.new(Puppet::Type.type(:service).new(:name => 'sshd.service', :enable => 'mask'))
307
- expect(provider).to receive(:execute).with(['/bin/systemctl','is-enabled', '--', 'sshd.service'], :failonfail => false).and_return("masked\n")
308
- allow($CHILD_STATUS).to receive(:exitstatus).and_return(1)
321
+ expect(provider).to receive(:execute).with(['/bin/systemctl','is-enabled', '--', 'sshd.service'], :failonfail => false).
322
+ and_return(Puppet::Util::Execution::ProcessOutput.new("masked\n", 1))
309
323
  expect(provider.enabled?).to eq(:mask)
310
324
  end
311
325
  end
@@ -428,6 +442,67 @@ Jun 14 21:43:23 foo.example.com systemd[1]: sshd.service lacks both ExecStart= a
428
442
  end
429
443
  end
430
444
 
445
+ describe "#insync_enabled?" do
446
+ let(:provider) do
447
+ provider_class.new(Puppet::Type.type(:service).new(:name => 'sshd.service', :enable => false))
448
+ end
449
+
450
+ before do
451
+ allow(provider).to receive(:cached_enabled?).and_return({ output: service_state, exitcode: 0 })
452
+ end
453
+
454
+ context 'when service state is static' do
455
+ let(:service_state) { 'static' }
456
+
457
+ it 'is always enabled_insync even if current value is the same as expected' do
458
+ expect(provider).to be_enabled_insync(:false)
459
+ end
460
+
461
+ it 'is always enabled_insync even if current value is not the same as expected' do
462
+ expect(provider).to be_enabled_insync(:true)
463
+ end
464
+
465
+ it 'logs a debug messsage' do
466
+ expect(Puppet).to receive(:debug).with("Unable to enable or disable static service sshd.service")
467
+ provider.enabled_insync?(:true)
468
+ end
469
+ end
470
+
471
+ context 'when service state is indirect' do
472
+ let(:service_state) { 'indirect' }
473
+
474
+ it 'is always enabled_insync even if current value is the same as expected' do
475
+ expect(provider).to be_enabled_insync(:false)
476
+ end
477
+
478
+ it 'is always enabled_insync even if current value is not the same as expected' do
479
+ expect(provider).to be_enabled_insync(:true)
480
+ end
481
+
482
+ it 'logs a debug messsage' do
483
+ expect(Puppet).to receive(:debug).with("Service sshd.service is in 'indirect' state and cannot be enabled/disabled")
484
+ provider.enabled_insync?(:true)
485
+ end
486
+ end
487
+
488
+ context 'when service state is enabled' do
489
+ let(:service_state) { 'enabled' }
490
+
491
+ it 'is enabled_insync if current value is the same as expected' do
492
+ expect(provider).to be_enabled_insync(:false)
493
+ end
494
+
495
+ it 'is not enabled_insync if current value is not the same as expected' do
496
+ expect(provider).not_to be_enabled_insync(:true)
497
+ end
498
+
499
+ it 'logs no debug messsage' do
500
+ expect(Puppet).not_to receive(:debug)
501
+ provider.enabled_insync?(:true)
502
+ end
503
+ end
504
+ end
505
+
431
506
  describe "#get_start_link_count" do
432
507
  it "should strip the '.service' from the search if present in the resource name" do
433
508
  provider = provider_class.new(Puppet::Type.type(:service).new(:name => 'sshd.service'))
@@ -58,7 +58,7 @@ describe 'Puppet::Type::Service::Provider::Windows',
58
58
  it "should enable if managing enable and enable is true" do
59
59
  resource[:enable] = :true
60
60
  expect(service_util).to receive(:start)
61
- expect(service_util).to receive(:set_startup_mode).with(name, :SERVICE_AUTO_START)
61
+ expect(service_util).to receive(:set_startup_configuration).with(name, options: {startup_type: :SERVICE_AUTO_START})
62
62
 
63
63
  provider.start
64
64
  end
@@ -66,7 +66,7 @@ describe 'Puppet::Type::Service::Provider::Windows',
66
66
  it "should manual start if managing enable and enable is false" do
67
67
  resource[:enable] = :false
68
68
  expect(service_util).to receive(:start)
69
- expect(service_util).to receive(:set_startup_mode).with(name, :SERVICE_DEMAND_START)
69
+ expect(service_util).to receive(:set_startup_configuration).with(name, options: {startup_type: :SERVICE_DEMAND_START})
70
70
 
71
71
  provider.start
72
72
  end
@@ -88,6 +88,14 @@ describe 'Puppet::Type::Service::Provider::Windows',
88
88
  expect(provider.status).to eql(:stopped)
89
89
  end
90
90
 
91
+ it "should report service as stopped when status cannot be retrieved" do
92
+ allow(service_util).to receive(:exists?).with(resource[:name]).and_return(true)
93
+ allow(service_util).to receive(:service_state).with(name).and_raise(Puppet::Error.new('Service query failed: The specified path is invalid.'))
94
+
95
+ expect(Puppet).to receive(:warning).with("Status for service #{resource[:name]} could not be retrieved: Service query failed: The specified path is invalid.")
96
+ expect(provider.status).to eql(:stopped)
97
+ end
98
+
91
99
  [
92
100
  :SERVICE_PAUSED,
93
101
  :SERVICE_PAUSE_PENDING
@@ -119,6 +127,34 @@ describe 'Puppet::Type::Service::Provider::Windows',
119
127
  expect(provider.status).to eq(:running)
120
128
  end
121
129
  end
130
+
131
+ context 'when querying lmhosts', if: Puppet::Util::Platform.windows? do
132
+ # This service should be ubiquitous across all supported Windows platforms
133
+ let(:service) { Puppet::Type.type(:service).new(:name => 'lmhosts') }
134
+
135
+ before :each do
136
+ allow(service_util).to receive(:exists?).with(service.name).and_call_original
137
+ end
138
+
139
+ it "reports if the service is enabled" do
140
+ expect([:true, :false, :manual]).to include(service.provider.enabled?)
141
+ end
142
+
143
+ it "reports on the service status" do
144
+ expect(
145
+ [
146
+ :running,
147
+ :'continue pending',
148
+ :'pause pending',
149
+ :paused,
150
+ :running,
151
+ :'start pending',
152
+ :'stop pending',
153
+ :stopped
154
+ ]
155
+ ).to include(service.provider.status)
156
+ end
157
+ end
122
158
  end
123
159
 
124
160
  describe "#restart" do
@@ -178,12 +214,12 @@ describe 'Puppet::Type::Service::Provider::Windows',
178
214
 
179
215
  describe "#enable" do
180
216
  it "should set service start type to Service_Auto_Start when enabled" do
181
- expect(service_util).to receive(:set_startup_mode).with(name, :SERVICE_AUTO_START)
217
+ expect(service_util).to receive(:set_startup_configuration).with(name, options: {startup_type: :SERVICE_AUTO_START})
182
218
  provider.enable
183
219
  end
184
220
 
185
- it "raises an error if set_startup_mode fails" do
186
- expect(service_util).to receive(:set_startup_mode).with(name, :SERVICE_AUTO_START).and_raise(Puppet::Error.new('foobar'))
221
+ it "raises an error if set_startup_configuration fails" do
222
+ expect(service_util).to receive(:set_startup_configuration).with(name, options: {startup_type: :SERVICE_AUTO_START}).and_raise(Puppet::Error.new('foobar'))
187
223
 
188
224
  expect {
189
225
  provider.enable
@@ -193,12 +229,12 @@ describe 'Puppet::Type::Service::Provider::Windows',
193
229
 
194
230
  describe "#disable" do
195
231
  it "should set service start type to Service_Disabled when disabled" do
196
- expect(service_util).to receive(:set_startup_mode).with(name, :SERVICE_DISABLED)
232
+ expect(service_util).to receive(:set_startup_configuration).with(name, options: {startup_type: :SERVICE_DISABLED})
197
233
  provider.disable
198
234
  end
199
235
 
200
- it "raises an error if set_startup_mode fails" do
201
- expect(service_util).to receive(:set_startup_mode).with(name, :SERVICE_DISABLED).and_raise(Puppet::Error.new('foobar'))
236
+ it "raises an error if set_startup_configuration fails" do
237
+ expect(service_util).to receive(:set_startup_configuration).with(name, options: {startup_type: :SERVICE_DISABLED}).and_raise(Puppet::Error.new('foobar'))
202
238
 
203
239
  expect {
204
240
  provider.disable
@@ -208,12 +244,12 @@ describe 'Puppet::Type::Service::Provider::Windows',
208
244
 
209
245
  describe "#manual_start" do
210
246
  it "should set service start type to Service_Demand_Start (manual) when manual" do
211
- expect(service_util).to receive(:set_startup_mode).with(name, :SERVICE_DEMAND_START)
247
+ expect(service_util).to receive(:set_startup_configuration).with(name, options: {startup_type: :SERVICE_DEMAND_START})
212
248
  provider.manual_start
213
249
  end
214
250
 
215
- it "raises an error if set_startup_mode fails" do
216
- expect(service_util).to receive(:set_startup_mode).with(name, :SERVICE_DEMAND_START).and_raise(Puppet::Error.new('foobar'))
251
+ it "raises an error if set_startup_configuration fails" do
252
+ expect(service_util).to receive(:set_startup_configuration).with(name, options: {startup_type: :SERVICE_DEMAND_START}).and_raise(Puppet::Error.new('foobar'))
217
253
 
218
254
  expect {
219
255
  provider.manual_start
@@ -223,12 +259,12 @@ describe 'Puppet::Type::Service::Provider::Windows',
223
259
 
224
260
  describe "#delayed_start" do
225
261
  it "should set service start type to Service_Config_Delayed_Auto_Start (delayed) when delayed" do
226
- expect(service_util).to receive(:set_startup_mode).with(name, :SERVICE_AUTO_START, true)
262
+ expect(service_util).to receive(:set_startup_configuration).with(name, options: {startup_type: :SERVICE_AUTO_START, delayed: true})
227
263
  provider.delayed_start
228
264
  end
229
265
 
230
- it "raises an error if set_startup_mode fails" do
231
- expect(service_util).to receive(:set_startup_mode).with(name, :SERVICE_AUTO_START, true).and_raise(Puppet::Error.new('foobar'))
266
+ it "raises an error if set_startup_configuration fails" do
267
+ expect(service_util).to receive(:set_startup_configuration).with(name, options: {startup_type: :SERVICE_AUTO_START, delayed: true}).and_raise(Puppet::Error.new('foobar'))
232
268
 
233
269
  expect {
234
270
  provider.delayed_start