puppet 6.17.0-x64-mingw32 → 7.1.0-x64-mingw32

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

Potentially problematic release.


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

Files changed (622) hide show
  1. checksums.yaml +4 -4
  2. data/CODEOWNERS +2 -16
  3. data/Gemfile +3 -4
  4. data/Gemfile.lock +32 -30
  5. data/README.md +2 -3
  6. data/Rakefile +4 -12
  7. data/conf/fileserver.conf +5 -10
  8. data/ext/build_defaults.yaml +1 -1
  9. data/ext/osx/file_mapping.yaml +0 -5
  10. data/ext/project_data.yaml +2 -14
  11. data/ext/redhat/puppet.spec.erb +0 -1
  12. data/ext/windows/service/daemon.rb +6 -5
  13. data/install.rb +21 -17
  14. data/lib/puppet.rb +11 -20
  15. data/lib/puppet/agent/locker.rb +0 -7
  16. data/lib/puppet/application.rb +172 -98
  17. data/lib/puppet/application/agent.rb +8 -3
  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/application_support.rb +7 -0
  25. data/lib/puppet/configurer.rb +46 -19
  26. data/lib/puppet/configurer/downloader.rb +31 -10
  27. data/lib/puppet/configurer/plugin_handler.rb +21 -19
  28. data/lib/puppet/confine.rb +1 -1
  29. data/lib/puppet/confine/any.rb +1 -1
  30. data/lib/puppet/defaults.rb +116 -162
  31. data/lib/puppet/environments.rb +72 -62
  32. data/lib/puppet/face/catalog.rb +1 -1
  33. data/lib/puppet/face/config.rb +56 -16
  34. data/lib/puppet/face/epp.rb +12 -2
  35. data/lib/puppet/face/facts.rb +66 -6
  36. data/lib/puppet/face/help.rb +1 -1
  37. data/lib/puppet/face/node.rb +3 -3
  38. data/lib/puppet/face/node/clean.rb +10 -2
  39. data/lib/puppet/face/plugin.rb +5 -8
  40. data/lib/puppet/feature/base.rb +1 -1
  41. data/lib/puppet/ffi/posix.rb +10 -0
  42. data/lib/puppet/ffi/posix/constants.rb +14 -0
  43. data/lib/puppet/ffi/posix/functions.rb +24 -0
  44. data/lib/puppet/ffi/windows.rb +12 -0
  45. data/lib/puppet/ffi/windows/api_types.rb +311 -0
  46. data/lib/puppet/ffi/windows/constants.rb +404 -0
  47. data/lib/puppet/ffi/windows/functions.rb +628 -0
  48. data/lib/puppet/ffi/windows/structs.rb +338 -0
  49. data/lib/puppet/file_bucket/dipper.rb +1 -1
  50. data/lib/puppet/file_serving/configuration.rb +0 -5
  51. data/lib/puppet/file_serving/configuration/parser.rb +3 -32
  52. data/lib/puppet/file_serving/http_metadata.rb +1 -1
  53. data/lib/puppet/file_serving/mount.rb +1 -2
  54. data/lib/puppet/file_serving/mount/locales.rb +1 -2
  55. data/lib/puppet/file_serving/mount/pluginfacts.rb +1 -2
  56. data/lib/puppet/file_serving/mount/plugins.rb +1 -2
  57. data/lib/puppet/file_system/file_impl.rb +3 -3
  58. data/lib/puppet/forge/repository.rb +0 -1
  59. data/lib/puppet/functions/epp.rb +1 -0
  60. data/lib/puppet/functions/inline_epp.rb +1 -0
  61. data/lib/puppet/functions/lstrip.rb +4 -4
  62. data/lib/puppet/functions/new.rb +8 -3
  63. data/lib/puppet/functions/reverse_each.rb +1 -1
  64. data/lib/puppet/functions/rstrip.rb +4 -4
  65. data/lib/puppet/functions/step.rb +1 -1
  66. data/lib/puppet/functions/strip.rb +4 -4
  67. data/lib/puppet/generate/models/type/type.rb +4 -1
  68. data/lib/puppet/gettext/config.rb +5 -5
  69. data/lib/puppet/gettext/module_translations.rb +4 -4
  70. data/lib/puppet/http.rb +23 -13
  71. data/lib/puppet/http/client.rb +165 -115
  72. data/lib/puppet/{network/resolver.rb → http/dns.rb} +2 -2
  73. data/lib/puppet/http/errors.rb +16 -0
  74. data/lib/puppet/http/external_client.rb +5 -7
  75. data/lib/puppet/{network/http → http}/factory.rb +8 -11
  76. data/lib/puppet/{network/http → http}/pool.rb +61 -26
  77. data/lib/puppet/{network/http/session.rb → http/pool_entry.rb} +2 -3
  78. data/lib/puppet/http/proxy.rb +137 -0
  79. data/lib/puppet/http/redirector.rb +4 -12
  80. data/lib/puppet/http/resolver.rb +10 -23
  81. data/lib/puppet/http/resolver/server_list.rb +23 -45
  82. data/lib/puppet/http/resolver/settings.rb +7 -10
  83. data/lib/puppet/http/resolver/srv.rb +11 -15
  84. data/lib/puppet/http/response.rb +36 -54
  85. data/lib/puppet/http/response_converter.rb +24 -0
  86. data/lib/puppet/http/response_net_http.rb +42 -0
  87. data/lib/puppet/http/retry_after_handler.rb +4 -13
  88. data/lib/puppet/http/service.rb +15 -27
  89. data/lib/puppet/http/service/ca.rb +11 -22
  90. data/lib/puppet/http/service/compiler.rb +23 -70
  91. data/lib/puppet/http/service/file_server.rb +19 -28
  92. data/lib/puppet/http/service/puppetserver.rb +53 -0
  93. data/lib/puppet/http/service/report.rb +8 -10
  94. data/lib/puppet/http/session.rb +16 -24
  95. data/lib/puppet/{network/http → http}/site.rb +1 -2
  96. data/lib/puppet/indirector/catalog/compiler.rb +1 -1
  97. data/lib/puppet/indirector/catalog/rest.rb +2 -4
  98. data/lib/puppet/indirector/exec.rb +1 -1
  99. data/lib/puppet/indirector/fact_search.rb +60 -0
  100. data/lib/puppet/indirector/facts/facter.rb +27 -6
  101. data/lib/puppet/indirector/facts/json.rb +27 -0
  102. data/lib/puppet/indirector/facts/rest.rb +3 -22
  103. data/lib/puppet/indirector/facts/yaml.rb +4 -59
  104. data/lib/puppet/indirector/file_bucket_file/rest.rb +3 -9
  105. data/lib/puppet/indirector/file_content/rest.rb +2 -6
  106. data/lib/puppet/indirector/file_metadata/http.rb +1 -0
  107. data/lib/puppet/indirector/file_metadata/rest.rb +3 -9
  108. data/lib/puppet/indirector/file_server.rb +1 -8
  109. data/lib/puppet/indirector/generic_http.rb +0 -11
  110. data/lib/puppet/indirector/hiera.rb +4 -0
  111. data/lib/puppet/indirector/indirection.rb +1 -1
  112. data/lib/puppet/indirector/json.rb +5 -1
  113. data/lib/puppet/indirector/msgpack.rb +1 -1
  114. data/lib/puppet/indirector/node/json.rb +8 -0
  115. data/lib/puppet/indirector/node/rest.rb +2 -4
  116. data/lib/puppet/indirector/report/json.rb +34 -0
  117. data/lib/puppet/indirector/report/processor.rb +2 -2
  118. data/lib/puppet/indirector/report/rest.rb +3 -8
  119. data/lib/puppet/indirector/request.rb +1 -102
  120. data/lib/puppet/indirector/rest.rb +12 -263
  121. data/lib/puppet/indirector/yaml.rb +1 -1
  122. data/lib/puppet/module.rb +1 -2
  123. data/lib/puppet/module_tool/applications.rb +0 -1
  124. data/lib/puppet/network/authconfig.rb +2 -96
  125. data/lib/puppet/network/authorization.rb +13 -35
  126. data/lib/puppet/network/format_support.rb +2 -2
  127. data/lib/puppet/network/formats.rb +2 -1
  128. data/lib/puppet/network/http.rb +3 -3
  129. data/lib/puppet/network/http/api/indirected_routes.rb +2 -20
  130. data/lib/puppet/network/http/api/master/v3.rb +11 -13
  131. data/lib/puppet/network/http/api/master/v3/environments.rb +0 -1
  132. data/lib/puppet/network/http/connection.rb +247 -316
  133. data/lib/puppet/network/http/handler.rb +0 -1
  134. data/lib/puppet/network/http/route.rb +2 -2
  135. data/lib/puppet/network/http_pool.rb +16 -34
  136. data/lib/puppet/node.rb +1 -30
  137. data/lib/puppet/node/environment.rb +12 -5
  138. data/lib/puppet/node/facts.rb +17 -0
  139. data/lib/puppet/pal/json_catalog_encoder.rb +4 -0
  140. data/lib/puppet/pal/pal_impl.rb +93 -14
  141. data/lib/puppet/parameter.rb +1 -1
  142. data/lib/puppet/parser/ast/pops_bridge.rb +0 -38
  143. data/lib/puppet/parser/compiler.rb +0 -198
  144. data/lib/puppet/parser/compiler/catalog_validator/relationship_validator.rb +14 -39
  145. data/lib/puppet/parser/functions.rb +21 -17
  146. data/lib/puppet/parser/functions/create_resources.rb +11 -7
  147. data/lib/puppet/parser/resource.rb +0 -69
  148. data/lib/puppet/parser/templatewrapper.rb +1 -1
  149. data/lib/puppet/parser/type_loader.rb +2 -2
  150. data/lib/puppet/pops/adaptable.rb +7 -13
  151. data/lib/puppet/pops/adapters.rb +8 -4
  152. data/lib/puppet/pops/evaluator/collectors/abstract_collector.rb +1 -3
  153. data/lib/puppet/pops/evaluator/evaluator_impl.rb +22 -8
  154. data/lib/puppet/pops/evaluator/runtime3_converter.rb +2 -2
  155. data/lib/puppet/pops/evaluator/runtime3_resource_support.rb +3 -3
  156. data/lib/puppet/pops/evaluator/runtime3_support.rb +1 -1
  157. data/lib/puppet/pops/issues.rb +0 -5
  158. data/lib/puppet/pops/loader/ruby_legacy_function_instantiator.rb +6 -8
  159. data/lib/puppet/pops/loader/runtime3_type_loader.rb +4 -2
  160. data/lib/puppet/pops/loaders.rb +18 -11
  161. data/lib/puppet/pops/lookup/context.rb +1 -1
  162. data/lib/puppet/pops/lookup/hiera_config.rb +14 -1
  163. data/lib/puppet/pops/model/ast.pp +0 -42
  164. data/lib/puppet/pops/model/ast.rb +0 -290
  165. data/lib/puppet/pops/model/factory.rb +0 -45
  166. data/lib/puppet/pops/model/model_label_provider.rb +0 -5
  167. data/lib/puppet/pops/model/model_tree_dumper.rb +0 -22
  168. data/lib/puppet/pops/model/pn_transformer.rb +0 -16
  169. data/lib/puppet/pops/parser/egrammar.ra +0 -56
  170. data/lib/puppet/pops/parser/eparser.rb +1520 -1712
  171. data/lib/puppet/pops/parser/lexer2.rb +4 -4
  172. data/lib/puppet/pops/parser/parser_support.rb +0 -5
  173. data/lib/puppet/pops/resource/resource_type_impl.rb +2 -24
  174. data/lib/puppet/pops/types/iterable.rb +34 -8
  175. data/lib/puppet/pops/types/p_meta_type.rb +1 -1
  176. data/lib/puppet/pops/types/p_type_set_type.rb +4 -0
  177. data/lib/puppet/pops/types/type_calculator.rb +0 -7
  178. data/lib/puppet/pops/types/type_parser.rb +0 -4
  179. data/lib/puppet/pops/types/types.rb +0 -1
  180. data/lib/puppet/pops/validation/checker4_0.rb +28 -52
  181. data/lib/puppet/pops/validation/tasks_checker.rb +0 -12
  182. data/lib/puppet/pops/validation/validator_factory_4_0.rb +1 -2
  183. data/lib/puppet/provider.rb +0 -13
  184. data/lib/puppet/provider/file/windows.rb +1 -1
  185. data/lib/puppet/provider/nameservice.rb +0 -18
  186. data/lib/puppet/provider/package/apt.rb +34 -0
  187. data/lib/puppet/provider/package/dpkg.rb +1 -11
  188. data/lib/puppet/provider/package/gem.rb +27 -5
  189. data/lib/puppet/provider/package/pip.rb +0 -1
  190. data/lib/puppet/provider/package/pip2.rb +17 -0
  191. data/lib/puppet/provider/package/pkg.rb +0 -4
  192. data/lib/puppet/provider/package/portage.rb +1 -1
  193. data/lib/puppet/provider/package/puppet_gem.rb +6 -4
  194. data/lib/puppet/provider/package/puppetserver_gem.rb +180 -0
  195. data/lib/puppet/provider/package/yum.rb +1 -0
  196. data/lib/puppet/provider/package/zypper.rb +3 -0
  197. data/lib/puppet/provider/service/smf.rb +191 -73
  198. data/lib/puppet/provider/user/aix.rb +3 -3
  199. data/lib/puppet/provider/user/directoryservice.rb +0 -10
  200. data/lib/puppet/provider/user/user_role_add.rb +1 -1
  201. data/lib/puppet/provider/user/windows_adsi.rb +18 -1
  202. data/lib/puppet/reference/configuration.rb +2 -0
  203. data/lib/puppet/reference/indirection.rb +1 -1
  204. data/lib/puppet/resource.rb +1 -89
  205. data/lib/puppet/resource/catalog.rb +1 -14
  206. data/lib/puppet/resource/type.rb +5 -120
  207. data/lib/puppet/resource/type_collection.rb +3 -48
  208. data/lib/puppet/runtime.rb +1 -2
  209. data/lib/puppet/settings.rb +84 -35
  210. data/lib/puppet/settings/base_setting.rb +26 -2
  211. data/lib/puppet/settings/integer_setting.rb +17 -0
  212. data/lib/puppet/settings/port_setting.rb +15 -0
  213. data/lib/puppet/settings/priority_setting.rb +5 -4
  214. data/lib/puppet/ssl.rb +10 -6
  215. data/lib/puppet/ssl/base.rb +3 -5
  216. data/lib/puppet/ssl/certificate.rb +0 -6
  217. data/lib/puppet/ssl/certificate_request.rb +1 -12
  218. data/lib/puppet/ssl/certificate_signer.rb +6 -0
  219. data/lib/puppet/ssl/oids.rb +3 -1
  220. data/lib/puppet/ssl/ssl_provider.rb +17 -0
  221. data/lib/puppet/ssl/state_machine.rb +3 -1
  222. data/lib/puppet/ssl/verifier.rb +2 -0
  223. data/lib/puppet/test/test_helper.rb +11 -6
  224. data/lib/puppet/transaction.rb +3 -9
  225. data/lib/puppet/transaction/persistence.rb +1 -1
  226. data/lib/puppet/transaction/report.rb +10 -8
  227. data/lib/puppet/trusted_external.rb +2 -2
  228. data/lib/puppet/type.rb +4 -79
  229. data/lib/puppet/type/file.rb +7 -9
  230. data/lib/puppet/type/file/checksum.rb +1 -1
  231. data/lib/puppet/type/file/source.rb +29 -9
  232. data/lib/puppet/type/filebucket.rb +4 -4
  233. data/lib/puppet/type/notify.rb +2 -2
  234. data/lib/puppet/type/package.rb +5 -13
  235. data/lib/puppet/type/service.rb +4 -0
  236. data/lib/puppet/type/user.rb +19 -4
  237. data/lib/puppet/util.rb +26 -12
  238. data/lib/puppet/util/autoload.rb +9 -7
  239. data/lib/puppet/util/character_encoding.rb +9 -5
  240. data/lib/puppet/util/execution.rb +2 -13
  241. data/lib/puppet/util/http_proxy.rb +2 -215
  242. data/lib/puppet/util/monkey_patches.rb +0 -46
  243. data/lib/puppet/util/posix.rb +53 -4
  244. data/lib/puppet/util/rdoc.rb +0 -7
  245. data/lib/puppet/util/retry_action.rb +1 -1
  246. data/lib/puppet/util/rubygems.rb +5 -1
  247. data/lib/puppet/util/run_mode.rb +14 -2
  248. data/lib/puppet/util/windows.rb +3 -7
  249. data/lib/puppet/util/windows/daemon.rb +360 -0
  250. data/lib/puppet/util/windows/error.rb +1 -0
  251. data/lib/puppet/util/windows/eventlog.rb +4 -9
  252. data/lib/puppet/util/windows/file.rb +8 -242
  253. data/lib/puppet/util/windows/monkey_patches/process.rb +414 -0
  254. data/lib/puppet/util/windows/process.rb +4 -226
  255. data/lib/puppet/util/windows/security.rb +4 -4
  256. data/lib/puppet/util/windows/service.rb +9 -460
  257. data/lib/puppet/util/windows/string.rb +12 -13
  258. data/lib/puppet/util/windows/user.rb +219 -0
  259. data/lib/puppet/util/yaml.rb +0 -22
  260. data/lib/puppet/vendor/require_vendored.rb +0 -1
  261. data/lib/puppet/version.rb +1 -1
  262. data/lib/puppet/x509.rb +5 -1
  263. data/lib/puppet/x509/cert_provider.rb +29 -1
  264. data/locales/puppet.pot +656 -1351
  265. data/man/man5/puppet.conf.5 +72 -97
  266. data/man/man8/puppet-agent.8 +6 -3
  267. data/man/man8/puppet-apply.8 +1 -1
  268. data/man/man8/puppet-catalog.8 +1 -1
  269. data/man/man8/puppet-config.8 +6 -6
  270. data/man/man8/puppet-describe.8 +1 -1
  271. data/man/man8/puppet-device.8 +1 -1
  272. data/man/man8/puppet-doc.8 +1 -1
  273. data/man/man8/puppet-epp.8 +1 -1
  274. data/man/man8/puppet-facts.8 +55 -9
  275. data/man/man8/puppet-filebucket.8 +6 -6
  276. data/man/man8/puppet-generate.8 +1 -1
  277. data/man/man8/puppet-help.8 +1 -1
  278. data/man/man8/puppet-lookup.8 +2 -2
  279. data/man/man8/puppet-module.8 +1 -58
  280. data/man/man8/puppet-node.8 +7 -4
  281. data/man/man8/puppet-parser.8 +1 -1
  282. data/man/man8/puppet-plugin.8 +1 -1
  283. data/man/man8/puppet-report.8 +4 -1
  284. data/man/man8/puppet-resource.8 +1 -1
  285. data/man/man8/puppet-script.8 +1 -1
  286. data/man/man8/puppet-ssl.8 +1 -1
  287. data/man/man8/puppet.8 +2 -2
  288. data/spec/fixtures/integration/application/apply/environments/spec/modules/amod/lib/puppet/provider/applytest/applytest.rb +2 -0
  289. data/spec/fixtures/integration/application/apply/environments/spec/modules/amod/lib/puppet/type/applytest.rb +25 -0
  290. data/spec/fixtures/unit/forge/bacula-releases.json +128 -0
  291. data/spec/fixtures/unit/forge/bacula.tar.gz +0 -0
  292. data/spec/fixtures/unit/provider/package/puppetserver_gem/gem-list-local-packages +30 -0
  293. data/spec/fixtures/unit/provider/service/smf/{svcs.out → svcs_instances.out} +0 -0
  294. data/spec/fixtures/unit/provider/user/aix/aix_passwd_file.out +4 -0
  295. data/spec/integration/application/agent_spec.rb +70 -61
  296. data/spec/integration/application/apply_spec.rb +150 -150
  297. data/spec/integration/application/doc_spec.rb +16 -6
  298. data/spec/integration/application/filebucket_spec.rb +78 -29
  299. data/spec/integration/application/help_spec.rb +44 -0
  300. data/spec/integration/application/lookup_spec.rb +13 -0
  301. data/spec/integration/application/module_spec.rb +68 -0
  302. data/spec/integration/application/plugin_spec.rb +76 -4
  303. data/spec/integration/configurer_spec.rb +14 -0
  304. data/spec/integration/data_binding_spec.rb +82 -0
  305. data/spec/integration/defaults_spec.rb +32 -3
  306. data/spec/integration/directory_environments_spec.rb +17 -17
  307. data/spec/integration/environments/setting_hooks_spec.rb +1 -1
  308. data/spec/integration/indirector/facts/facter_spec.rb +8 -6
  309. data/spec/integration/network/http_pool_spec.rb +3 -21
  310. data/spec/integration/node/environment_spec.rb +1 -1
  311. data/spec/integration/parser/catalog_spec.rb +0 -38
  312. data/spec/integration/parser/node_spec.rb +0 -9
  313. data/spec/integration/parser/pcore_resource_spec.rb +0 -37
  314. data/spec/integration/type/file_spec.rb +5 -4
  315. data/spec/integration/util/execution_spec.rb +22 -0
  316. data/spec/integration/util/windows/adsi_spec.rb +2 -2
  317. data/spec/integration/util/windows/monkey_patches/process_spec.rb +231 -0
  318. data/spec/integration/util/windows/process_spec.rb +26 -32
  319. data/spec/integration/util/windows/security_spec.rb +1 -1
  320. data/spec/integration/util/windows/user_spec.rb +7 -0
  321. data/spec/integration/util_spec.rb +7 -33
  322. data/spec/lib/puppet_spec/matchers.rb +0 -80
  323. data/spec/lib/puppet_spec/puppetserver.rb +9 -1
  324. data/spec/lib/puppet_spec/settings.rb +7 -1
  325. data/spec/shared_contexts/types_setup.rb +2 -0
  326. data/spec/spec_helper.rb +2 -0
  327. data/spec/unit/agent_spec.rb +0 -2
  328. data/spec/unit/application/agent_spec.rb +3 -4
  329. data/spec/unit/application/config_spec.rb +224 -4
  330. data/spec/unit/application/doc_spec.rb +2 -2
  331. data/spec/unit/application/face_base_spec.rb +6 -4
  332. data/spec/unit/application/facts_spec.rb +74 -8
  333. data/spec/unit/application/filebucket_spec.rb +41 -39
  334. data/spec/unit/application/resource_spec.rb +3 -1
  335. data/spec/unit/application/ssl_spec.rb +17 -4
  336. data/spec/unit/application_spec.rb +43 -4
  337. data/spec/unit/certificate_factory_spec.rb +1 -1
  338. data/spec/unit/configurer/downloader_spec.rb +14 -0
  339. data/spec/unit/configurer/plugin_handler_spec.rb +56 -18
  340. data/spec/unit/configurer_spec.rb +96 -44
  341. data/spec/unit/confine_spec.rb +2 -1
  342. data/spec/unit/context/trusted_information_spec.rb +2 -6
  343. data/spec/unit/defaults_spec.rb +26 -32
  344. data/spec/unit/environments_spec.rb +173 -32
  345. data/spec/unit/face/config_spec.rb +65 -12
  346. data/spec/unit/face/facts_spec.rb +4 -0
  347. data/spec/unit/face/node_spec.rb +16 -4
  348. data/spec/unit/face/plugin_spec.rb +73 -33
  349. data/spec/unit/file_bucket/file_spec.rb +1 -1
  350. data/spec/unit/file_serving/configuration/parser_spec.rb +14 -18
  351. data/spec/unit/file_serving/configuration_spec.rb +6 -12
  352. data/spec/unit/file_serving/mount/locales_spec.rb +2 -2
  353. data/spec/unit/file_serving/mount/pluginfacts_spec.rb +2 -2
  354. data/spec/unit/file_serving/mount/plugins_spec.rb +2 -2
  355. data/spec/unit/file_system/uniquefile_spec.rb +18 -0
  356. data/spec/unit/file_system_spec.rb +1 -2
  357. data/spec/unit/functions/camelcase_spec.rb +1 -1
  358. data/spec/unit/functions/capitalize_spec.rb +1 -1
  359. data/spec/unit/functions/downcase_spec.rb +1 -1
  360. data/spec/unit/functions/inline_epp_spec.rb +26 -1
  361. data/spec/unit/functions/upcase_spec.rb +1 -1
  362. data/spec/unit/http/client_spec.rb +7 -9
  363. data/spec/unit/{network/resolver_spec.rb → http/dns_spec.rb} +3 -3
  364. data/spec/unit/http/external_client_spec.rb +4 -4
  365. data/spec/unit/{network/http → http}/factory_spec.rb +5 -11
  366. data/spec/unit/{network/http/session_spec.rb → http/pool_entry_spec.rb} +3 -3
  367. data/spec/unit/{network/http → http}/pool_spec.rb +12 -17
  368. data/spec/unit/{util/http_proxy_spec.rb → http/proxy_spec.rb} +2 -69
  369. data/spec/unit/http/resolver_spec.rb +34 -15
  370. data/spec/unit/http/service/ca_spec.rb +2 -3
  371. data/spec/unit/http/service/compiler_spec.rb +51 -65
  372. data/spec/unit/http/service/file_server_spec.rb +5 -6
  373. data/spec/unit/http/service/puppetserver_spec.rb +112 -0
  374. data/spec/unit/http/service/report_spec.rb +2 -3
  375. data/spec/unit/http/service_spec.rb +1 -3
  376. data/spec/unit/http/session_spec.rb +24 -35
  377. data/spec/unit/{network/http → http}/site_spec.rb +3 -3
  378. data/spec/unit/indirector/catalog/json_spec.rb +1 -1
  379. data/spec/unit/indirector/catalog/rest_spec.rb +1 -1
  380. data/spec/unit/indirector/facts/facter_spec.rb +97 -0
  381. data/spec/unit/indirector/facts/json_spec.rb +255 -0
  382. data/spec/unit/indirector/facts/rest_spec.rb +1 -1
  383. data/spec/unit/indirector/file_bucket_file/file_spec.rb +5 -3
  384. data/spec/unit/indirector/file_content/rest_spec.rb +0 -4
  385. data/spec/unit/indirector/file_metadata/rest_spec.rb +0 -4
  386. data/spec/unit/indirector/file_server_spec.rb +1 -15
  387. data/spec/unit/indirector/json_spec.rb +8 -8
  388. data/spec/unit/indirector/msgpack_spec.rb +8 -8
  389. data/spec/unit/indirector/node/json_spec.rb +33 -0
  390. data/spec/unit/indirector/node/rest_spec.rb +1 -1
  391. data/spec/{integration/indirector/report/yaml.rb → unit/indirector/report/json_spec.rb} +13 -24
  392. data/spec/unit/indirector/report/rest_spec.rb +2 -17
  393. data/spec/unit/indirector/report/yaml_spec.rb +72 -8
  394. data/spec/unit/indirector/request_spec.rb +2 -266
  395. data/spec/unit/indirector/rest_spec.rb +98 -752
  396. data/spec/unit/indirector/yaml_spec.rb +7 -7
  397. data/spec/unit/module_tool/tar/mini_spec.rb +20 -0
  398. data/spec/unit/network/authconfig_spec.rb +2 -132
  399. data/spec/unit/network/authorization_spec.rb +2 -55
  400. data/spec/unit/network/format_support_spec.rb +3 -2
  401. data/spec/unit/network/formats_spec.rb +4 -4
  402. data/spec/unit/network/http/api/indirected_routes_spec.rb +1 -97
  403. data/spec/unit/network/http/api/master/v3/environments_spec.rb +12 -23
  404. data/spec/unit/network/http/api/master/v3_spec.rb +28 -7
  405. data/spec/unit/network/http/api_spec.rb +10 -0
  406. data/spec/unit/network/http/connection_spec.rb +19 -41
  407. data/spec/unit/network/http/handler_spec.rb +0 -6
  408. data/spec/unit/network/http_pool_spec.rb +0 -4
  409. data/spec/unit/node/environment_spec.rb +51 -22
  410. data/spec/unit/node_spec.rb +2 -54
  411. data/spec/unit/parser/functions/create_resources_spec.rb +2 -20
  412. data/spec/unit/parser/templatewrapper_spec.rb +4 -3
  413. data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +4 -7
  414. data/spec/unit/pops/loaders/loaders_spec.rb +76 -21
  415. data/spec/unit/pops/lookup/lookup_spec.rb +25 -0
  416. data/spec/unit/pops/parser/parse_application_spec.rb +4 -22
  417. data/spec/unit/pops/parser/parse_basic_expressions_spec.rb +0 -1
  418. data/spec/unit/pops/parser/parse_capabilities_spec.rb +8 -21
  419. data/spec/unit/pops/parser/parse_site_spec.rb +20 -24
  420. data/spec/unit/pops/resource/resource_type_impl_spec.rb +0 -71
  421. data/spec/unit/pops/serialization/to_from_hr_spec.rb +1 -1
  422. data/spec/unit/pops/types/type_calculator_spec.rb +6 -6
  423. data/spec/unit/pops/types/type_factory_spec.rb +1 -1
  424. data/spec/unit/pops/validator/validator_spec.rb +61 -46
  425. data/spec/unit/pops/visitor_spec.rb +1 -1
  426. data/spec/unit/provider/exec_spec.rb +4 -3
  427. data/spec/unit/provider/nameservice_spec.rb +0 -57
  428. data/spec/unit/provider/package/apt_spec.rb +77 -0
  429. data/spec/unit/provider/package/aptitude_spec.rb +1 -0
  430. data/spec/unit/provider/package/dpkg_spec.rb +22 -55
  431. data/spec/unit/provider/package/gem_spec.rb +32 -0
  432. data/spec/unit/provider/package/openbsd_spec.rb +2 -0
  433. data/spec/unit/provider/package/pip2_spec.rb +36 -0
  434. data/spec/unit/provider/package/puppet_gem_spec.rb +6 -2
  435. data/spec/unit/provider/package/puppetserver_gem_spec.rb +137 -0
  436. data/spec/unit/provider/package/yum_spec.rb +31 -0
  437. data/spec/unit/provider/package/zypper_spec.rb +14 -0
  438. data/spec/unit/provider/service/base_spec.rb +2 -4
  439. data/spec/unit/provider/service/bsd_spec.rb +5 -1
  440. data/spec/unit/provider/service/daemontools_spec.rb +1 -1
  441. data/spec/unit/provider/service/debian_spec.rb +3 -5
  442. data/spec/unit/provider/service/freebsd_spec.rb +1 -1
  443. data/spec/unit/provider/service/gentoo_spec.rb +4 -5
  444. data/spec/unit/provider/service/init_spec.rb +45 -5
  445. data/spec/unit/provider/service/launchd_spec.rb +5 -6
  446. data/spec/unit/provider/service/openrc_spec.rb +4 -5
  447. data/spec/unit/provider/service/openwrt_spec.rb +1 -1
  448. data/spec/unit/provider/service/redhat_spec.rb +1 -1
  449. data/spec/unit/provider/service/runit_spec.rb +2 -1
  450. data/spec/unit/provider/service/smf_spec.rb +402 -166
  451. data/spec/unit/provider/service/src_spec.rb +3 -5
  452. data/spec/unit/provider/service/systemd_spec.rb +3 -6
  453. data/spec/unit/provider/service/upstart_spec.rb +4 -5
  454. data/spec/unit/provider/service/windows_spec.rb +28 -1
  455. data/spec/unit/provider/user/aix_spec.rb +5 -0
  456. data/spec/unit/provider/user/pw_spec.rb +2 -0
  457. data/spec/unit/provider/user/useradd_spec.rb +1 -0
  458. data/spec/unit/provider/user/windows_adsi_spec.rb +82 -0
  459. data/spec/unit/provider_spec.rb +0 -12
  460. data/spec/unit/puppet_pal_2pec.rb +40 -0
  461. data/spec/unit/puppet_pal_catalog_spec.rb +45 -0
  462. data/spec/unit/reports/store_spec.rb +17 -13
  463. data/spec/unit/resource/type_collection_spec.rb +2 -22
  464. data/spec/unit/resource_spec.rb +0 -56
  465. data/spec/unit/settings/http_extra_headers_spec.rb +2 -4
  466. data/spec/unit/settings/integer_setting_spec.rb +42 -0
  467. data/spec/unit/settings/port_setting_spec.rb +31 -0
  468. data/spec/unit/settings/priority_setting_spec.rb +4 -4
  469. data/spec/unit/settings_spec.rb +586 -239
  470. data/spec/unit/ssl/base_spec.rb +36 -3
  471. data/spec/unit/ssl/certificate_request_spec.rb +15 -45
  472. data/spec/unit/ssl/certificate_spec.rb +2 -11
  473. data/spec/unit/ssl/ssl_provider_spec.rb +11 -8
  474. data/spec/unit/ssl/state_machine_spec.rb +0 -1
  475. data/spec/unit/ssl/verifier_spec.rb +0 -21
  476. data/spec/unit/transaction/persistence_spec.rb +15 -0
  477. data/spec/unit/transaction/report_spec.rb +2 -2
  478. data/spec/unit/transaction/resource_harness_spec.rb +2 -2
  479. data/spec/unit/transaction_spec.rb +45 -79
  480. data/spec/unit/type/file/checksum_spec.rb +6 -6
  481. data/spec/unit/type/file/content_spec.rb +1 -1
  482. data/spec/unit/type/file/ensure_spec.rb +1 -1
  483. data/spec/unit/type/file/mode_spec.rb +1 -1
  484. data/spec/unit/type/file/source_spec.rb +1 -2
  485. data/spec/unit/type/file_spec.rb +12 -6
  486. data/spec/unit/type/filebucket_spec.rb +1 -1
  487. data/spec/unit/type/package_spec.rb +1 -1
  488. data/spec/unit/type/service_spec.rb +35 -2
  489. data/spec/unit/type/user_spec.rb +31 -2
  490. data/spec/unit/type_spec.rb +20 -0
  491. data/spec/unit/util/backups_spec.rb +0 -2
  492. data/spec/unit/util/character_encoding_spec.rb +4 -4
  493. data/spec/unit/util/command_line_spec.rb +11 -6
  494. data/spec/unit/util/execution_spec.rb +0 -29
  495. data/spec/unit/util/monkey_patches_spec.rb +0 -6
  496. data/spec/unit/util/posix_spec.rb +357 -15
  497. data/spec/unit/util/rubygems_spec.rb +2 -2
  498. data/spec/unit/util/run_mode_spec.rb +27 -127
  499. data/spec/unit/util/storage_spec.rb +3 -1
  500. data/spec/unit/util/windows/string_spec.rb +1 -3
  501. data/spec/unit/util/yaml_spec.rb +0 -54
  502. data/spec/unit/util_spec.rb +0 -18
  503. metadata +84 -261
  504. data/conf/auth.conf +0 -150
  505. data/lib/puppet/application/cert.rb +0 -76
  506. data/lib/puppet/application/key.rb +0 -4
  507. data/lib/puppet/application/man.rb +0 -4
  508. data/lib/puppet/application/status.rb +0 -4
  509. data/lib/puppet/face/key.rb +0 -16
  510. data/lib/puppet/face/man.rb +0 -145
  511. data/lib/puppet/face/module/build.rb +0 -14
  512. data/lib/puppet/face/module/generate.rb +0 -14
  513. data/lib/puppet/face/module/search.rb +0 -103
  514. data/lib/puppet/face/status.rb +0 -51
  515. data/lib/puppet/indirector/certificate/file.rb +0 -9
  516. data/lib/puppet/indirector/certificate/rest.rb +0 -18
  517. data/lib/puppet/indirector/certificate_request/file.rb +0 -9
  518. data/lib/puppet/indirector/certificate_request/memory.rb +0 -7
  519. data/lib/puppet/indirector/certificate_request/rest.rb +0 -11
  520. data/lib/puppet/indirector/file_content/http.rb +0 -22
  521. data/lib/puppet/indirector/key/file.rb +0 -46
  522. data/lib/puppet/indirector/key/memory.rb +0 -7
  523. data/lib/puppet/indirector/ssl_file.rb +0 -162
  524. data/lib/puppet/indirector/status.rb +0 -3
  525. data/lib/puppet/indirector/status/local.rb +0 -12
  526. data/lib/puppet/indirector/status/rest.rb +0 -27
  527. data/lib/puppet/module_tool/applications/searcher.rb +0 -29
  528. data/lib/puppet/network/auth_config_parser.rb +0 -90
  529. data/lib/puppet/network/authstore.rb +0 -283
  530. data/lib/puppet/network/http/api/master/v3/authorization.rb +0 -18
  531. data/lib/puppet/network/http/api/master/v3/environment.rb +0 -88
  532. data/lib/puppet/network/http/base_pool.rb +0 -36
  533. data/lib/puppet/network/http/compression.rb +0 -127
  534. data/lib/puppet/network/http/connection_adapter.rb +0 -184
  535. data/lib/puppet/network/http/nocache_pool.rb +0 -28
  536. data/lib/puppet/network/rest_controller.rb +0 -2
  537. data/lib/puppet/network/rights.rb +0 -210
  538. data/lib/puppet/parser/compiler/catalog_validator/env_relationship_validator.rb +0 -66
  539. data/lib/puppet/parser/compiler/catalog_validator/site_validator.rb +0 -22
  540. data/lib/puppet/parser/environment_compiler.rb +0 -202
  541. data/lib/puppet/pops/types/enumeration.rb +0 -16
  542. data/lib/puppet/resource/capability_finder.rb +0 -154
  543. data/lib/puppet/rest/errors.rb +0 -15
  544. data/lib/puppet/rest/response.rb +0 -35
  545. data/lib/puppet/rest/route.rb +0 -85
  546. data/lib/puppet/rest/routes.rb +0 -135
  547. data/lib/puppet/ssl/host.rb +0 -505
  548. data/lib/puppet/ssl/key.rb +0 -61
  549. data/lib/puppet/ssl/validator.rb +0 -61
  550. data/lib/puppet/ssl/validator/default_validator.rb +0 -209
  551. data/lib/puppet/ssl/validator/no_validator.rb +0 -22
  552. data/lib/puppet/ssl/verifier_adapter.rb +0 -58
  553. data/lib/puppet/status.rb +0 -40
  554. data/lib/puppet/util/connection.rb +0 -88
  555. data/lib/puppet/util/ssl.rb +0 -83
  556. data/lib/puppet/util/windows/api_types.rb +0 -295
  557. data/lib/puppet/vendor/load_pathspec.rb +0 -1
  558. data/lib/puppet/vendor/pathspec/CHANGELOG.md +0 -2
  559. data/lib/puppet/vendor/pathspec/LICENSE +0 -201
  560. data/lib/puppet/vendor/pathspec/PUPPET_README.md +0 -6
  561. data/lib/puppet/vendor/pathspec/README.md +0 -53
  562. data/lib/puppet/vendor/pathspec/lib/pathspec.rb +0 -122
  563. data/lib/puppet/vendor/pathspec/lib/pathspec/gitignorespec.rb +0 -275
  564. data/lib/puppet/vendor/pathspec/lib/pathspec/regexspec.rb +0 -17
  565. data/lib/puppet/vendor/pathspec/lib/pathspec/spec.rb +0 -14
  566. data/man/man8/puppet-key.8 +0 -126
  567. data/man/man8/puppet-man.8 +0 -76
  568. data/man/man8/puppet-status.8 +0 -108
  569. data/spec/integration/faces/config_spec.rb +0 -91
  570. data/spec/integration/faces/documentation_spec.rb +0 -57
  571. data/spec/integration/file_bucket/file_spec.rb +0 -50
  572. data/spec/integration/file_serving/content_spec.rb +0 -7
  573. data/spec/integration/file_serving/fileset_spec.rb +0 -12
  574. data/spec/integration/file_serving/metadata_spec.rb +0 -8
  575. data/spec/integration/file_serving/terminus_helper_spec.rb +0 -20
  576. data/spec/integration/file_system/uniquefile_spec.rb +0 -26
  577. data/spec/integration/module_tool/forge_spec.rb +0 -51
  578. data/spec/integration/module_tool/tar/mini_spec.rb +0 -28
  579. data/spec/integration/network/authconfig_spec.rb +0 -256
  580. data/spec/integration/provider/service/init_spec.rb +0 -48
  581. data/spec/integration/provider/service/systemd_spec.rb +0 -25
  582. data/spec/integration/provider/service/windows_spec.rb +0 -50
  583. data/spec/integration/reference/providers_spec.rb +0 -21
  584. data/spec/integration/reports_spec.rb +0 -13
  585. data/spec/integration/ssl/certificate_request_spec.rb +0 -44
  586. data/spec/integration/ssl/host_spec.rb +0 -72
  587. data/spec/integration/ssl/key_spec.rb +0 -99
  588. data/spec/shared_behaviours/file_serving_model.rb +0 -51
  589. data/spec/unit/capability_spec.rb +0 -414
  590. data/spec/unit/face/catalog_spec.rb +0 -6
  591. data/spec/unit/face/key_spec.rb +0 -9
  592. data/spec/unit/face/man_spec.rb +0 -25
  593. data/spec/unit/face/module/search_spec.rb +0 -231
  594. data/spec/unit/face/module_spec.rb +0 -3
  595. data/spec/unit/face/status_spec.rb +0 -9
  596. data/spec/unit/indirector/certificate/file_spec.rb +0 -14
  597. data/spec/unit/indirector/certificate/rest_spec.rb +0 -61
  598. data/spec/unit/indirector/certificate_request/file_spec.rb +0 -14
  599. data/spec/unit/indirector/certificate_request/rest_spec.rb +0 -25
  600. data/spec/unit/indirector/key/file_spec.rb +0 -79
  601. data/spec/unit/indirector/ssl_file_spec.rb +0 -305
  602. data/spec/unit/indirector/status/local_spec.rb +0 -10
  603. data/spec/unit/indirector/status/rest_spec.rb +0 -50
  604. data/spec/unit/man_spec.rb +0 -31
  605. data/spec/unit/module_tool/applications/searcher_spec.rb +0 -38
  606. data/spec/unit/network/auth_config_parser_spec.rb +0 -115
  607. data/spec/unit/network/authstore_spec.rb +0 -422
  608. data/spec/unit/network/http/api/master/v3/authorization_spec.rb +0 -57
  609. data/spec/unit/network/http/api/master/v3/environment_spec.rb +0 -185
  610. data/spec/unit/network/http/compression_spec.rb +0 -240
  611. data/spec/unit/network/http/nocache_pool_spec.rb +0 -64
  612. data/spec/unit/network/http_spec.rb +0 -9
  613. data/spec/unit/network/rights_spec.rb +0 -439
  614. data/spec/unit/parser/environment_compiler_spec.rb +0 -730
  615. data/spec/unit/pops/types/enumeration_spec.rb +0 -51
  616. data/spec/unit/resource/capability_finder_spec.rb +0 -143
  617. data/spec/unit/rest/route_spec.rb +0 -132
  618. data/spec/unit/ssl/host_spec.rb +0 -650
  619. data/spec/unit/ssl/key_spec.rb +0 -173
  620. data/spec/unit/ssl/validator_spec.rb +0 -278
  621. data/spec/unit/status_spec.rb +0 -45
  622. data/spec/unit/util/ssl_spec.rb +0 -91
@@ -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