puppet 6.16.0 → 7.0.0

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 (645) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +5 -3
  3. data/Gemfile.lock +31 -33
  4. data/README.md +4 -5
  5. data/Rakefile +4 -12
  6. data/conf/fileserver.conf +5 -10
  7. data/ext/build_defaults.yaml +1 -1
  8. data/ext/osx/file_mapping.yaml +0 -5
  9. data/ext/project_data.yaml +1 -14
  10. data/ext/redhat/puppet.spec.erb +0 -1
  11. data/ext/windows/service/daemon.rb +6 -5
  12. data/install.rb +21 -17
  13. data/lib/puppet.rb +11 -20
  14. data/lib/puppet/agent.rb +2 -2
  15. data/lib/puppet/agent/locker.rb +0 -7
  16. data/lib/puppet/application.rb +172 -98
  17. data/lib/puppet/application/agent.rb +22 -6
  18. data/lib/puppet/application/apply.rb +18 -20
  19. data/lib/puppet/application/device.rb +100 -104
  20. data/lib/puppet/application/doc.rb +1 -1
  21. data/lib/puppet/application/filebucket.rb +15 -11
  22. data/lib/puppet/application/lookup.rb +16 -4
  23. data/lib/puppet/application/ssl.rb +1 -1
  24. data/lib/puppet/configurer.rb +66 -31
  25. data/lib/puppet/configurer/downloader.rb +31 -10
  26. data/lib/puppet/configurer/plugin_handler.rb +21 -19
  27. data/lib/puppet/confine.rb +2 -2
  28. data/lib/puppet/confine/any.rb +1 -1
  29. data/lib/puppet/defaults.rb +166 -169
  30. data/lib/puppet/environments.rb +41 -15
  31. data/lib/puppet/face/catalog.rb +1 -1
  32. data/lib/puppet/face/config.rb +56 -16
  33. data/lib/puppet/face/epp.rb +12 -2
  34. data/lib/puppet/face/facts.rb +66 -6
  35. data/lib/puppet/face/help.rb +1 -1
  36. data/lib/puppet/face/node.rb +3 -3
  37. data/lib/puppet/face/node/clean.rb +2 -2
  38. data/lib/puppet/face/plugin.rb +5 -8
  39. data/lib/puppet/feature/base.rb +1 -1
  40. data/lib/puppet/ffi/windows.rb +12 -0
  41. data/lib/puppet/ffi/windows/api_types.rb +311 -0
  42. data/lib/puppet/ffi/windows/constants.rb +404 -0
  43. data/lib/puppet/ffi/windows/functions.rb +628 -0
  44. data/lib/puppet/ffi/windows/structs.rb +338 -0
  45. data/lib/puppet/file_bucket/dipper.rb +1 -1
  46. data/lib/puppet/file_serving/configuration.rb +0 -5
  47. data/lib/puppet/file_serving/configuration/parser.rb +3 -32
  48. data/lib/puppet/file_serving/http_metadata.rb +13 -1
  49. data/lib/puppet/file_serving/metadata.rb +4 -1
  50. data/lib/puppet/file_serving/mount.rb +1 -2
  51. data/lib/puppet/file_serving/mount/locales.rb +1 -2
  52. data/lib/puppet/file_serving/mount/pluginfacts.rb +1 -2
  53. data/lib/puppet/file_serving/mount/plugins.rb +1 -2
  54. data/lib/puppet/file_serving/terminus_selector.rb +7 -8
  55. data/lib/puppet/file_system/file_impl.rb +4 -4
  56. data/lib/puppet/file_system/uniquefile.rb +8 -16
  57. data/lib/puppet/forge.rb +1 -1
  58. data/lib/puppet/forge/cache.rb +1 -1
  59. data/lib/puppet/forge/repository.rb +3 -8
  60. data/lib/puppet/functions/epp.rb +1 -0
  61. data/lib/puppet/functions/inline_epp.rb +1 -0
  62. data/lib/puppet/functions/lstrip.rb +4 -4
  63. data/lib/puppet/functions/new.rb +8 -3
  64. data/lib/puppet/functions/reverse_each.rb +1 -1
  65. data/lib/puppet/functions/rstrip.rb +4 -4
  66. data/lib/puppet/functions/step.rb +1 -1
  67. data/lib/puppet/functions/strip.rb +4 -4
  68. data/lib/puppet/generate/models/type/type.rb +4 -1
  69. data/lib/puppet/gettext/config.rb +5 -5
  70. data/lib/puppet/gettext/module_translations.rb +4 -4
  71. data/lib/puppet/http.rb +23 -13
  72. data/lib/puppet/http/client.rb +170 -115
  73. data/lib/puppet/{network/resolver.rb → http/dns.rb} +2 -2
  74. data/lib/puppet/http/errors.rb +16 -0
  75. data/lib/puppet/http/external_client.rb +5 -7
  76. data/lib/puppet/{network/http → http}/factory.rb +8 -11
  77. data/lib/puppet/{network/http → http}/pool.rb +61 -26
  78. data/lib/puppet/{network/http/session.rb → http/pool_entry.rb} +2 -3
  79. data/lib/puppet/http/proxy.rb +137 -0
  80. data/lib/puppet/http/redirector.rb +13 -19
  81. data/lib/puppet/http/resolver.rb +10 -23
  82. data/lib/puppet/http/resolver/server_list.rb +23 -45
  83. data/lib/puppet/http/resolver/settings.rb +7 -10
  84. data/lib/puppet/http/resolver/srv.rb +11 -15
  85. data/lib/puppet/http/response.rb +49 -48
  86. data/lib/puppet/http/response_converter.rb +24 -0
  87. data/lib/puppet/http/response_net_http.rb +42 -0
  88. data/lib/puppet/http/retry_after_handler.rb +4 -13
  89. data/lib/puppet/http/service.rb +15 -27
  90. data/lib/puppet/http/service/ca.rb +11 -22
  91. data/lib/puppet/http/service/compiler.rb +23 -70
  92. data/lib/puppet/http/service/file_server.rb +19 -28
  93. data/lib/puppet/http/service/puppetserver.rb +53 -0
  94. data/lib/puppet/http/service/report.rb +8 -10
  95. data/lib/puppet/http/session.rb +16 -24
  96. data/lib/puppet/{network/http → http}/site.rb +1 -2
  97. data/lib/puppet/indirector.rb +1 -1
  98. data/lib/puppet/indirector/catalog/compiler.rb +1 -1
  99. data/lib/puppet/indirector/catalog/rest.rb +2 -4
  100. data/lib/puppet/indirector/exec.rb +1 -1
  101. data/lib/puppet/indirector/fact_search.rb +60 -0
  102. data/lib/puppet/indirector/facts/facter.rb +27 -6
  103. data/lib/puppet/indirector/facts/json.rb +27 -0
  104. data/lib/puppet/indirector/facts/rest.rb +3 -22
  105. data/lib/puppet/indirector/facts/yaml.rb +4 -59
  106. data/lib/puppet/indirector/file_bucket_file/rest.rb +3 -9
  107. data/lib/puppet/indirector/file_content/rest.rb +3 -7
  108. data/lib/puppet/indirector/file_metadata/http.rb +25 -5
  109. data/lib/puppet/indirector/file_metadata/rest.rb +5 -11
  110. data/lib/puppet/indirector/file_server.rb +1 -8
  111. data/lib/puppet/indirector/generic_http.rb +0 -11
  112. data/lib/puppet/indirector/hiera.rb +4 -0
  113. data/lib/puppet/indirector/indirection.rb +1 -1
  114. data/lib/puppet/indirector/json.rb +5 -1
  115. data/lib/puppet/indirector/msgpack.rb +1 -1
  116. data/lib/puppet/indirector/node/json.rb +8 -0
  117. data/lib/puppet/indirector/node/rest.rb +2 -4
  118. data/lib/puppet/indirector/report/json.rb +34 -0
  119. data/lib/puppet/indirector/report/processor.rb +2 -2
  120. data/lib/puppet/indirector/report/rest.rb +3 -8
  121. data/lib/puppet/indirector/request.rb +2 -103
  122. data/lib/puppet/indirector/rest.rb +12 -263
  123. data/lib/puppet/indirector/yaml.rb +1 -1
  124. data/lib/puppet/module.rb +1 -2
  125. data/lib/puppet/module_tool/applications.rb +0 -1
  126. data/lib/puppet/network/authconfig.rb +2 -96
  127. data/lib/puppet/network/authorization.rb +13 -35
  128. data/lib/puppet/network/format_support.rb +2 -2
  129. data/lib/puppet/network/formats.rb +2 -1
  130. data/lib/puppet/network/http.rb +3 -3
  131. data/lib/puppet/network/http/api/indirected_routes.rb +3 -21
  132. data/lib/puppet/network/http/api/master/v3.rb +11 -13
  133. data/lib/puppet/network/http/api/master/v3/environments.rb +0 -1
  134. data/lib/puppet/network/http/connection.rb +247 -316
  135. data/lib/puppet/network/http/handler.rb +0 -1
  136. data/lib/puppet/network/http/route.rb +2 -2
  137. data/lib/puppet/network/http_pool.rb +16 -34
  138. data/lib/puppet/node.rb +1 -30
  139. data/lib/puppet/node/environment.rb +12 -5
  140. data/lib/puppet/node/facts.rb +17 -0
  141. data/lib/puppet/pal/json_catalog_encoder.rb +4 -0
  142. data/lib/puppet/pal/pal_impl.rb +93 -14
  143. data/lib/puppet/parameter.rb +1 -1
  144. data/lib/puppet/parser/ast/leaf.rb +5 -5
  145. data/lib/puppet/parser/ast/pops_bridge.rb +0 -42
  146. data/lib/puppet/parser/compiler.rb +1 -199
  147. data/lib/puppet/parser/compiler/catalog_validator/relationship_validator.rb +14 -39
  148. data/lib/puppet/parser/functions.rb +21 -17
  149. data/lib/puppet/parser/functions/create_resources.rb +11 -7
  150. data/lib/puppet/parser/resource.rb +3 -71
  151. data/lib/puppet/parser/resource/param.rb +6 -0
  152. data/lib/puppet/parser/type_loader.rb +2 -2
  153. data/lib/puppet/pops/adaptable.rb +7 -13
  154. data/lib/puppet/pops/adapters.rb +8 -4
  155. data/lib/puppet/pops/evaluator/collectors/abstract_collector.rb +1 -3
  156. data/lib/puppet/pops/evaluator/evaluator_impl.rb +27 -13
  157. data/lib/puppet/pops/evaluator/runtime3_converter.rb +2 -2
  158. data/lib/puppet/pops/evaluator/runtime3_resource_support.rb +3 -3
  159. data/lib/puppet/pops/evaluator/runtime3_support.rb +1 -1
  160. data/lib/puppet/pops/loader/ruby_legacy_function_instantiator.rb +6 -8
  161. data/lib/puppet/pops/loader/runtime3_type_loader.rb +4 -2
  162. data/lib/puppet/pops/loaders.rb +18 -11
  163. data/lib/puppet/pops/lookup/context.rb +1 -1
  164. data/lib/puppet/pops/lookup/hiera_config.rb +14 -1
  165. data/lib/puppet/pops/model/ast.pp +0 -42
  166. data/lib/puppet/pops/model/ast.rb +0 -290
  167. data/lib/puppet/pops/model/factory.rb +0 -45
  168. data/lib/puppet/pops/model/model_label_provider.rb +0 -5
  169. data/lib/puppet/pops/model/model_tree_dumper.rb +0 -22
  170. data/lib/puppet/pops/model/pn_transformer.rb +0 -16
  171. data/lib/puppet/pops/parser/egrammar.ra +0 -56
  172. data/lib/puppet/pops/parser/eparser.rb +1520 -1712
  173. data/lib/puppet/pops/parser/lexer2.rb +4 -4
  174. data/lib/puppet/pops/parser/parser_support.rb +0 -5
  175. data/lib/puppet/pops/resource/resource_type_impl.rb +2 -22
  176. data/lib/puppet/pops/types/iterable.rb +34 -8
  177. data/lib/puppet/pops/types/p_meta_type.rb +1 -1
  178. data/lib/puppet/pops/types/p_type_set_type.rb +4 -0
  179. data/lib/puppet/pops/types/type_calculator.rb +0 -7
  180. data/lib/puppet/pops/types/type_parser.rb +0 -4
  181. data/lib/puppet/pops/types/types.rb +0 -1
  182. data/lib/puppet/pops/validation/checker4_0.rb +28 -42
  183. data/lib/puppet/pops/validation/tasks_checker.rb +0 -12
  184. data/lib/puppet/pops/validation/validator_factory_4_0.rb +1 -1
  185. data/lib/puppet/provider.rb +0 -13
  186. data/lib/puppet/provider/file/windows.rb +1 -1
  187. data/lib/puppet/provider/nameservice.rb +0 -18
  188. data/lib/puppet/provider/package/apt.rb +34 -0
  189. data/lib/puppet/provider/package/aptitude.rb +1 -1
  190. data/lib/puppet/provider/package/dpkg.rb +1 -11
  191. data/lib/puppet/provider/package/gem.rb +27 -5
  192. data/lib/puppet/provider/package/pip.rb +0 -1
  193. data/lib/puppet/provider/package/pip2.rb +17 -0
  194. data/lib/puppet/provider/package/pkg.rb +0 -4
  195. data/lib/puppet/provider/package/portage.rb +1 -1
  196. data/lib/puppet/provider/package/puppet_gem.rb +6 -4
  197. data/lib/puppet/provider/package/puppetserver_gem.rb +180 -0
  198. data/lib/puppet/provider/package/yum.rb +2 -1
  199. data/lib/puppet/provider/package/zypper.rb +3 -0
  200. data/lib/puppet/provider/service/smf.rb +191 -73
  201. data/lib/puppet/provider/service/windows.rb +23 -7
  202. data/lib/puppet/provider/user/aix.rb +1 -1
  203. data/lib/puppet/provider/user/directoryservice.rb +0 -10
  204. data/lib/puppet/provider/user/user_role_add.rb +1 -1
  205. data/lib/puppet/provider/user/useradd.rb +11 -4
  206. data/lib/puppet/provider/user/windows_adsi.rb +18 -1
  207. data/lib/puppet/reference/configuration.rb +2 -0
  208. data/lib/puppet/reference/indirection.rb +1 -1
  209. data/lib/puppet/reports/http.rb +2 -0
  210. data/lib/puppet/resource.rb +3 -90
  211. data/lib/puppet/resource/catalog.rb +1 -14
  212. data/lib/puppet/resource/type.rb +5 -112
  213. data/lib/puppet/resource/type_collection.rb +3 -48
  214. data/lib/puppet/runtime.rb +1 -2
  215. data/lib/puppet/settings.rb +84 -35
  216. data/lib/puppet/settings/base_setting.rb +26 -2
  217. data/lib/puppet/settings/integer_setting.rb +17 -0
  218. data/lib/puppet/settings/port_setting.rb +15 -0
  219. data/lib/puppet/settings/priority_setting.rb +5 -4
  220. data/lib/puppet/ssl.rb +10 -6
  221. data/lib/puppet/ssl/base.rb +3 -5
  222. data/lib/puppet/ssl/certificate.rb +0 -6
  223. data/lib/puppet/ssl/certificate_request.rb +1 -12
  224. data/lib/puppet/ssl/certificate_signer.rb +6 -0
  225. data/lib/puppet/ssl/oids.rb +3 -1
  226. data/lib/puppet/ssl/ssl_context.rb +2 -2
  227. data/lib/puppet/ssl/ssl_provider.rb +37 -1
  228. data/lib/puppet/ssl/state_machine.rb +3 -1
  229. data/lib/puppet/ssl/verifier.rb +2 -0
  230. data/lib/puppet/test/test_helper.rb +19 -16
  231. data/lib/puppet/transaction.rb +3 -9
  232. data/lib/puppet/transaction/persistence.rb +1 -1
  233. data/lib/puppet/transaction/report.rb +10 -8
  234. data/lib/puppet/trusted_external.rb +29 -1
  235. data/lib/puppet/type.rb +9 -77
  236. data/lib/puppet/type/file.rb +45 -22
  237. data/lib/puppet/type/file/checksum.rb +5 -5
  238. data/lib/puppet/type/file/source.rb +33 -13
  239. data/lib/puppet/type/filebucket.rb +4 -4
  240. data/lib/puppet/type/notify.rb +2 -2
  241. data/lib/puppet/type/package.rb +5 -13
  242. data/lib/puppet/type/service.rb +53 -0
  243. data/lib/puppet/type/user.rb +18 -3
  244. data/lib/puppet/util.rb +41 -3
  245. data/lib/puppet/util/autoload.rb +9 -7
  246. data/lib/puppet/util/character_encoding.rb +9 -5
  247. data/lib/puppet/util/checksums.rb +19 -4
  248. data/lib/puppet/util/execution.rb +2 -13
  249. data/lib/puppet/util/fileparsing.rb +2 -2
  250. data/lib/puppet/util/http_proxy.rb +2 -215
  251. data/lib/puppet/util/monkey_patches.rb +0 -46
  252. data/lib/puppet/util/provider_features.rb +1 -1
  253. data/lib/puppet/util/rdoc.rb +0 -7
  254. data/lib/puppet/util/reference.rb +1 -1
  255. data/lib/puppet/util/retry_action.rb +1 -1
  256. data/lib/puppet/util/rubygems.rb +5 -1
  257. data/lib/puppet/util/run_mode.rb +14 -2
  258. data/lib/puppet/util/windows.rb +3 -7
  259. data/lib/puppet/util/windows/daemon.rb +360 -0
  260. data/lib/puppet/util/windows/error.rb +1 -0
  261. data/lib/puppet/util/windows/eventlog.rb +5 -15
  262. data/lib/puppet/util/windows/file.rb +8 -242
  263. data/lib/puppet/util/windows/monkey_patches/process.rb +414 -0
  264. data/lib/puppet/util/windows/principal.rb +8 -6
  265. data/lib/puppet/util/windows/process.rb +4 -226
  266. data/lib/puppet/util/windows/registry.rb +11 -11
  267. data/lib/puppet/util/windows/security.rb +4 -4
  268. data/lib/puppet/util/windows/service.rb +52 -486
  269. data/lib/puppet/util/windows/string.rb +12 -13
  270. data/lib/puppet/util/windows/user.rb +242 -8
  271. data/lib/puppet/util/yaml.rb +0 -22
  272. data/lib/puppet/vendor/require_vendored.rb +0 -1
  273. data/lib/puppet/version.rb +1 -1
  274. data/lib/puppet/x509.rb +5 -1
  275. data/lib/puppet/x509/cert_provider.rb +29 -1
  276. data/locales/puppet.pot +713 -1380
  277. data/man/man5/puppet.conf.5 +84 -98
  278. data/man/man8/puppet-agent.8 +7 -4
  279. data/man/man8/puppet-apply.8 +1 -1
  280. data/man/man8/puppet-catalog.8 +1 -1
  281. data/man/man8/puppet-config.8 +6 -6
  282. data/man/man8/puppet-describe.8 +1 -1
  283. data/man/man8/puppet-device.8 +1 -1
  284. data/man/man8/puppet-doc.8 +1 -1
  285. data/man/man8/puppet-epp.8 +1 -1
  286. data/man/man8/puppet-facts.8 +55 -9
  287. data/man/man8/puppet-filebucket.8 +6 -6
  288. data/man/man8/puppet-generate.8 +1 -1
  289. data/man/man8/puppet-help.8 +1 -1
  290. data/man/man8/puppet-lookup.8 +2 -2
  291. data/man/man8/puppet-module.8 +1 -58
  292. data/man/man8/puppet-node.8 +7 -4
  293. data/man/man8/puppet-parser.8 +1 -1
  294. data/man/man8/puppet-plugin.8 +1 -1
  295. data/man/man8/puppet-report.8 +4 -1
  296. data/man/man8/puppet-resource.8 +1 -1
  297. data/man/man8/puppet-script.8 +1 -1
  298. data/man/man8/puppet-ssl.8 +1 -1
  299. data/man/man8/puppet.8 +2 -2
  300. data/spec/fixtures/integration/application/apply/environments/spec/modules/amod/lib/puppet/provider/applytest/applytest.rb +2 -0
  301. data/spec/fixtures/integration/application/apply/environments/spec/modules/amod/lib/puppet/type/applytest.rb +25 -0
  302. data/spec/fixtures/unit/forge/bacula-releases.json +128 -0
  303. data/spec/fixtures/unit/forge/bacula.tar.gz +0 -0
  304. data/spec/fixtures/unit/provider/package/puppetserver_gem/gem-list-local-packages +30 -0
  305. data/spec/fixtures/unit/provider/service/smf/{svcs.out → svcs_instances.out} +0 -0
  306. data/spec/integration/application/agent_spec.rb +157 -59
  307. data/spec/integration/application/apply_spec.rb +150 -150
  308. data/spec/integration/application/doc_spec.rb +16 -6
  309. data/spec/integration/application/filebucket_spec.rb +78 -29
  310. data/spec/integration/application/help_spec.rb +44 -0
  311. data/spec/integration/application/lookup_spec.rb +13 -0
  312. data/spec/integration/application/module_spec.rb +68 -0
  313. data/spec/integration/application/plugin_spec.rb +76 -4
  314. data/spec/integration/configurer_spec.rb +14 -0
  315. data/spec/integration/data_binding_spec.rb +82 -0
  316. data/spec/integration/defaults_spec.rb +33 -5
  317. data/spec/integration/directory_environments_spec.rb +17 -17
  318. data/spec/integration/environments/setting_hooks_spec.rb +1 -1
  319. data/spec/integration/indirector/facts/facter_spec.rb +8 -6
  320. data/spec/integration/network/http_pool_spec.rb +29 -30
  321. data/spec/integration/node/environment_spec.rb +1 -1
  322. data/spec/integration/parser/catalog_spec.rb +0 -38
  323. data/spec/integration/parser/compiler_spec.rb +11 -0
  324. data/spec/integration/parser/node_spec.rb +0 -9
  325. data/spec/integration/parser/pcore_resource_spec.rb +0 -37
  326. data/spec/integration/type/file_spec.rb +6 -5
  327. data/spec/integration/util/execution_spec.rb +22 -0
  328. data/spec/integration/util/windows/adsi_spec.rb +2 -2
  329. data/spec/integration/util/windows/monkey_patches/process_spec.rb +231 -0
  330. data/spec/integration/util/windows/process_spec.rb +26 -32
  331. data/spec/integration/util/windows/registry_spec.rb +7 -7
  332. data/spec/integration/util/windows/security_spec.rb +1 -1
  333. data/spec/integration/util/windows/user_spec.rb +47 -5
  334. data/spec/integration/util_spec.rb +7 -33
  335. data/spec/lib/puppet_spec/matchers.rb +0 -80
  336. data/spec/lib/puppet_spec/puppetserver.rb +9 -1
  337. data/spec/lib/puppet_spec/settings.rb +7 -1
  338. data/spec/shared_contexts/types_setup.rb +2 -0
  339. data/spec/spec_helper.rb +2 -0
  340. data/spec/unit/agent_spec.rb +0 -2
  341. data/spec/unit/application/agent_spec.rb +3 -4
  342. data/spec/unit/application/config_spec.rb +224 -4
  343. data/spec/unit/application/doc_spec.rb +2 -2
  344. data/spec/unit/application/face_base_spec.rb +6 -4
  345. data/spec/unit/application/facts_spec.rb +74 -8
  346. data/spec/unit/application/filebucket_spec.rb +41 -39
  347. data/spec/unit/application/resource_spec.rb +3 -1
  348. data/spec/unit/application/ssl_spec.rb +17 -4
  349. data/spec/unit/application_spec.rb +9 -4
  350. data/spec/unit/certificate_factory_spec.rb +1 -1
  351. data/spec/unit/configurer/downloader_spec.rb +14 -0
  352. data/spec/unit/configurer/fact_handler_spec.rb +4 -4
  353. data/spec/unit/configurer/plugin_handler_spec.rb +56 -18
  354. data/spec/unit/configurer_spec.rb +96 -44
  355. data/spec/unit/confine_spec.rb +2 -1
  356. data/spec/unit/context/trusted_information_spec.rb +12 -10
  357. data/spec/unit/defaults_spec.rb +77 -28
  358. data/spec/unit/environments_spec.rb +96 -32
  359. data/spec/unit/face/config_spec.rb +65 -12
  360. data/spec/unit/face/facts_spec.rb +4 -0
  361. data/spec/unit/face/node_spec.rb +2 -2
  362. data/spec/unit/face/plugin_spec.rb +73 -33
  363. data/spec/unit/file_bucket/file_spec.rb +1 -1
  364. data/spec/unit/file_serving/configuration/parser_spec.rb +14 -18
  365. data/spec/unit/file_serving/configuration_spec.rb +6 -12
  366. data/spec/unit/file_serving/http_metadata_spec.rb +37 -14
  367. data/spec/unit/file_serving/mount/locales_spec.rb +2 -2
  368. data/spec/unit/file_serving/mount/pluginfacts_spec.rb +2 -2
  369. data/spec/unit/file_serving/mount/plugins_spec.rb +2 -2
  370. data/spec/unit/file_serving/terminus_selector_spec.rb +45 -26
  371. data/spec/unit/file_system/uniquefile_spec.rb +18 -0
  372. data/spec/unit/file_system_spec.rb +1 -2
  373. data/spec/unit/functions/camelcase_spec.rb +1 -1
  374. data/spec/unit/functions/capitalize_spec.rb +1 -1
  375. data/spec/unit/functions/downcase_spec.rb +1 -1
  376. data/spec/unit/functions/inline_epp_spec.rb +26 -1
  377. data/spec/unit/functions/upcase_spec.rb +1 -1
  378. data/spec/unit/http/client_spec.rb +71 -17
  379. data/spec/unit/{network/resolver_spec.rb → http/dns_spec.rb} +3 -3
  380. data/spec/unit/http/external_client_spec.rb +4 -4
  381. data/spec/unit/{network/http → http}/factory_spec.rb +5 -11
  382. data/spec/unit/{network/http/session_spec.rb → http/pool_entry_spec.rb} +3 -3
  383. data/spec/unit/{network/http → http}/pool_spec.rb +12 -17
  384. data/spec/unit/{util/http_proxy_spec.rb → http/proxy_spec.rb} +2 -69
  385. data/spec/unit/http/resolver_spec.rb +34 -15
  386. data/spec/unit/http/response_spec.rb +6 -0
  387. data/spec/unit/http/service/ca_spec.rb +2 -3
  388. data/spec/unit/http/service/compiler_spec.rb +51 -65
  389. data/spec/unit/http/service/file_server_spec.rb +5 -6
  390. data/spec/unit/http/service/puppetserver_spec.rb +112 -0
  391. data/spec/unit/http/service/report_spec.rb +2 -3
  392. data/spec/unit/http/service_spec.rb +1 -3
  393. data/spec/unit/http/session_spec.rb +24 -35
  394. data/spec/unit/{network/http → http}/site_spec.rb +3 -3
  395. data/spec/unit/indirector/catalog/json_spec.rb +1 -1
  396. data/spec/unit/indirector/catalog/rest_spec.rb +1 -1
  397. data/spec/unit/indirector/facts/facter_spec.rb +97 -0
  398. data/spec/unit/indirector/facts/json_spec.rb +255 -0
  399. data/spec/unit/indirector/facts/rest_spec.rb +1 -1
  400. data/spec/unit/indirector/file_bucket_file/file_spec.rb +5 -3
  401. data/spec/unit/indirector/file_content/rest_spec.rb +0 -4
  402. data/spec/unit/indirector/file_metadata/http_spec.rb +27 -0
  403. data/spec/unit/indirector/file_metadata/rest_spec.rb +0 -4
  404. data/spec/unit/indirector/file_server_spec.rb +1 -15
  405. data/spec/unit/indirector/json_spec.rb +8 -8
  406. data/spec/unit/indirector/msgpack_spec.rb +8 -8
  407. data/spec/unit/indirector/node/json_spec.rb +33 -0
  408. data/spec/unit/indirector/node/rest_spec.rb +1 -1
  409. data/spec/{integration/indirector/report/yaml.rb → unit/indirector/report/json_spec.rb} +13 -24
  410. data/spec/unit/indirector/report/rest_spec.rb +2 -17
  411. data/spec/unit/indirector/report/yaml_spec.rb +72 -8
  412. data/spec/unit/indirector/request_spec.rb +3 -267
  413. data/spec/unit/indirector/rest_spec.rb +98 -752
  414. data/spec/unit/indirector/yaml_spec.rb +7 -7
  415. data/spec/unit/interface_spec.rb +3 -3
  416. data/spec/unit/module_tool/tar/mini_spec.rb +20 -0
  417. data/spec/unit/network/authconfig_spec.rb +2 -132
  418. data/spec/unit/network/authorization_spec.rb +2 -55
  419. data/spec/unit/network/format_support_spec.rb +3 -2
  420. data/spec/unit/network/formats_spec.rb +4 -4
  421. data/spec/unit/network/http/api/indirected_routes_spec.rb +3 -98
  422. data/spec/unit/network/http/api/master/v3/environments_spec.rb +12 -23
  423. data/spec/unit/network/http/api/master/v3_spec.rb +28 -7
  424. data/spec/unit/network/http/api_spec.rb +10 -0
  425. data/spec/unit/network/http/connection_spec.rb +61 -73
  426. data/spec/unit/network/http/handler_spec.rb +0 -6
  427. data/spec/unit/network/http_pool_spec.rb +0 -4
  428. data/spec/unit/node/environment_spec.rb +51 -22
  429. data/spec/unit/node_spec.rb +2 -54
  430. data/spec/unit/parser/ast/block_expression_spec.rb +1 -1
  431. data/spec/unit/parser/functions/create_resources_spec.rb +2 -20
  432. data/spec/unit/parser/scope_spec.rb +1 -1
  433. data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +19 -8
  434. data/spec/unit/pops/loaders/loaders_spec.rb +77 -22
  435. data/spec/unit/pops/lookup/lookup_spec.rb +25 -0
  436. data/spec/unit/pops/parser/parse_application_spec.rb +4 -22
  437. data/spec/unit/pops/parser/parse_basic_expressions_spec.rb +0 -1
  438. data/spec/unit/pops/parser/parse_capabilities_spec.rb +8 -21
  439. data/spec/unit/pops/parser/parse_site_spec.rb +20 -24
  440. data/spec/unit/pops/resource/resource_type_impl_spec.rb +0 -71
  441. data/spec/unit/pops/serialization/to_from_hr_spec.rb +1 -1
  442. data/spec/unit/pops/types/type_calculator_spec.rb +7 -17
  443. data/spec/unit/pops/types/type_factory_spec.rb +1 -1
  444. data/spec/unit/pops/validator/validator_spec.rb +61 -46
  445. data/spec/unit/pops/visitor_spec.rb +1 -1
  446. data/spec/unit/provider/exec_spec.rb +4 -3
  447. data/spec/unit/provider/nameservice_spec.rb +0 -57
  448. data/spec/unit/provider/package/apt_spec.rb +77 -0
  449. data/spec/unit/provider/package/aptitude_spec.rb +1 -0
  450. data/spec/unit/provider/package/dpkg_spec.rb +22 -55
  451. data/spec/unit/provider/package/gem_spec.rb +32 -0
  452. data/spec/unit/provider/package/openbsd_spec.rb +2 -0
  453. data/spec/unit/provider/package/pip2_spec.rb +36 -0
  454. data/spec/unit/provider/package/puppet_gem_spec.rb +6 -2
  455. data/spec/unit/provider/package/puppetserver_gem_spec.rb +137 -0
  456. data/spec/unit/provider/package/yum_spec.rb +31 -0
  457. data/spec/unit/provider/package/zypper_spec.rb +14 -0
  458. data/spec/unit/provider/service/base_spec.rb +2 -4
  459. data/spec/unit/provider/service/bsd_spec.rb +5 -1
  460. data/spec/unit/provider/service/daemontools_spec.rb +1 -1
  461. data/spec/unit/provider/service/debian_spec.rb +3 -5
  462. data/spec/unit/provider/service/freebsd_spec.rb +1 -1
  463. data/spec/unit/provider/service/gentoo_spec.rb +4 -5
  464. data/spec/unit/provider/service/init_spec.rb +45 -5
  465. data/spec/unit/provider/service/launchd_spec.rb +5 -6
  466. data/spec/unit/provider/service/openrc_spec.rb +4 -5
  467. data/spec/unit/provider/service/openwrt_spec.rb +1 -1
  468. data/spec/unit/provider/service/redhat_spec.rb +1 -1
  469. data/spec/unit/provider/service/runit_spec.rb +2 -1
  470. data/spec/unit/provider/service/smf_spec.rb +402 -166
  471. data/spec/unit/provider/service/src_spec.rb +3 -5
  472. data/spec/unit/provider/service/systemd_spec.rb +3 -6
  473. data/spec/unit/provider/service/upstart_spec.rb +4 -5
  474. data/spec/unit/provider/service/windows_spec.rb +50 -15
  475. data/spec/unit/provider/user/openbsd_spec.rb +1 -0
  476. data/spec/unit/provider/user/useradd_spec.rb +22 -16
  477. data/spec/unit/provider/user/windows_adsi_spec.rb +82 -0
  478. data/spec/unit/provider_spec.rb +0 -12
  479. data/spec/unit/puppet_pal_2pec.rb +40 -0
  480. data/spec/unit/puppet_pal_catalog_spec.rb +45 -0
  481. data/spec/unit/reports/store_spec.rb +17 -13
  482. data/spec/unit/resource/type_collection_spec.rb +2 -22
  483. data/spec/unit/resource_spec.rb +3 -59
  484. data/spec/unit/settings/http_extra_headers_spec.rb +2 -4
  485. data/spec/unit/settings/integer_setting_spec.rb +42 -0
  486. data/spec/unit/settings/port_setting_spec.rb +31 -0
  487. data/spec/unit/settings/priority_setting_spec.rb +4 -4
  488. data/spec/unit/settings_spec.rb +586 -239
  489. data/spec/unit/ssl/base_spec.rb +36 -3
  490. data/spec/unit/ssl/certificate_request_spec.rb +15 -45
  491. data/spec/unit/ssl/certificate_spec.rb +2 -11
  492. data/spec/unit/ssl/ssl_provider_spec.rb +78 -49
  493. data/spec/unit/ssl/state_machine_spec.rb +0 -1
  494. data/spec/unit/ssl/verifier_spec.rb +0 -21
  495. data/spec/unit/test/test_helper_spec.rb +17 -0
  496. data/spec/unit/transaction/persistence_spec.rb +15 -0
  497. data/spec/unit/transaction/report_spec.rb +3 -3
  498. data/spec/unit/transaction/resource_harness_spec.rb +2 -2
  499. data/spec/unit/transaction_spec.rb +45 -79
  500. data/spec/unit/type/file/checksum_spec.rb +6 -6
  501. data/spec/unit/type/file/content_spec.rb +1 -1
  502. data/spec/unit/type/file/ensure_spec.rb +1 -1
  503. data/spec/unit/type/file/mode_spec.rb +1 -1
  504. data/spec/unit/type/file/source_spec.rb +4 -5
  505. data/spec/unit/type/file_spec.rb +134 -102
  506. data/spec/unit/type/filebucket_spec.rb +1 -1
  507. data/spec/unit/type/package_spec.rb +1 -1
  508. data/spec/unit/type/service_spec.rb +209 -0
  509. data/spec/unit/type/user_spec.rb +31 -2
  510. data/spec/unit/type_spec.rb +70 -0
  511. data/spec/unit/util/backups_spec.rb +0 -2
  512. data/spec/unit/util/character_encoding_spec.rb +4 -4
  513. data/spec/unit/util/checksums_spec.rb +16 -0
  514. data/spec/unit/util/command_line_spec.rb +11 -6
  515. data/spec/unit/util/execution_spec.rb +0 -29
  516. data/spec/unit/util/monkey_patches_spec.rb +0 -6
  517. data/spec/unit/util/rubygems_spec.rb +2 -2
  518. data/spec/unit/util/run_mode_spec.rb +27 -127
  519. data/spec/unit/util/windows/api_types_spec.rb +104 -40
  520. data/spec/unit/util/windows/service_spec.rb +4 -4
  521. data/spec/unit/util/windows/string_spec.rb +1 -3
  522. data/spec/unit/util/yaml_spec.rb +0 -54
  523. data/spec/unit/util_spec.rb +3 -21
  524. data/spec/unit/x509/cert_provider_spec.rb +1 -1
  525. metadata +76 -214
  526. data/conf/auth.conf +0 -150
  527. data/lib/puppet/application/cert.rb +0 -76
  528. data/lib/puppet/application/key.rb +0 -4
  529. data/lib/puppet/application/man.rb +0 -4
  530. data/lib/puppet/application/status.rb +0 -4
  531. data/lib/puppet/face/key.rb +0 -16
  532. data/lib/puppet/face/man.rb +0 -145
  533. data/lib/puppet/face/module/build.rb +0 -14
  534. data/lib/puppet/face/module/generate.rb +0 -14
  535. data/lib/puppet/face/module/search.rb +0 -103
  536. data/lib/puppet/face/status.rb +0 -51
  537. data/lib/puppet/indirector/certificate/file.rb +0 -9
  538. data/lib/puppet/indirector/certificate/rest.rb +0 -18
  539. data/lib/puppet/indirector/certificate_request/file.rb +0 -9
  540. data/lib/puppet/indirector/certificate_request/memory.rb +0 -7
  541. data/lib/puppet/indirector/certificate_request/rest.rb +0 -11
  542. data/lib/puppet/indirector/file_content/http.rb +0 -22
  543. data/lib/puppet/indirector/key/file.rb +0 -46
  544. data/lib/puppet/indirector/key/memory.rb +0 -7
  545. data/lib/puppet/indirector/ssl_file.rb +0 -162
  546. data/lib/puppet/indirector/status.rb +0 -3
  547. data/lib/puppet/indirector/status/local.rb +0 -12
  548. data/lib/puppet/indirector/status/rest.rb +0 -27
  549. data/lib/puppet/module_tool/applications/searcher.rb +0 -29
  550. data/lib/puppet/network/auth_config_parser.rb +0 -90
  551. data/lib/puppet/network/authstore.rb +0 -283
  552. data/lib/puppet/network/http/api/master/v3/authorization.rb +0 -18
  553. data/lib/puppet/network/http/api/master/v3/environment.rb +0 -85
  554. data/lib/puppet/network/http/base_pool.rb +0 -36
  555. data/lib/puppet/network/http/compression.rb +0 -127
  556. data/lib/puppet/network/http/connection_adapter.rb +0 -182
  557. data/lib/puppet/network/http/nocache_pool.rb +0 -28
  558. data/lib/puppet/network/rest_controller.rb +0 -2
  559. data/lib/puppet/network/rights.rb +0 -210
  560. data/lib/puppet/parser/compiler/catalog_validator/env_relationship_validator.rb +0 -64
  561. data/lib/puppet/parser/compiler/catalog_validator/site_validator.rb +0 -20
  562. data/lib/puppet/parser/environment_compiler.rb +0 -199
  563. data/lib/puppet/pops/types/enumeration.rb +0 -16
  564. data/lib/puppet/resource/capability_finder.rb +0 -154
  565. data/lib/puppet/rest/errors.rb +0 -15
  566. data/lib/puppet/rest/response.rb +0 -35
  567. data/lib/puppet/rest/route.rb +0 -85
  568. data/lib/puppet/rest/routes.rb +0 -135
  569. data/lib/puppet/ssl/host.rb +0 -505
  570. data/lib/puppet/ssl/key.rb +0 -61
  571. data/lib/puppet/ssl/validator.rb +0 -61
  572. data/lib/puppet/ssl/validator/default_validator.rb +0 -209
  573. data/lib/puppet/ssl/validator/no_validator.rb +0 -22
  574. data/lib/puppet/ssl/verifier_adapter.rb +0 -58
  575. data/lib/puppet/status.rb +0 -40
  576. data/lib/puppet/util/connection.rb +0 -88
  577. data/lib/puppet/util/ssl.rb +0 -83
  578. data/lib/puppet/util/windows/api_types.rb +0 -282
  579. data/lib/puppet/vendor/load_pathspec.rb +0 -1
  580. data/lib/puppet/vendor/pathspec/CHANGELOG.md +0 -2
  581. data/lib/puppet/vendor/pathspec/LICENSE +0 -201
  582. data/lib/puppet/vendor/pathspec/PUPPET_README.md +0 -6
  583. data/lib/puppet/vendor/pathspec/README.md +0 -53
  584. data/lib/puppet/vendor/pathspec/lib/pathspec.rb +0 -122
  585. data/lib/puppet/vendor/pathspec/lib/pathspec/gitignorespec.rb +0 -275
  586. data/lib/puppet/vendor/pathspec/lib/pathspec/regexspec.rb +0 -17
  587. data/lib/puppet/vendor/pathspec/lib/pathspec/spec.rb +0 -14
  588. data/man/man8/puppet-key.8 +0 -126
  589. data/man/man8/puppet-man.8 +0 -76
  590. data/man/man8/puppet-status.8 +0 -108
  591. data/spec/integration/faces/config_spec.rb +0 -91
  592. data/spec/integration/faces/documentation_spec.rb +0 -57
  593. data/spec/integration/file_bucket/file_spec.rb +0 -50
  594. data/spec/integration/file_serving/content_spec.rb +0 -7
  595. data/spec/integration/file_serving/fileset_spec.rb +0 -12
  596. data/spec/integration/file_serving/metadata_spec.rb +0 -8
  597. data/spec/integration/file_serving/terminus_helper_spec.rb +0 -20
  598. data/spec/integration/file_system/uniquefile_spec.rb +0 -26
  599. data/spec/integration/module_tool/forge_spec.rb +0 -51
  600. data/spec/integration/module_tool/tar/mini_spec.rb +0 -28
  601. data/spec/integration/network/authconfig_spec.rb +0 -256
  602. data/spec/integration/provider/service/init_spec.rb +0 -48
  603. data/spec/integration/provider/service/systemd_spec.rb +0 -25
  604. data/spec/integration/provider/service/windows_spec.rb +0 -50
  605. data/spec/integration/reference/providers_spec.rb +0 -21
  606. data/spec/integration/reports_spec.rb +0 -13
  607. data/spec/integration/ssl/certificate_request_spec.rb +0 -44
  608. data/spec/integration/ssl/host_spec.rb +0 -72
  609. data/spec/integration/ssl/key_spec.rb +0 -99
  610. data/spec/integration/test/test_helper_spec.rb +0 -31
  611. data/spec/shared_behaviours/file_serving_model.rb +0 -51
  612. data/spec/unit/capability_spec.rb +0 -414
  613. data/spec/unit/face/catalog_spec.rb +0 -6
  614. data/spec/unit/face/key_spec.rb +0 -9
  615. data/spec/unit/face/man_spec.rb +0 -25
  616. data/spec/unit/face/module/search_spec.rb +0 -231
  617. data/spec/unit/face/module_spec.rb +0 -3
  618. data/spec/unit/face/status_spec.rb +0 -9
  619. data/spec/unit/indirector/certificate/file_spec.rb +0 -14
  620. data/spec/unit/indirector/certificate/rest_spec.rb +0 -61
  621. data/spec/unit/indirector/certificate_request/file_spec.rb +0 -14
  622. data/spec/unit/indirector/certificate_request/rest_spec.rb +0 -25
  623. data/spec/unit/indirector/key/file_spec.rb +0 -79
  624. data/spec/unit/indirector/ssl_file_spec.rb +0 -305
  625. data/spec/unit/indirector/status/local_spec.rb +0 -10
  626. data/spec/unit/indirector/status/rest_spec.rb +0 -50
  627. data/spec/unit/man_spec.rb +0 -31
  628. data/spec/unit/module_tool/applications/searcher_spec.rb +0 -38
  629. data/spec/unit/network/auth_config_parser_spec.rb +0 -115
  630. data/spec/unit/network/authstore_spec.rb +0 -422
  631. data/spec/unit/network/http/api/master/v3/authorization_spec.rb +0 -57
  632. data/spec/unit/network/http/api/master/v3/environment_spec.rb +0 -185
  633. data/spec/unit/network/http/compression_spec.rb +0 -240
  634. data/spec/unit/network/http/nocache_pool_spec.rb +0 -64
  635. data/spec/unit/network/http_spec.rb +0 -9
  636. data/spec/unit/network/rights_spec.rb +0 -439
  637. data/spec/unit/parser/environment_compiler_spec.rb +0 -723
  638. data/spec/unit/pops/types/enumeration_spec.rb +0 -51
  639. data/spec/unit/resource/capability_finder_spec.rb +0 -143
  640. data/spec/unit/rest/route_spec.rb +0 -132
  641. data/spec/unit/ssl/host_spec.rb +0 -650
  642. data/spec/unit/ssl/key_spec.rb +0 -173
  643. data/spec/unit/ssl/validator_spec.rb +0 -278
  644. data/spec/unit/status_spec.rb +0 -45
  645. data/spec/unit/util/ssl_spec.rb +0 -91
@@ -158,6 +158,37 @@ describe Puppet::Type.type(:package).provider(:yum) do
158
158
  end
159
159
  end
160
160
 
161
+ context "latest" do
162
+ let(:name) { 'baz' }
163
+
164
+ let(:resource) do
165
+ Puppet::Type.type(:package).new(
166
+ :name => name,
167
+ :provider => 'yum',
168
+ )
169
+ end
170
+
171
+ let(:provider) do
172
+ provider = described_class.new
173
+ provider.resource = resource
174
+ provider
175
+ end
176
+
177
+ before {
178
+ allow(described_class).to receive(:command).with(:cmd).and_return("/usr/bin/yum")
179
+ Puppet[:log_level] = 'debug'
180
+ }
181
+
182
+ it "should print a debug message with the current version if newer package is not available" do
183
+ expect(provider).to receive(:query).and_return({:ensure => "1.2.3"})
184
+ expect(described_class).to receive(:latest_package_version).and_return(nil)
185
+ resource[:ensure] = :present
186
+
187
+ provider.latest
188
+ expect(@logs).to include(an_object_having_attributes(level: :debug, message: "Yum didn't find updates, current version (1.2.3) is the latest"))
189
+ end
190
+ end
191
+
161
192
  context "parsing the output of check-update" do
162
193
  context "with no multiline entries" do
163
194
  let(:check_update) { File.read(my_fixture("yum-check-update-simple.txt")) }
@@ -309,5 +309,19 @@ describe Puppet::Type.type(:package).provider(:zypper) do
309
309
 
310
310
  it { is_expected.to be false }
311
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
312
326
  end
313
327
  end
@@ -14,10 +14,8 @@ describe "base service provider" do
14
14
 
15
15
  subject { provider }
16
16
 
17
- if Puppet::Util::Platform.windows?
18
- # Get a pid for $CHILD_STATUS to latch on to
19
- cmd = "cmd.exe /c \"exit 0\""
20
- Puppet::Util::Execution.execute(cmd, {:failonfail => false})
17
+ before(:all) do
18
+ `exit 0`
21
19
  end
22
20
 
23
21
  context "basic operations" do
@@ -1,9 +1,13 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe 'Puppet::Type::Service::Provider::Bsd',
4
- :unless => Puppet::Util::Platform.windows? || Puppet::Util::Platform.jruby? do
4
+ unless: Puppet::Util::Platform.windows? || Puppet::Util::Platform.jruby? do
5
5
  let(:provider_class) { Puppet::Type.type(:service).provider(:bsd) }
6
6
 
7
+ before(:all) do
8
+ `exit 0`
9
+ end
10
+
7
11
  before :each do
8
12
  allow(Puppet::Type.type(:service)).to receive(:defaultprovider).and_return(provider_class)
9
13
  allow(Facter).to receive(:value).with(:operatingsystem).and_return(:netbsd)
@@ -1,7 +1,7 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe 'Puppet::Type::Service::Provider::Daemontools',
4
- unless: Puppet::Util::Platform.jruby? do
4
+ unless: Puppet::Util::Platform.windows? || Puppet::Util::Platform.jruby? do
5
5
  let(:provider_class) { Puppet::Type.type(:service).provider(:daemontools) }
6
6
 
7
7
  before(:each) do
@@ -1,13 +1,11 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe 'Puppet::Type::Service::Provider::Debian',
4
- unless: Puppet::Util::Platform.jruby? do
4
+ unless: Puppet::Util::Platform.jruby? || Puppet::Util::Platform.windows? do
5
5
  let(:provider_class) { Puppet::Type.type(:service).provider(:debian) }
6
6
 
7
- if Puppet::Util::Platform.windows?
8
- # Get a pid for $CHILD_STATUS to latch on to
9
- command = "cmd.exe /c \"exit 0\""
10
- Puppet::Util::Execution.execute(command, {:failonfail => false})
7
+ before(:all) do
8
+ `exit 0`
11
9
  end
12
10
 
13
11
  before(:each) do
@@ -1,7 +1,7 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe 'Puppet::Type::Service::Provider::Freebsd',
4
- unless: Puppet::Util::Platform.jruby? do
4
+ unless: Puppet::Util::Platform.windows? || Puppet::Util::Platform.jruby? do
5
5
  let(:provider_class) { Puppet::Type.type(:service).provider(:freebsd) }
6
6
 
7
7
  before :each do
@@ -1,12 +1,11 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe 'Puppet::Type::Service::Provider::Gentoo', unless: Puppet::Util::Platform.jruby? do
3
+ describe 'Puppet::Type::Service::Provider::Gentoo',
4
+ unless: Puppet::Util::Platform.windows? || Puppet::Util::Platform.jruby? do
4
5
  let(:provider_class) { Puppet::Type.type(:service).provider(:gentoo) }
5
6
 
6
- if Puppet::Util::Platform.windows?
7
- # Get a pid for $CHILD_STATUS to latch on to
8
- command = "cmd.exe /c \"exit 0\""
9
- Puppet::Util::Execution.execute(command, {:failonfail => false})
7
+ before(:all) do
8
+ `exit 0`
10
9
  end
11
10
 
12
11
  before :each do
@@ -1,12 +1,11 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe 'Puppet::Type::Service::Provider::Init', unless: Puppet::Util::Platform.jruby? do
3
+ describe 'Puppet::Type::Service::Provider::Init',
4
+ unless: Puppet::Util::Platform.windows? || Puppet::Util::Platform.jruby? do
4
5
  let(:provider_class) { Puppet::Type.type(:service).provider(:init) }
5
6
 
6
- if Puppet::Util::Platform.windows?
7
- # Get a pid for $CHILD_STATUS to latch on to
8
- cmd = "cmd.exe /c \"exit 0\""
9
- Puppet::Util::Execution.execute(cmd, {:failonfail => false})
7
+ before :all do
8
+ `exit 0`
10
9
  end
11
10
 
12
11
  before do
@@ -38,6 +37,47 @@ describe 'Puppet::Type::Service::Provider::Init', unless: Puppet::Util::Platform
38
37
  %w{functions.sh reboot.sh shutdown.sh functions halt killall single linuxconf reboot boot wait-for-state rcS module-init-tools}
39
38
  end
40
39
 
40
+ describe "when running on FreeBSD" do
41
+ before :each do
42
+ allow(Facter).to receive(:value).with(:operatingsystem).and_return('FreeBSD')
43
+ allow(Facter).to receive(:value).with(:osfamily).and_return('FreeBSD')
44
+ end
45
+
46
+ it "should set its default path to include /etc/rc.d and /usr/local/etc/rc.d" do
47
+ expect(provider_class.defpath).to eq(["/etc/rc.d", "/usr/local/etc/rc.d"])
48
+ end
49
+ end
50
+
51
+ describe "when running on HP-UX" do
52
+ before :each do
53
+ allow(Facter).to receive(:value).with(:operatingsystem).and_return('HP-UX')
54
+ end
55
+
56
+ it "should set its default path to include /sbin/init.d" do
57
+ expect(provider_class.defpath).to eq("/sbin/init.d")
58
+ end
59
+ end
60
+
61
+ describe "when running on Archlinux" do
62
+ before :each do
63
+ allow(Facter).to receive(:value).with(:operatingsystem).and_return('Archlinux')
64
+ end
65
+
66
+ it "should set its default path to include /etc/rc.d" do
67
+ expect(provider_class.defpath).to eq("/etc/rc.d")
68
+ end
69
+ end
70
+
71
+ describe "when not running on FreeBSD, HP-UX or Archlinux" do
72
+ before :each do
73
+ allow(Facter).to receive(:value).with(:operatingsystem).and_return('RedHat')
74
+ end
75
+
76
+ it "should set its default path to include /etc/init.d" do
77
+ expect(provider_class.defpath).to eq("/etc/init.d")
78
+ end
79
+ end
80
+
41
81
  describe "when getting all service instances" do
42
82
  before :each do
43
83
  allow(provider_class).to receive(:defpath).and_return('tmp')
@@ -1,20 +1,19 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe 'Puppet::Type::Service::Provider::Launchd', unless: Puppet::Util::Platform.jruby? do
3
+ describe 'Puppet::Type::Service::Provider::Launchd',
4
+ unless: Puppet::Util::Platform.windows? || Puppet::Util::Platform.jruby? do
4
5
  let(:provider_class) { Puppet::Type.type(:service).provider(:launchd) }
5
-
6
6
  let (:plistlib) { Puppet::Util::Plist }
7
7
  let (:joblabel) { "com.foo.food" }
8
8
  let (:provider) { subject.class }
9
9
  let (:resource) { Puppet::Type.type(:service).new(:name => joblabel, :provider => :launchd) }
10
10
  let (:launchd_overrides_6_9) { '/var/db/launchd.db/com.apple.launchd/overrides.plist' }
11
11
  let (:launchd_overrides_10_) { '/var/db/com.apple.xpc.launchd/disabled.plist' }
12
+
12
13
  subject { resource.provider }
13
14
 
14
- if Puppet::Util::Platform.windows?
15
- # Get a pid for $CHILD_STATUS to latch on to
16
- command = "cmd.exe /c \"exit 0\""
17
- Puppet::Util::Execution.execute(command, {:failonfail => false})
15
+ before :all do
16
+ `exit 0`
18
17
  end
19
18
 
20
19
  describe "the type interface" do
@@ -1,12 +1,11 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe 'Puppet::Type::Service::Provider::Openrc', unless: Puppet::Util::Platform.jruby? do
3
+ describe 'Puppet::Type::Service::Provider::Openrc',
4
+ unless: Puppet::Util::Platform.windows? || Puppet::Util::Platform.jruby? do
4
5
  let(:provider_class) { Puppet::Type.type(:service).provider(:openrc) }
5
6
 
6
- if Puppet::Util::Platform.windows?
7
- # Get a pid for $CHILD_STATUS to latch on to
8
- cmd = "cmd.exe /c \"exit 0\""
9
- Puppet::Util::Execution.execute(cmd, {:failonfail => false})
7
+ before :all do
8
+ `exit 0`
10
9
  end
11
10
 
12
11
  before :each do
@@ -1,7 +1,7 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe 'Puppet::Type::Service::Provider::Openwrt',
4
- :if => Puppet.features.posix? && !Puppet::Util::Platform.jruby? do
4
+ unless: Puppet::Util::Platform.windows? || Puppet::Util::Platform.jruby? do
5
5
  let(:provider_class) { Puppet::Type.type(:service).provider(:openwrt) }
6
6
 
7
7
  let(:resource) do
@@ -1,7 +1,7 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe 'Puppet::Type::Service::Provider::Redhat',
4
- if: Puppet.features.posix? && !Puppet::Util::Platform.jruby?do
4
+ unless: Puppet::Util::Platform.windows? || Puppet::Util::Platform.jruby? do
5
5
  let(:provider_class) { Puppet::Type.type(:service).provider(:redhat) }
6
6
 
7
7
  # `execute` and `texecute` start a new process, consequently setting $CHILD_STATUS to a Process::Status instance,
@@ -1,6 +1,7 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe 'Puppet::Type::Service::Provider::Runit', unless: Puppet::Util::Platform.jruby? do
3
+ describe 'Puppet::Type::Service::Provider::Runit',
4
+ unless: Puppet::Util::Platform.windows? || Puppet::Util::Platform.jruby? do
4
5
  let(:provider_class) { Puppet::Type.type(:service).provider(:runit) }
5
6
 
6
7
  before(:each) do
@@ -1,9 +1,19 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe 'Puppet::Type::Service::Provider::Smf',
4
- if: Puppet.features.posix? && !Puppet::Util::Platform.jruby? do
4
+ unless: Puppet::Util::Platform.windows? || Puppet::Util::Platform.jruby? do
5
5
  let(:provider_class) { Puppet::Type.type(:service).provider(:smf) }
6
6
 
7
+ def set_resource_params(params = {})
8
+ params.each do |param, value|
9
+ if value.nil?
10
+ @provider.resource.delete(param) if @provider.resource[param]
11
+ else
12
+ @provider.resource[param] = value
13
+ end
14
+ end
15
+ end
16
+
7
17
  before(:each) do
8
18
  # Create a mock resource
9
19
  @resource = Puppet::Type.type(:service).new(
@@ -18,14 +28,13 @@ describe 'Puppet::Type::Service::Provider::Smf',
18
28
  allow(Facter).to receive(:value).with(:osfamily).and_return('Solaris')
19
29
  allow(Facter).to receive(:value).with(:operatingsystemrelease).and_return('11.2')
20
30
  end
21
-
22
31
  context ".instances" do
23
32
  it "should have an instances method" do
24
33
  expect(provider_class).to respond_to :instances
25
34
  end
26
35
 
27
36
  it "should get a list of services (excluding legacy)" do
28
- expect(provider_class).to receive(:svcs).with('-H', '-o', 'state,fmri').and_return(File.read(my_fixture('svcs.out')))
37
+ expect(provider_class).to receive(:svcs).with('-H', '-o', 'state,fmri').and_return(File.read(my_fixture('svcs_instances.out')))
29
38
  instances = provider_class.instances.map { |p| {:name => p.get(:name), :ensure => p.get(:ensure)} }
30
39
  # we dont manage legacy
31
40
  expect(instances.size).to eq(3)
@@ -35,255 +44,482 @@ describe 'Puppet::Type::Service::Provider::Smf',
35
44
  end
36
45
  end
37
46
 
38
- it "should have a restart method" do
39
- expect(@provider).to respond_to(:restart)
40
- end
47
+ describe '#service_exists?' do
48
+ it 'returns true if the service exists' do
49
+ expect(@provider).to receive(:service_fmri)
50
+ expect(@provider.service_exists?).to be(true)
51
+ end
41
52
 
42
- it "should have a restartcmd method" do
43
- expect(@provider).to respond_to(:restartcmd)
44
- end
53
+ it 'returns false if the service does not exist' do
54
+ expect(@provider).to receive(:service_fmri).and_raise(
55
+ Puppet::ExecutionFailure, 'svcs failed!'
56
+ )
45
57
 
46
- it "should have a start method" do
47
- expect(@provider).to respond_to(:start)
58
+ expect(@provider.service_exists?).to be(false)
59
+ end
48
60
  end
49
61
 
50
- it "should have a stop method" do
51
- expect(@provider).to respond_to(:stop)
52
- end
62
+ describe '#setup_service' do
63
+ it 'noops if the service resource does not have the manifest parameter passed-in' do
64
+ expect(@provider).not_to receive(:svccfg)
53
65
 
54
- it "should have an enabled? method" do
55
- expect(@provider).to respond_to(:enabled?)
56
- end
66
+ set_resource_params({ :manifest => nil })
67
+ @provider.setup_service
68
+ end
57
69
 
58
- it "should have an enable method" do
59
- expect(@provider).to respond_to(:enable)
60
- end
70
+ context 'when the service resource has a manifest parameter passed-in' do
71
+ let(:manifest) { 'foo' }
72
+ before(:each) { set_resource_params({ :manifest => manifest }) }
73
+
74
+ it 'noops if the service resource already exists' do
75
+ expect(@provider).not_to receive(:svccfg)
76
+
77
+ expect(@provider).to receive(:service_exists?).and_return(true)
78
+ @provider.setup_service
79
+ end
61
80
 
62
- it "should have a disable method" do
63
- expect(@provider).to respond_to(:disable)
81
+ it "imports the service resource's manifest" do
82
+ expect(@provider).to receive(:service_exists?).and_return(false)
83
+
84
+ expect(@provider).to receive(:svccfg).with(:import, manifest)
85
+ @provider.setup_service
86
+ end
87
+
88
+ it 'raises a Puppet::Error if SMF fails to import the manifest' do
89
+ expect(@provider).to receive(:service_exists?).and_return(false)
90
+
91
+ failure_reason = 'svccfg failed!'
92
+ expect(@provider).to receive(:svccfg).with(:import, manifest).and_raise(Puppet::ExecutionFailure, failure_reason)
93
+ expect { @provider.setup_service }.to raise_error do |error|
94
+ expect(error).to be_a(Puppet::Error)
95
+ expect(error.message).to match(failure_reason)
96
+ end
97
+ end
98
+ end
64
99
  end
65
100
 
66
- describe "when checking status" do
67
- before(:each) do
68
- allow(@provider).to receive(:complete_service?).and_return(true)
101
+ describe '#service_fmri' do
102
+ it 'returns the memoized the fmri if it exists' do
103
+ @provider.instance_variable_set(:@fmri, 'resource_fmri')
104
+ expect(@provider.service_fmri).to eql('resource_fmri')
69
105
  end
70
106
 
71
- it "should call the external command 'svcs /system/myservice' once" do
72
- expect(@provider).to receive(:svcs).with('-H', '-o', 'state,nstate', "/system/myservice").and_return("online\t-")
73
- @provider.status
107
+ it 'raises a Puppet::Error if the service resource matches multiple FMRIs' do
108
+ expect(@provider).to receive(:svcs).with('-l', @provider.resource[:name]).and_return(File.read(my_fixture('svcs_multiple_fmris.out')))
109
+
110
+ expect { @provider.service_fmri }.to raise_error do |error|
111
+ expect(error).to be_a(Puppet::Error)
112
+ expect(error.message).to match(@provider.resource[:name])
113
+ expect(error.message).to match('multiple')
114
+
115
+ matched_fmris = ["svc:/application/tstapp:one", "svc:/application/tstapp:two"]
116
+ expect(error.message).to match(matched_fmris.join(', '))
117
+ end
74
118
  end
75
119
 
76
- it "should return stopped if svcs can't find the service" do
77
- allow(@provider).to receive(:svcs).and_raise(Puppet::ExecutionFailure.new("no svc found"))
78
- expect(@provider.status).to eq(:stopped)
120
+ it 'raises a Puppet:ExecutionFailure if svcs fails' do
121
+ expect(@provider).to receive(:svcs).with('-l', @provider.resource[:name]).and_raise(
122
+ Puppet::ExecutionFailure, 'svcs failed!'
123
+ )
124
+
125
+ expect { @provider.service_fmri }.to raise_error do |error|
126
+ expect(error).to be_a(Puppet::ExecutionFailure)
127
+ expect(error.message).to match('svcs failed!')
128
+ end
79
129
  end
80
130
 
81
- it "should return stopped for an incomplete service on Solaris 11" do
82
- allow(Facter).to receive(:value).with(:operatingsystemrelease).and_return('11.3')
83
- allow(@provider).to receive(:complete_service?).and_return(false)
84
- expect(@provider.status).to eq(:stopped)
131
+ it "returns the service resource's fmri and memoizes it" do
132
+ expect(@provider).to receive(:svcs).with('-l', @provider.resource[:name]).and_return(File.read(my_fixture('svcs_fmri.out')))
133
+
134
+ expected_fmri = 'svc:/application/tstapp:default'
135
+
136
+ expect(@provider.service_fmri).to eql(expected_fmri)
137
+ expect(@provider.instance_variable_get(:@fmri)).to eql(expected_fmri)
85
138
  end
139
+ end
86
140
 
87
- it "should return running if online in svcs output" do
88
- allow(@provider).to receive(:svcs).and_return("online\t-")
89
- expect(@provider.status).to eq(:running)
141
+ describe '#enabled?' do
142
+ let(:fmri) { 'resource_fmri' }
143
+ before(:each) do
144
+ allow(@provider).to receive(:service_fmri).and_return(fmri)
90
145
  end
91
146
 
92
- it "should return stopped if disabled in svcs output" do
93
- allow(@provider).to receive(:svcs).and_return("disabled\t-")
94
- expect(@provider.status).to eq(:stopped)
147
+ it 'returns :true if the service is enabled' do
148
+ expect(@provider).to receive(:svccfg).with('-s', fmri, 'listprop', 'general/enabled').and_return(
149
+ 'general/enabled boolean true'
150
+ )
151
+
152
+ expect(@provider.enabled?).to be(:true)
95
153
  end
96
154
 
97
- it "should return maintenance if in maintenance in svcs output" do
98
- allow(@provider).to receive(:svcs).and_return("maintenance\t-")
99
- expect(@provider.status).to eq(:maintenance)
155
+ it 'return :false if the service is not enabled' do
156
+ expect(@provider).to receive(:svccfg).with('-s', fmri, 'listprop', 'general/enabled').and_return(
157
+ 'general/enabled boolean false'
158
+ )
159
+
160
+ expect(@provider.enabled?).to be(:false)
100
161
  end
101
162
 
102
- it "should return degraded if in degraded in svcs output" do
103
- allow(@provider).to receive(:svcs).and_return("degraded\t-")
104
- expect(@provider.status).to eq(:degraded)
163
+ it 'returns :false if the service does not exist' do
164
+ expect(@provider).to receive(:service_exists?).and_return(false)
165
+ expect(@provider.enabled?).to be(:false)
105
166
  end
167
+ end
106
168
 
107
- it "should return target state if transitioning in svcs output" do
108
- allow(@provider).to receive(:svcs).and_return("online\tdisabled")
109
- expect(@provider.status).to eq(:stopped)
169
+ describe '#restartcmd' do
170
+ let(:fmri) { 'resource_fmri' }
171
+ before(:each) do
172
+ allow(@provider).to receive(:service_fmri).and_return(fmri)
110
173
  end
111
174
 
112
- it "should throw error if it's a legacy service in svcs output" do
113
- allow(@provider).to receive(:svcs).and_return("legacy_run\t-")
114
- expect { @provider.status }.to raise_error(Puppet::Error, "Cannot manage legacy services through SMF")
175
+ it 'returns the right command for restarting the service for Solaris versions newer than 11.2' do
176
+ expect(Facter).to receive(:value).with(:operatingsystemrelease).and_return('11.3')
177
+
178
+ expect(@provider.restartcmd).to eql([@provider.command(:adm), :restart, '-s', fmri])
115
179
  end
116
- end
117
180
 
118
- context "when starting" do
119
- it "should enable the service if it is not enabled" do
120
- expect(@provider).to receive(:status).and_return(:stopped)
121
- expect(@provider).to receive(:texecute).with(:start, ['/usr/sbin/svcadm', :enable, '-rs', '/system/myservice'], true)
122
- expect(@provider).to receive(:wait).with('online')
123
- @provider.start
181
+ it 'returns the right command for restarting the service on Solaris 11.2' do
182
+ expect(Facter).to receive(:value).with(:operatingsystemrelease).and_return('11.2')
183
+
184
+ expect(@provider.restartcmd).to eql([@provider.command(:adm), :restart, '-s', fmri])
124
185
  end
125
186
 
126
- it "should always execute external command 'svcadm enable /system/myservice'" do
127
- expect(@provider).to receive(:status).and_return(:running)
128
- expect(@provider).to receive(:texecute).with(:start, ['/usr/sbin/svcadm', :enable, '-rs', '/system/myservice'], true)
129
- expect(@provider).to receive(:wait).with('online')
130
- @provider.start
187
+ it 'returns the right command for restarting the service for Solaris versions older than Solaris 11.2' do
188
+ expect(Facter).to receive(:value).with(:operatingsystemrelease).and_return('10.3')
189
+
190
+ expect(@provider.restartcmd).to eql([@provider.command(:adm), :restart, fmri])
131
191
  end
192
+ end
132
193
 
133
- it "should execute external command 'svcadm clear /system/myservice' if in maintenance" do
134
- allow(@provider).to receive(:status).and_return(:maintenance)
135
- expect(@provider).to receive(:texecute).with(:start, ["/usr/sbin/svcadm", :clear, "/system/myservice"], true)
136
- expect(@provider).to receive(:wait).with('online')
137
- @provider.start
194
+ describe '#service_states' do
195
+ let(:fmri) { 'resource_fmri' }
196
+ before(:each) do
197
+ allow(@provider).to receive(:service_fmri).and_return(fmri)
138
198
  end
139
199
 
140
- it "should execute external command 'svcadm clear /system/myservice' if in degraded" do
141
- allow(@provider).to receive(:status).and_return(:degraded)
142
- expect(@provider).to receive(:texecute).with(:start, ["/usr/sbin/svcadm", :clear, "/system/myservice"], true)
143
- expect(@provider).to receive(:wait).with('online')
144
- @provider.start
200
+ it 'returns the current and next states of the service' do
201
+ expect(@provider).to receive(:svcs).with('-H', '-o', 'state,nstate', fmri).and_return(
202
+ 'online disabled'
203
+ )
204
+
205
+ expect(@provider.service_states).to eql({ :current => 'online', :next => 'disabled' })
145
206
  end
146
207
 
147
- it "should error if timeout occurs while starting the service" do
148
- expect(@provider).to receive(:status).and_return(:stopped)
149
- expect(@provider).to receive(:texecute).with(:start, ["/usr/sbin/svcadm", :enable, '-rs', "/system/myservice"], true)
150
- expect(Timeout).to receive(:timeout).with(60).and_raise(Timeout::Error)
151
- expect { @provider.start }.to raise_error Puppet::Error, ('Timed out waiting for /system/myservice to transition states')
208
+ it "returns nil for the next state if svcs marks it as '-'" do
209
+ expect(@provider).to receive(:svcs).with('-H', '-o', 'state,nstate', fmri).and_return(
210
+ 'online -'
211
+ )
212
+
213
+ expect(@provider.service_states).to eql({ :current => 'online', :next => nil })
152
214
  end
153
215
  end
154
216
 
155
- context "when starting a service with a manifest" do
217
+ describe '#wait' do
218
+ # TODO: Document this method!
219
+ def transition_service(from, to, tries)
220
+ intermediate_returns = [{ :current => from, :next => to }] * (tries - 1)
221
+ final_return = { :current => to, :next => nil }
222
+
223
+ allow(@provider).to receive(:service_states).and_return(*intermediate_returns.push(final_return))
224
+ end
225
+
156
226
  before(:each) do
157
- @resource = Puppet::Type.type(:service).new(:name => "/system/myservice", :ensure => :running, :enable => :true, :manifest => "/tmp/myservice.xml")
158
- @provider = provider_class.new(@resource)
159
- allow($CHILD_STATUS).to receive(:exitstatus).and_return(1)
227
+ allow(Timeout).to receive(:timeout).and_yield
228
+ allow(Kernel).to receive(:sleep)
160
229
  end
161
230
 
162
- it "should import the manifest if service is missing" do
163
- allow(@provider).to receive(:complete_service?).and_return(true)
164
- expect(@provider).to receive(:svcs).with('-l', '/system/myservice').and_raise(Puppet::ExecutionFailure, "Exited 1")
165
- expect(@provider).to receive(:svccfg).with(:import, "/tmp/myservice.xml")
166
- expect(@provider).to receive(:texecute).with(:start, ["/usr/sbin/svcadm", :enable, '-rs', "/system/myservice"], true)
167
- expect(@provider).to receive(:wait).with('online')
168
- expect(@provider).to receive(:svcs).with('-H', '-o', 'state,nstate', "/system/myservice").and_return("online\t-")
169
- @provider.start
231
+ it 'waits for the service to enter the desired state' do
232
+ transition_service('online', 'disabled', 1)
233
+ @provider.wait('offline', 'disabled', 'uninitialized')
170
234
  end
171
235
 
172
- it "should handle failures if importing a manifest" do
173
- expect(@provider).to receive(:svcs).with('-l', '/system/myservice').and_raise(Puppet::ExecutionFailure, "Exited 1")
174
- expect(@provider).to receive(:svccfg).and_raise(Puppet::ExecutionFailure.new("can't svccfg import"))
175
- expect { @provider.start }.to raise_error(Puppet::Error, "Cannot config /system/myservice to enable it: can't svccfg import")
236
+ it 'times out and raises a Puppet::Error after sixty seconds' do
237
+ expect(Timeout).to receive(:timeout).with(60).and_raise(Timeout::Error, 'method timed out!')
238
+
239
+ expect { @provider.wait('online') }.to raise_error do |error|
240
+ expect(error).to be_a(Puppet::Error)
241
+ expect(error.message).to match(@provider.resource[:name])
242
+ end
243
+ end
244
+
245
+ it 'sleeps a bit before querying the service state' do
246
+ transition_service('disabled', 'online', 10)
247
+ expect(Kernel).to receive(:sleep).with(1).exactly(9).times
248
+
249
+ @provider.wait('online')
176
250
  end
177
251
  end
178
252
 
179
- context "when stopping" do
180
- it "should execute external command 'svcadm disable /system/myservice'" do
181
- expect(@provider).to receive(:texecute).with(:stop, ["/usr/sbin/svcadm", :disable, '-s', "/system/myservice"], true)
182
- expect(@provider).to receive(:wait).with('offline', 'disabled', 'uninitialized')
183
- @provider.stop
253
+ describe '#restart' do
254
+ let(:fmri) { 'resource_fmri' }
255
+
256
+ before(:each) do
257
+ allow(@provider).to receive(:service_fmri).and_return(fmri)
258
+ allow(@provider).to receive(:texecute)
259
+ allow(@provider).to receive(:wait)
260
+ end
261
+
262
+ it 'should restart the service' do
263
+ expect(@provider).to receive(:texecute)
264
+ @provider.restart
184
265
  end
185
266
 
186
- it "should error if timeout occurs while stopping the service" do
187
- expect(@provider).to receive(:texecute).with(:stop, ["/usr/sbin/svcadm", :disable, '-s', "/system/myservice"], true)
188
- expect(Timeout).to receive(:timeout).with(60).and_raise(Timeout::Error)
189
- expect { @provider.stop }.to raise_error Puppet::Error, ('Timed out waiting for /system/myservice to transition states')
267
+ it 'should wait for the service to restart' do
268
+ expect(@provider).to receive(:wait).with('online')
269
+ @provider.restart
190
270
  end
191
271
  end
192
272
 
193
- context "when restarting" do
194
- it "should error if timeout occurs while restarting the service" do
195
- expect(@provider).to receive(:texecute).with(:restart, ["/usr/sbin/svcadm", :restart, '-s', "/system/myservice"], true)
196
- expect(Timeout).to receive(:timeout).with(60).and_raise(Timeout::Error)
197
- expect { @provider.restart }.to raise_error Puppet::Error, ('Timed out waiting for /system/myservice to transition states')
273
+ describe '#status' do
274
+ let(:states) do
275
+ {
276
+ :current => 'online',
277
+ :next => nil
278
+ }
198
279
  end
199
280
 
200
- context 'with :operatingsystemrelease == 10_u10' do
201
- it "should call 'svcadm restart /system/myservice'" do
202
- allow(Facter).to receive(:value).with(:operatingsystemrelease).and_return('10_u10')
203
- expect(@provider).to receive(:texecute).with(:restart, ["/usr/sbin/svcadm", :restart, "/system/myservice"], true)
204
- expect(@provider).to receive(:wait).with('online')
205
- @provider.restart
206
- end
281
+ before(:each) do
282
+ allow(@provider).to receive(:service_states).and_return(states)
283
+
284
+ allow(Facter).to receive(:value).with(:operatingsystemrelease).and_return('10.3')
207
285
  end
208
286
 
209
- context 'with :operatingsystemrelease == 11.2' do
210
- it "should call 'svcadm restart -s /system/myservice'" do
211
- allow(Facter).to receive(:value).with(:operatingsystemrelease).and_return('11.2')
212
- expect(@provider).to receive(:texecute).with(:restart, ["/usr/sbin/svcadm", :restart, '-s', "/system/myservice"], true)
213
- expect(@provider).to receive(:wait).with('online')
214
- @provider.restart
287
+ it "should run the status command if it's passed in" do
288
+ set_resource_params({ :status => 'status_cmd' })
289
+ expect(@provider).to receive(:ucommand).with(:status, false) do |_, _|
290
+ expect($CHILD_STATUS).to receive(:exitstatus).and_return(0)
215
291
  end
292
+ expect(@provider).not_to receive(:service_states)
293
+
294
+ expect(@provider.status).to eql(:running)
216
295
  end
217
296
 
218
- context 'with :operatingsystemrelease > 11.2' do
219
- it "should call 'svcadm restart -s /system/myservice'" do
220
- allow(Facter).to receive(:value).with(:operatingsystemrelease).and_return('11.3')
221
- expect(@provider).to receive(:texecute).with(:restart, ["/usr/sbin/svcadm", :restart, '-s', "/system/myservice"], true)
222
- expect(@provider).to receive(:wait).with('online')
223
- @provider.restart
297
+ shared_examples 'returns the right status' do |svcs_state, expected_state|
298
+ it "returns '#{expected_state}' if the svcs state is '#{svcs_state}'" do
299
+
300
+ states[:current] = svcs_state
301
+ expect(@provider.status).to eql(expected_state)
224
302
  end
225
303
  end
226
- end
227
304
 
228
- describe '#service_fmri' do
229
- it 'raises a Puppet::Error if the service resource matches multiple FMRIs' do
230
- allow(@provider).to receive(:svcs).with('-l', @provider.resource[:name]).and_return(File.read(my_fixture('svcs_multiple_fmris.out')))
305
+ include_examples 'returns the right status', 'online', :running
306
+ include_examples 'returns the right status', 'offline', :stopped
307
+ include_examples 'returns the right status', 'disabled', :stopped
308
+ include_examples 'returns the right status', 'uninitialized', :stopped
309
+ include_examples 'returns the right status', 'maintenance', :maintenance
310
+ include_examples 'returns the right status', 'degraded', :degraded
231
311
 
232
- expect { @provider.service_fmri }.to raise_error do |error|
312
+ it "raises a Puppet::Error if the svcs state is 'legacy_run'" do
313
+ states[:current] = 'legacy_run'
314
+ expect { @provider.status }.to raise_error do |error|
233
315
  expect(error).to be_a(Puppet::Error)
234
- expect(error.message).to match(@provider.resource[:name])
235
- expect(error.message).to match('multiple')
236
-
237
- matched_fmris = ["svc:/application/tstapp:one", "svc:/application/tstapp:two"]
238
- expect(error.message).to match(matched_fmris.join(', '))
316
+ expect(error.message).to match('legacy')
239
317
  end
240
318
  end
241
319
 
242
- it 'raises a Puppet:ExecutionFailure if svcs fails' do
243
- allow(@provider).to receive(:svcs).with('-l', @provider.resource[:name]).and_raise(
244
- Puppet::ExecutionFailure, 'svcs failed!'
245
- )
246
-
247
- expect { @provider.service_fmri }.to raise_error do |error|
248
- expect(error).to be_a(Puppet::ExecutionFailure)
249
- expect(error.message).to match('svcs failed!')
320
+ it "raises a Puppet::Error if the svcs state is unmanageable" do
321
+ states[:current] = 'unmanageable state'
322
+ expect { @provider.status }.to raise_error do |error|
323
+ expect(error).to be_a(Puppet::Error)
324
+ expect(error.message).to match(states[:current])
250
325
  end
251
326
  end
252
327
 
253
- it "returns the service resource's fmri and memoizes it" do
254
- allow(@provider).to receive(:svcs).with('-l', @provider.resource[:name]).and_return(File.read(my_fixture('svcs_fmri.out')))
328
+ it "returns 'stopped' if the service does not exist" do
329
+ expect(@provider).to receive(:service_states).and_raise(Puppet::ExecutionFailure, 'service does not exist!')
330
+ expect(@provider.status).to eql(:stopped)
331
+ end
255
332
 
256
- expected_fmri = 'svc:/application/tstapp:default'
333
+ it "uses the current state for comparison if the next state is not provided" do
334
+ states[:next] = 'disabled'
335
+ expect(@provider.status).to eql(:stopped)
336
+ end
257
337
 
258
- expect(@provider.service_fmri).to eql(expected_fmri)
259
- expect(@provider.instance_variable_get(:@fmri)).to eql(expected_fmri)
338
+ it "should return stopped for an incomplete service on Solaris 11" do
339
+ allow(Facter).to receive(:value).with(:operatingsystemrelease).and_return('11.3')
340
+ allow(@provider).to receive(:complete_service?).and_return(false)
341
+ expect(@provider.status).to eq(:stopped)
260
342
  end
261
343
  end
262
344
 
263
- describe '#complete_service?' do
264
- let(:fmri) { 'service_fmri' }
265
-
345
+ describe '#maybe_clear_service_then_svcadm' do
346
+ let(:fmri) { 'resource_fmri' }
266
347
  before(:each) do
267
348
  allow(@provider).to receive(:service_fmri).and_return(fmri)
268
349
  end
269
350
 
270
- it 'should raise a Puppet::Error if it is called on an older Solaris machine' do
271
- allow(Facter).to receive(:value).with(:operatingsystemrelease).and_return('10.0')
351
+ it 'applies the svcadm subcommand with the given flags' do
352
+ expect(@provider).to receive(:adm).with('enable', '-rst', fmri)
353
+ @provider.maybe_clear_service_then_svcadm(:stopped, 'enable', '-rst')
354
+ end
272
355
 
273
- expect { @provider.complete_service? }.to raise_error(Puppet::Error)
356
+ [:maintenance, :degraded].each do |status|
357
+ it "clears the service before applying the svcadm subcommand if the service status is #{status}" do
358
+ expect(@provider).to receive(:adm).with('clear', fmri)
359
+ expect(@provider).to receive(:adm).with('enable', '-rst', fmri)
360
+
361
+ @provider.maybe_clear_service_then_svcadm(status, 'enable', '-rst')
362
+ end
274
363
  end
364
+ end
275
365
 
276
- it 'should return false for an incomplete service' do
277
- allow(@provider).to receive(:svccfg).with('-s', fmri, 'listprop', 'general/complete').and_return("")
278
- expect(@provider.complete_service?).to be false
366
+ describe '#flush' do
367
+ def mark_property_for_syncing(property, value)
368
+ properties_to_sync = @provider.instance_variable_get(:@properties_to_sync)
369
+ properties_to_sync[property] = value
279
370
  end
280
371
 
281
- it 'should return true for a complete service' do
282
- allow(@provider).to receive(:svccfg)
283
- .with('-s', fmri, 'listprop', 'general/complete')
284
- .and_return("general/complete astring")
372
+ it 'should noop if enable and ensure do not need to be syncd' do
373
+ expect(@provider).not_to receive(:setup_service)
374
+ @provider.flush
375
+ end
285
376
 
286
- expect(@provider.complete_service?).to be true
377
+ context 'enable or ensure need to be syncd' do
378
+ let(:stopped_states) do
379
+ ['offline', 'disabled', 'uninitialized']
380
+ end
381
+
382
+ let(:fmri) { 'resource_fmri' }
383
+ let(:mock_status) { :maintenance }
384
+ before(:each) do
385
+ allow(@provider).to receive(:setup_service)
386
+ allow(@provider).to receive(:service_fmri).and_return(fmri)
387
+
388
+ # We will update this mock on a per-test basis.
389
+ allow(@provider).to receive(:status).and_return(mock_status)
390
+ allow(@provider).to receive(:wait)
391
+ end
392
+
393
+ context 'only ensure needs to be syncd' do
394
+ it 'stops the service if ensure == stopped' do
395
+ mark_property_for_syncing(:ensure, :stopped)
396
+
397
+ expect(@provider).to receive(:maybe_clear_service_then_svcadm).with(mock_status, 'disable', '-st')
398
+ expect(@provider).to receive(:wait).with(*stopped_states)
399
+
400
+ @provider.flush
401
+ end
402
+
403
+ it 'starts the service if ensure == running' do
404
+ mark_property_for_syncing(:ensure, :running)
405
+
406
+ expect(@provider).to receive(:maybe_clear_service_then_svcadm).with(mock_status, 'enable', '-rst')
407
+ expect(@provider).to receive(:wait).with('online')
408
+
409
+ @provider.flush
410
+ end
411
+ end
412
+
413
+ context 'enable needs to be syncd' do
414
+ before(:each) do
415
+ # We will stub this value out later, this default is useful
416
+ # for the final state tests.
417
+ mark_property_for_syncing(:enable, true)
418
+ end
419
+
420
+ it 'enables the service' do
421
+ mark_property_for_syncing(:enable, true)
422
+
423
+ expect(@provider).to receive(:maybe_clear_service_then_svcadm).with(mock_status, 'enable', '-rs')
424
+
425
+ expect(@provider).to receive(:adm).with('mark', '-I', 'maintenance', fmri)
426
+
427
+ @provider.flush
428
+ end
429
+
430
+ it 'disables the service' do
431
+ mark_property_for_syncing(:enable, false)
432
+
433
+ expect(@provider).to receive(:maybe_clear_service_then_svcadm).with(mock_status, 'disable', '-s')
434
+
435
+ expect(@provider).to receive(:adm).with('mark', '-I', 'maintenance', fmri)
436
+
437
+ @provider.flush
438
+ end
439
+
440
+ context 'when the final service state is running' do
441
+ before(:each) do
442
+ allow(@provider).to receive(:status).and_return(:running)
443
+ end
444
+
445
+ it 'starts the service if enable was false' do
446
+ mark_property_for_syncing(:enable, false)
447
+
448
+ expect(@provider).to receive(:adm).with('disable', '-s', fmri)
449
+ expect(@provider).to receive(:adm).with('enable', '-rst', fmri)
450
+ expect(@provider).to receive(:wait).with('online')
451
+
452
+ @provider.flush
453
+ end
454
+
455
+ it 'waits for the service to start if enable was true' do
456
+ mark_property_for_syncing(:enable, true)
457
+
458
+ expect(@provider).to receive(:adm).with('enable', '-rs', fmri)
459
+ expect(@provider).to receive(:wait).with('online')
460
+
461
+ @provider.flush
462
+ end
463
+ end
464
+
465
+ context 'when the final service state is stopped' do
466
+ before(:each) do
467
+ allow(@provider).to receive(:status).and_return(:stopped)
468
+ end
469
+
470
+ it 'stops the service if enable was true' do
471
+ mark_property_for_syncing(:enable, true)
472
+
473
+ expect(@provider).to receive(:adm).with('enable', '-rs', fmri)
474
+ expect(@provider).to receive(:adm).with('disable', '-st', fmri)
475
+ expect(@provider).to receive(:wait).with(*stopped_states)
476
+
477
+ @provider.flush
478
+ end
479
+
480
+ it 'waits for the service to stop if enable was false' do
481
+ mark_property_for_syncing(:enable, false)
482
+
483
+ expect(@provider).to_not receive(:adm).with('disable', '-st', fmri)
484
+ expect(@provider).to receive(:wait).with(*stopped_states)
485
+
486
+ @provider.flush
487
+ end
488
+ end
489
+
490
+ it 'marks the service as being under maintenance if the final state is maintenance' do
491
+ expect(@provider).to receive(:status).and_return(:maintenance)
492
+
493
+ expect(@provider).to receive(:adm).with('clear', fmri)
494
+ expect(@provider).to receive(:adm).with('enable', '-rs', fmri)
495
+
496
+ expect(@provider).to receive(:adm).with('mark', '-I', 'maintenance', fmri)
497
+ expect(@provider).to receive(:wait).with('maintenance')
498
+
499
+ @provider.flush
500
+ end
501
+
502
+ it 'uses the ensure value as the final state if ensure also needs to be syncd' do
503
+ mark_property_for_syncing(:ensure, :running)
504
+ expect(@provider).to receive(:status).and_return(:stopped)
505
+
506
+ expect(@provider).to receive(:adm).with('enable', '-rs', fmri)
507
+ expect(@provider).to receive(:wait).with('online')
508
+
509
+ @provider.flush
510
+ end
511
+
512
+ it 'marks the final state of a degraded service as running' do
513
+ expect(@provider).to receive(:status).and_return(:degraded)
514
+
515
+ expect(@provider).to receive(:adm).with('clear', fmri)
516
+ expect(@provider).to receive(:adm).with('enable', '-rs', fmri)
517
+
518
+ expect(@provider).to receive(:wait).with('online')
519
+
520
+ @provider.flush
521
+ end
522
+ end
287
523
  end
288
524
  end
289
525
  end