puppet 6.20.0-x64-mingw32 → 7.0.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 (484) hide show
  1. checksums.yaml +4 -4
  2. data/CODEOWNERS +16 -2
  3. data/Gemfile +0 -2
  4. data/Gemfile.lock +18 -24
  5. data/README.md +1 -1
  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/application.rb +178 -108
  15. data/lib/puppet/application/agent.rb +0 -1
  16. data/lib/puppet/application/apply.rb +2 -3
  17. data/lib/puppet/application/device.rb +100 -105
  18. data/lib/puppet/application/filebucket.rb +13 -9
  19. data/lib/puppet/application/script.rb +0 -1
  20. data/lib/puppet/application/ssl.rb +1 -1
  21. data/lib/puppet/application_support.rb +0 -7
  22. data/lib/puppet/configurer.rb +30 -45
  23. data/lib/puppet/configurer/plugin_handler.rb +21 -19
  24. data/lib/puppet/defaults.rb +97 -167
  25. data/lib/puppet/environments.rb +59 -58
  26. data/lib/puppet/face/facts.rb +51 -51
  27. data/lib/puppet/face/help.rb +1 -1
  28. data/lib/puppet/face/plugin.rb +5 -8
  29. data/lib/puppet/ffi/windows.rb +12 -0
  30. data/lib/puppet/ffi/windows/api_types.rb +311 -0
  31. data/lib/puppet/ffi/windows/constants.rb +404 -0
  32. data/lib/puppet/ffi/windows/functions.rb +628 -0
  33. data/lib/puppet/ffi/windows/structs.rb +338 -0
  34. data/lib/puppet/file_serving/configuration.rb +0 -5
  35. data/lib/puppet/file_serving/configuration/parser.rb +3 -32
  36. data/lib/puppet/file_serving/http_metadata.rb +1 -1
  37. data/lib/puppet/file_serving/mount.rb +1 -2
  38. data/lib/puppet/forge/repository.rb +0 -1
  39. data/lib/puppet/generate/models/type/type.rb +4 -1
  40. data/lib/puppet/http.rb +22 -13
  41. data/lib/puppet/http/client.rb +164 -114
  42. data/lib/puppet/{network/resolver.rb → http/dns.rb} +2 -2
  43. data/lib/puppet/http/errors.rb +16 -0
  44. data/lib/puppet/http/external_client.rb +5 -7
  45. data/lib/puppet/{network/http → http}/factory.rb +8 -11
  46. data/lib/puppet/{network/http → http}/pool.rb +61 -26
  47. data/lib/puppet/{network/http/session.rb → http/pool_entry.rb} +2 -3
  48. data/lib/puppet/http/proxy.rb +137 -0
  49. data/lib/puppet/http/redirector.rb +4 -12
  50. data/lib/puppet/http/resolver.rb +5 -15
  51. data/lib/puppet/http/resolver/server_list.rb +6 -10
  52. data/lib/puppet/http/resolver/settings.rb +4 -7
  53. data/lib/puppet/http/resolver/srv.rb +7 -11
  54. data/lib/puppet/http/response.rb +36 -54
  55. data/lib/puppet/http/response_converter.rb +24 -0
  56. data/lib/puppet/http/response_net_http.rb +42 -0
  57. data/lib/puppet/http/retry_after_handler.rb +4 -13
  58. data/lib/puppet/http/service.rb +12 -26
  59. data/lib/puppet/http/service/ca.rb +11 -22
  60. data/lib/puppet/http/service/compiler.rb +22 -69
  61. data/lib/puppet/http/service/file_server.rb +18 -27
  62. data/lib/puppet/http/service/puppetserver.rb +26 -12
  63. data/lib/puppet/http/service/report.rb +8 -10
  64. data/lib/puppet/http/session.rb +11 -20
  65. data/lib/puppet/{network/http → http}/site.rb +1 -2
  66. data/lib/puppet/indirector/catalog/rest.rb +2 -4
  67. data/lib/puppet/indirector/facts/facter.rb +24 -3
  68. data/lib/puppet/indirector/facts/rest.rb +3 -22
  69. data/lib/puppet/indirector/file_bucket_file/rest.rb +3 -9
  70. data/lib/puppet/indirector/file_content/rest.rb +2 -6
  71. data/lib/puppet/indirector/file_metadata/rest.rb +3 -9
  72. data/lib/puppet/indirector/file_server.rb +1 -8
  73. data/lib/puppet/indirector/generic_http.rb +0 -11
  74. data/lib/puppet/indirector/node/rest.rb +2 -4
  75. data/lib/puppet/indirector/report/rest.rb +3 -8
  76. data/lib/puppet/indirector/request.rb +0 -101
  77. data/lib/puppet/indirector/rest.rb +12 -263
  78. data/lib/puppet/module_tool/applications.rb +0 -1
  79. data/lib/puppet/module_tool/applications/installer.rb +2 -48
  80. data/lib/puppet/module_tool/errors/shared.rb +2 -17
  81. data/lib/puppet/network/authconfig.rb +2 -96
  82. data/lib/puppet/network/authorization.rb +13 -35
  83. data/lib/puppet/network/http.rb +3 -3
  84. data/lib/puppet/network/http/api/indirected_routes.rb +2 -20
  85. data/lib/puppet/network/http/api/master/v3.rb +11 -13
  86. data/lib/puppet/network/http/connection.rb +247 -316
  87. data/lib/puppet/network/http/handler.rb +0 -1
  88. data/lib/puppet/network/http_pool.rb +16 -34
  89. data/lib/puppet/node.rb +1 -30
  90. data/lib/puppet/pal/json_catalog_encoder.rb +4 -0
  91. data/lib/puppet/pal/pal_impl.rb +3 -1
  92. data/lib/puppet/parser/ast/leaf.rb +2 -3
  93. data/lib/puppet/parser/ast/pops_bridge.rb +0 -38
  94. data/lib/puppet/parser/compiler.rb +0 -198
  95. data/lib/puppet/parser/compiler/catalog_validator/relationship_validator.rb +14 -39
  96. data/lib/puppet/parser/resource.rb +0 -69
  97. data/lib/puppet/parser/templatewrapper.rb +1 -1
  98. data/lib/puppet/pops/evaluator/deferred_resolver.rb +3 -5
  99. data/lib/puppet/pops/evaluator/evaluator_impl.rb +0 -5
  100. data/lib/puppet/pops/evaluator/runtime3_resource_support.rb +3 -3
  101. data/lib/puppet/pops/evaluator/runtime3_support.rb +1 -1
  102. data/lib/puppet/pops/issues.rb +0 -5
  103. data/lib/puppet/pops/loader/ruby_legacy_function_instantiator.rb +6 -8
  104. data/lib/puppet/pops/model/ast.pp +0 -42
  105. data/lib/puppet/pops/model/ast.rb +0 -290
  106. data/lib/puppet/pops/model/ast_transformer.rb +1 -1
  107. data/lib/puppet/pops/model/factory.rb +0 -45
  108. data/lib/puppet/pops/model/model_label_provider.rb +0 -5
  109. data/lib/puppet/pops/model/model_tree_dumper.rb +0 -22
  110. data/lib/puppet/pops/model/pn_transformer.rb +0 -16
  111. data/lib/puppet/pops/parser/egrammar.ra +0 -56
  112. data/lib/puppet/pops/parser/eparser.rb +1520 -1712
  113. data/lib/puppet/pops/parser/lexer2.rb +4 -4
  114. data/lib/puppet/pops/parser/parser_support.rb +0 -5
  115. data/lib/puppet/pops/resource/resource_type_impl.rb +2 -24
  116. data/lib/puppet/pops/types/type_calculator.rb +0 -7
  117. data/lib/puppet/pops/types/type_parser.rb +0 -4
  118. data/lib/puppet/pops/types/types.rb +0 -1
  119. data/lib/puppet/pops/validation/checker4_0.rb +9 -37
  120. data/lib/puppet/pops/validation/tasks_checker.rb +0 -12
  121. data/lib/puppet/pops/validation/validator_factory_4_0.rb +1 -2
  122. data/lib/puppet/provider.rb +0 -13
  123. data/lib/puppet/provider/nameservice.rb +0 -18
  124. data/lib/puppet/provider/package/apt.rb +0 -4
  125. data/lib/puppet/provider/package/dpkg.rb +0 -10
  126. data/lib/puppet/provider/package/gem.rb +23 -3
  127. data/lib/puppet/provider/package/pip.rb +0 -1
  128. data/lib/puppet/provider/package/pkg.rb +0 -4
  129. data/lib/puppet/provider/package/portage.rb +1 -1
  130. data/lib/puppet/provider/package/puppet_gem.rb +1 -4
  131. data/lib/puppet/provider/service/smf.rb +191 -73
  132. data/lib/puppet/provider/user/aix.rb +2 -2
  133. data/lib/puppet/provider/user/directoryservice.rb +0 -10
  134. data/lib/puppet/reference/configuration.rb +7 -6
  135. data/lib/puppet/reference/indirection.rb +1 -1
  136. data/lib/puppet/resource.rb +1 -89
  137. data/lib/puppet/resource/catalog.rb +1 -14
  138. data/lib/puppet/resource/type.rb +3 -119
  139. data/lib/puppet/resource/type_collection.rb +3 -48
  140. data/lib/puppet/runtime.rb +1 -2
  141. data/lib/puppet/settings.rb +73 -66
  142. data/lib/puppet/settings/integer_setting.rb +17 -0
  143. data/lib/puppet/settings/port_setting.rb +15 -0
  144. data/lib/puppet/settings/priority_setting.rb +5 -4
  145. data/lib/puppet/ssl.rb +10 -6
  146. data/lib/puppet/ssl/base.rb +3 -5
  147. data/lib/puppet/ssl/certificate.rb +0 -6
  148. data/lib/puppet/ssl/certificate_request.rb +1 -12
  149. data/lib/puppet/ssl/certificate_signer.rb +6 -0
  150. data/lib/puppet/ssl/oids.rb +3 -1
  151. data/lib/puppet/ssl/ssl_provider.rb +17 -0
  152. data/lib/puppet/ssl/state_machine.rb +3 -1
  153. data/lib/puppet/ssl/verifier.rb +2 -0
  154. data/lib/puppet/test/test_helper.rb +1 -3
  155. data/lib/puppet/transaction.rb +1 -7
  156. data/lib/puppet/transaction/report.rb +2 -4
  157. data/lib/puppet/type.rb +0 -76
  158. data/lib/puppet/type/file.rb +5 -7
  159. data/lib/puppet/type/file/checksum.rb +1 -1
  160. data/lib/puppet/type/file/source.rb +1 -1
  161. data/lib/puppet/type/filebucket.rb +3 -3
  162. data/lib/puppet/type/package.rb +5 -13
  163. data/lib/puppet/util/autoload.rb +8 -1
  164. data/lib/puppet/util/execution.rb +0 -11
  165. data/lib/puppet/util/http_proxy.rb +2 -215
  166. data/lib/puppet/util/monkey_patches.rb +0 -46
  167. data/lib/puppet/util/posix.rb +5 -54
  168. data/lib/puppet/util/rdoc.rb +0 -7
  169. data/lib/puppet/util/retry_action.rb +1 -1
  170. data/lib/puppet/util/run_mode.rb +9 -1
  171. data/lib/puppet/util/windows.rb +3 -8
  172. data/lib/puppet/util/windows/daemon.rb +360 -0
  173. data/lib/puppet/util/windows/error.rb +1 -0
  174. data/lib/puppet/util/windows/eventlog.rb +4 -9
  175. data/lib/puppet/util/windows/file.rb +8 -242
  176. data/lib/puppet/util/windows/monkey_patches/process.rb +414 -0
  177. data/lib/puppet/util/windows/process.rb +4 -226
  178. data/lib/puppet/util/windows/service.rb +9 -460
  179. data/lib/puppet/util/windows/string.rb +12 -13
  180. data/lib/puppet/util/yaml.rb +0 -22
  181. data/lib/puppet/vendor/require_vendored.rb +0 -1
  182. data/lib/puppet/version.rb +1 -1
  183. data/lib/puppet/x509.rb +5 -1
  184. data/lib/puppet/x509/cert_provider.rb +29 -1
  185. data/locales/puppet.pot +587 -1312
  186. data/man/man5/puppet.conf.5 +39 -99
  187. data/man/man8/puppet-agent.8 +2 -2
  188. data/man/man8/puppet-apply.8 +2 -2
  189. data/man/man8/puppet-catalog.8 +1 -1
  190. data/man/man8/puppet-config.8 +1 -1
  191. data/man/man8/puppet-describe.8 +1 -1
  192. data/man/man8/puppet-device.8 +2 -2
  193. data/man/man8/puppet-doc.8 +1 -1
  194. data/man/man8/puppet-epp.8 +1 -1
  195. data/man/man8/puppet-facts.8 +51 -36
  196. data/man/man8/puppet-filebucket.8 +4 -4
  197. data/man/man8/puppet-generate.8 +1 -1
  198. data/man/man8/puppet-help.8 +1 -1
  199. data/man/man8/puppet-lookup.8 +1 -1
  200. data/man/man8/puppet-module.8 +1 -58
  201. data/man/man8/puppet-node.8 +1 -1
  202. data/man/man8/puppet-parser.8 +1 -1
  203. data/man/man8/puppet-plugin.8 +1 -1
  204. data/man/man8/puppet-report.8 +1 -1
  205. data/man/man8/puppet-resource.8 +1 -1
  206. data/man/man8/puppet-script.8 +2 -2
  207. data/man/man8/puppet-ssl.8 +1 -1
  208. data/man/man8/puppet.8 +2 -2
  209. data/spec/fixtures/unit/provider/service/smf/{svcs.out → svcs_instances.out} +0 -0
  210. data/spec/fixtures/unit/provider/user/aix/aix_passwd_file.out +0 -4
  211. data/spec/integration/application/agent_spec.rb +27 -138
  212. data/spec/integration/application/apply_spec.rb +1 -20
  213. data/spec/integration/application/filebucket_spec.rb +16 -16
  214. data/spec/integration/application/help_spec.rb +2 -0
  215. data/spec/integration/application/plugin_spec.rb +23 -1
  216. data/spec/integration/defaults_spec.rb +14 -3
  217. data/spec/integration/network/http_pool_spec.rb +3 -21
  218. data/spec/integration/parser/catalog_spec.rb +0 -38
  219. data/spec/integration/parser/node_spec.rb +0 -9
  220. data/spec/integration/parser/pcore_resource_spec.rb +0 -37
  221. data/spec/integration/resource/type_collection_spec.rb +6 -2
  222. data/spec/integration/transaction_spec.rb +9 -4
  223. data/spec/integration/type/file_spec.rb +5 -4
  224. data/spec/integration/util/windows/adsi_spec.rb +1 -3
  225. data/spec/integration/util/windows/monkey_patches/process_spec.rb +231 -0
  226. data/spec/integration/util/windows/registry_spec.rb +10 -0
  227. data/spec/integration/util/windows/security_spec.rb +1 -1
  228. data/spec/lib/puppet_spec/puppetserver.rb +1 -1
  229. data/spec/lib/puppet_spec/settings.rb +1 -0
  230. data/spec/spec_helper.rb +6 -1
  231. data/spec/unit/agent_spec.rb +6 -10
  232. data/spec/unit/application/agent_spec.rb +1 -0
  233. data/spec/unit/application/facts_spec.rb +35 -0
  234. data/spec/unit/application/filebucket_spec.rb +43 -39
  235. data/spec/unit/application/ssl_spec.rb +2 -2
  236. data/spec/unit/application_spec.rb +9 -51
  237. data/spec/unit/certificate_factory_spec.rb +1 -1
  238. data/spec/unit/configurer/downloader_spec.rb +6 -2
  239. data/spec/unit/configurer/plugin_handler_spec.rb +56 -18
  240. data/spec/unit/configurer_spec.rb +12 -9
  241. data/spec/unit/confine/feature_spec.rb +1 -1
  242. data/spec/unit/confine_spec.rb +2 -8
  243. data/spec/unit/context/trusted_information_spec.rb +2 -6
  244. data/spec/unit/defaults_spec.rb +72 -42
  245. data/spec/unit/environments_spec.rb +19 -99
  246. data/spec/unit/face/facts_spec.rb +4 -0
  247. data/spec/unit/face/node_spec.rb +11 -0
  248. data/spec/unit/face/plugin_spec.rb +73 -33
  249. data/spec/unit/file_bucket/file_spec.rb +1 -1
  250. data/spec/unit/file_serving/configuration/parser_spec.rb +15 -18
  251. data/spec/unit/file_serving/configuration_spec.rb +6 -12
  252. data/spec/unit/file_serving/metadata_spec.rb +3 -3
  253. data/spec/unit/file_serving/terminus_helper_spec.rb +4 -11
  254. data/spec/unit/forge/module_release_spec.rb +7 -2
  255. data/spec/unit/functions/camelcase_spec.rb +1 -1
  256. data/spec/unit/functions/capitalize_spec.rb +1 -1
  257. data/spec/unit/functions/downcase_spec.rb +1 -1
  258. data/spec/unit/functions/upcase_spec.rb +1 -1
  259. data/spec/unit/http/client_spec.rb +7 -8
  260. data/spec/unit/{network/resolver_spec.rb → http/dns_spec.rb} +3 -3
  261. data/spec/unit/http/external_client_spec.rb +4 -4
  262. data/spec/unit/{network/http → http}/factory_spec.rb +5 -11
  263. data/spec/unit/{network/http/session_spec.rb → http/pool_entry_spec.rb} +3 -3
  264. data/spec/unit/{network/http → http}/pool_spec.rb +12 -17
  265. data/spec/unit/{util/http_proxy_spec.rb → http/proxy_spec.rb} +2 -69
  266. data/spec/unit/http/resolver_spec.rb +13 -13
  267. data/spec/unit/http/service/compiler_spec.rb +0 -62
  268. data/spec/unit/http/service/file_server_spec.rb +3 -3
  269. data/spec/unit/http/service/puppetserver_spec.rb +34 -4
  270. data/spec/unit/http/service_spec.rb +0 -1
  271. data/spec/unit/http/session_spec.rb +16 -14
  272. data/spec/unit/{network/http → http}/site_spec.rb +3 -3
  273. data/spec/unit/indirector/face_spec.rb +1 -0
  274. data/spec/unit/indirector/facts/facter_spec.rb +98 -0
  275. data/spec/unit/indirector/file_bucket_file/file_spec.rb +5 -3
  276. data/spec/unit/indirector/file_bucket_file/selector_spec.rb +8 -26
  277. data/spec/unit/indirector/file_content/rest_spec.rb +0 -4
  278. data/spec/unit/indirector/file_metadata/rest_spec.rb +0 -4
  279. data/spec/unit/indirector/file_server_spec.rb +1 -15
  280. data/spec/unit/indirector/indirection_spec.rb +12 -8
  281. data/spec/unit/indirector/report/rest_spec.rb +2 -17
  282. data/spec/unit/indirector/request_spec.rb +0 -264
  283. data/spec/unit/indirector/rest_spec.rb +98 -752
  284. data/spec/unit/indirector_spec.rb +2 -2
  285. data/spec/unit/module_tool/applications/installer_spec.rb +0 -66
  286. data/spec/unit/network/authconfig_spec.rb +2 -129
  287. data/spec/unit/network/authorization_spec.rb +2 -55
  288. data/spec/unit/network/formats_spec.rb +4 -4
  289. data/spec/unit/network/http/api/indirected_routes_spec.rb +5 -92
  290. data/spec/unit/network/http/api/master/v3_spec.rb +28 -7
  291. data/spec/unit/network/http/api_spec.rb +10 -0
  292. data/spec/unit/network/http/connection_spec.rb +19 -41
  293. data/spec/unit/network/http/handler_spec.rb +0 -1
  294. data/spec/unit/network/http_pool_spec.rb +0 -4
  295. data/spec/unit/node/environment_spec.rb +33 -21
  296. data/spec/unit/node_spec.rb +2 -54
  297. data/spec/unit/parser/compiler_spec.rb +19 -3
  298. data/spec/unit/parser/functions/create_resources_spec.rb +2 -20
  299. data/spec/unit/parser/resource_spec.rb +8 -14
  300. data/spec/unit/parser/templatewrapper_spec.rb +3 -4
  301. data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +4 -7
  302. data/spec/unit/pops/loaders/loaders_spec.rb +6 -21
  303. data/spec/unit/pops/parser/parse_application_spec.rb +4 -22
  304. data/spec/unit/pops/parser/parse_basic_expressions_spec.rb +0 -1
  305. data/spec/unit/pops/parser/parse_capabilities_spec.rb +8 -21
  306. data/spec/unit/pops/parser/parse_site_spec.rb +20 -24
  307. data/spec/unit/pops/resource/resource_type_impl_spec.rb +0 -71
  308. data/spec/unit/pops/serialization/to_from_hr_spec.rb +1 -1
  309. data/spec/unit/pops/types/type_calculator_spec.rb +6 -6
  310. data/spec/unit/pops/types/type_factory_spec.rb +1 -1
  311. data/spec/unit/pops/validator/validator_spec.rb +61 -46
  312. data/spec/unit/pops/visitor_spec.rb +1 -1
  313. data/spec/unit/property_spec.rb +0 -1
  314. data/spec/unit/provider/nameservice_spec.rb +64 -122
  315. data/spec/unit/provider/package/apt_spec.rb +8 -4
  316. data/spec/unit/provider/package/base_spec.rb +5 -6
  317. data/spec/unit/provider/package/dpkg_spec.rb +0 -48
  318. data/spec/unit/provider/package/gem_spec.rb +32 -0
  319. data/spec/unit/provider/package/pacman_spec.rb +12 -18
  320. data/spec/unit/provider/package/pip_spec.rb +11 -6
  321. data/spec/unit/provider/package/pkgdmg_spec.rb +4 -0
  322. data/spec/unit/provider/package/puppet_gem_spec.rb +3 -2
  323. data/spec/unit/provider/service/smf_spec.rb +401 -165
  324. data/spec/unit/provider/service/windows_spec.rb +0 -1
  325. data/spec/unit/provider/user/aix_spec.rb +0 -5
  326. data/spec/unit/provider/user/hpux_spec.rb +1 -1
  327. data/spec/unit/provider/user/pw_spec.rb +0 -2
  328. data/spec/unit/provider/user/useradd_spec.rb +0 -1
  329. data/spec/unit/provider_spec.rb +8 -18
  330. data/spec/unit/resource/type_collection_spec.rb +2 -22
  331. data/spec/unit/resource/type_spec.rb +1 -1
  332. data/spec/unit/resource_spec.rb +10 -67
  333. data/spec/unit/settings/http_extra_headers_spec.rb +2 -4
  334. data/spec/unit/settings/integer_setting_spec.rb +42 -0
  335. data/spec/unit/settings/port_setting_spec.rb +31 -0
  336. data/spec/unit/settings/priority_setting_spec.rb +4 -4
  337. data/spec/unit/settings_spec.rb +23 -13
  338. data/spec/unit/ssl/base_spec.rb +37 -3
  339. data/spec/unit/ssl/certificate_request_spec.rb +15 -45
  340. data/spec/unit/ssl/certificate_spec.rb +2 -11
  341. data/spec/unit/ssl/ssl_provider_spec.rb +2 -5
  342. data/spec/unit/ssl/state_machine_spec.rb +0 -1
  343. data/spec/unit/ssl/verifier_spec.rb +0 -21
  344. data/spec/unit/transaction/additional_resource_generator_spec.rb +7 -3
  345. data/spec/unit/transaction/event_manager_spec.rb +11 -14
  346. data/spec/unit/transaction/report_spec.rb +0 -2
  347. data/spec/unit/transaction/resource_harness_spec.rb +2 -2
  348. data/spec/unit/transaction_spec.rb +48 -91
  349. data/spec/unit/type/file/checksum_spec.rb +6 -6
  350. data/spec/unit/type/file/content_spec.rb +2 -1
  351. data/spec/unit/type/file/ensure_spec.rb +1 -1
  352. data/spec/unit/type/file/mode_spec.rb +1 -1
  353. data/spec/unit/type/file/selinux_spec.rb +2 -0
  354. data/spec/unit/type/file/source_spec.rb +0 -1
  355. data/spec/unit/type/file_spec.rb +18 -6
  356. data/spec/unit/type/group_spec.rb +6 -13
  357. data/spec/unit/type/package_spec.rb +1 -1
  358. data/spec/unit/type/resources_spec.rb +7 -7
  359. data/spec/unit/type/service_spec.rb +1 -1
  360. data/spec/unit/type/tidy_spec.rb +1 -0
  361. data/spec/unit/type_spec.rb +22 -2
  362. data/spec/unit/util/at_fork_spec.rb +2 -2
  363. data/spec/unit/util/autoload_spec.rb +1 -5
  364. data/spec/unit/util/backups_spec.rb +2 -3
  365. data/spec/unit/util/execution_spec.rb +11 -44
  366. data/spec/unit/util/inifile_spec.rb +14 -6
  367. data/spec/unit/util/log_spec.rb +7 -8
  368. data/spec/unit/util/logging_spec.rb +3 -3
  369. data/spec/unit/util/monkey_patches_spec.rb +0 -6
  370. data/spec/unit/util/posix_spec.rb +15 -363
  371. data/spec/unit/util/run_mode_spec.rb +21 -121
  372. data/spec/unit/util/selinux_spec.rb +52 -76
  373. data/spec/unit/util/storage_spec.rb +1 -3
  374. data/spec/unit/util/suidmanager_spec.rb +41 -44
  375. data/spec/unit/util/windows/string_spec.rb +1 -3
  376. data/spec/unit/util/yaml_spec.rb +0 -54
  377. data/spec/unit/util_spec.rb +6 -31
  378. metadata +40 -233
  379. data/conf/auth.conf +0 -150
  380. data/lib/puppet/application/cert.rb +0 -76
  381. data/lib/puppet/application/key.rb +0 -4
  382. data/lib/puppet/application/man.rb +0 -4
  383. data/lib/puppet/application/status.rb +0 -4
  384. data/lib/puppet/face/key.rb +0 -16
  385. data/lib/puppet/face/man.rb +0 -145
  386. data/lib/puppet/face/module/build.rb +0 -14
  387. data/lib/puppet/face/module/generate.rb +0 -14
  388. data/lib/puppet/face/module/search.rb +0 -103
  389. data/lib/puppet/face/status.rb +0 -51
  390. data/lib/puppet/ffi/posix.rb +0 -10
  391. data/lib/puppet/ffi/posix/constants.rb +0 -14
  392. data/lib/puppet/ffi/posix/functions.rb +0 -24
  393. data/lib/puppet/indirector/certificate/file.rb +0 -9
  394. data/lib/puppet/indirector/certificate/rest.rb +0 -18
  395. data/lib/puppet/indirector/certificate_request/file.rb +0 -9
  396. data/lib/puppet/indirector/certificate_request/memory.rb +0 -7
  397. data/lib/puppet/indirector/certificate_request/rest.rb +0 -11
  398. data/lib/puppet/indirector/file_content/http.rb +0 -22
  399. data/lib/puppet/indirector/key/file.rb +0 -46
  400. data/lib/puppet/indirector/key/memory.rb +0 -7
  401. data/lib/puppet/indirector/ssl_file.rb +0 -162
  402. data/lib/puppet/indirector/status.rb +0 -3
  403. data/lib/puppet/indirector/status/local.rb +0 -12
  404. data/lib/puppet/indirector/status/rest.rb +0 -27
  405. data/lib/puppet/module_tool/applications/searcher.rb +0 -29
  406. data/lib/puppet/network/auth_config_parser.rb +0 -90
  407. data/lib/puppet/network/authstore.rb +0 -283
  408. data/lib/puppet/network/http/api/master/v3/authorization.rb +0 -18
  409. data/lib/puppet/network/http/api/master/v3/environment.rb +0 -88
  410. data/lib/puppet/network/http/base_pool.rb +0 -36
  411. data/lib/puppet/network/http/compression.rb +0 -127
  412. data/lib/puppet/network/http/connection_adapter.rb +0 -184
  413. data/lib/puppet/network/http/nocache_pool.rb +0 -28
  414. data/lib/puppet/network/rest_controller.rb +0 -2
  415. data/lib/puppet/network/rights.rb +0 -210
  416. data/lib/puppet/parser/compiler/catalog_validator/env_relationship_validator.rb +0 -66
  417. data/lib/puppet/parser/compiler/catalog_validator/site_validator.rb +0 -22
  418. data/lib/puppet/parser/environment_compiler.rb +0 -202
  419. data/lib/puppet/pops/types/enumeration.rb +0 -16
  420. data/lib/puppet/resource/capability_finder.rb +0 -154
  421. data/lib/puppet/rest/errors.rb +0 -15
  422. data/lib/puppet/rest/response.rb +0 -35
  423. data/lib/puppet/rest/route.rb +0 -85
  424. data/lib/puppet/rest/routes.rb +0 -135
  425. data/lib/puppet/settings/alias_setting.rb +0 -37
  426. data/lib/puppet/ssl/host.rb +0 -505
  427. data/lib/puppet/ssl/key.rb +0 -61
  428. data/lib/puppet/ssl/validator.rb +0 -61
  429. data/lib/puppet/ssl/validator/default_validator.rb +0 -209
  430. data/lib/puppet/ssl/validator/no_validator.rb +0 -22
  431. data/lib/puppet/ssl/verifier_adapter.rb +0 -58
  432. data/lib/puppet/status.rb +0 -40
  433. data/lib/puppet/util/connection.rb +0 -88
  434. data/lib/puppet/util/fact_dif.rb +0 -62
  435. data/lib/puppet/util/ssl.rb +0 -83
  436. data/lib/puppet/util/windows/api_types.rb +0 -309
  437. data/lib/puppet/util/windows/monkey_patches/dir.rb +0 -40
  438. data/lib/puppet/vendor/load_pathspec.rb +0 -1
  439. data/lib/puppet/vendor/pathspec/CHANGELOG.md +0 -2
  440. data/lib/puppet/vendor/pathspec/LICENSE +0 -201
  441. data/lib/puppet/vendor/pathspec/PUPPET_README.md +0 -6
  442. data/lib/puppet/vendor/pathspec/README.md +0 -53
  443. data/lib/puppet/vendor/pathspec/lib/pathspec.rb +0 -122
  444. data/lib/puppet/vendor/pathspec/lib/pathspec/gitignorespec.rb +0 -275
  445. data/lib/puppet/vendor/pathspec/lib/pathspec/regexspec.rb +0 -17
  446. data/lib/puppet/vendor/pathspec/lib/pathspec/spec.rb +0 -14
  447. data/man/man8/puppet-key.8 +0 -126
  448. data/man/man8/puppet-man.8 +0 -76
  449. data/man/man8/puppet-status.8 +0 -108
  450. data/spec/fixtures/integration/application/agent/cached_deferred_catalog.json +0 -91
  451. data/spec/integration/network/authconfig_spec.rb +0 -256
  452. data/spec/integration/util/windows/monkey_patches/dir_spec.rb +0 -11
  453. data/spec/unit/application/man_spec.rb +0 -52
  454. data/spec/unit/capability_spec.rb +0 -414
  455. data/spec/unit/face/key_spec.rb +0 -9
  456. data/spec/unit/face/module/search_spec.rb +0 -231
  457. data/spec/unit/face/status_spec.rb +0 -9
  458. data/spec/unit/indirector/certificate/file_spec.rb +0 -14
  459. data/spec/unit/indirector/certificate/rest_spec.rb +0 -61
  460. data/spec/unit/indirector/certificate_request/file_spec.rb +0 -14
  461. data/spec/unit/indirector/certificate_request/rest_spec.rb +0 -25
  462. data/spec/unit/indirector/key/file_spec.rb +0 -78
  463. data/spec/unit/indirector/ssl_file_spec.rb +0 -305
  464. data/spec/unit/indirector/status/local_spec.rb +0 -10
  465. data/spec/unit/indirector/status/rest_spec.rb +0 -50
  466. data/spec/unit/module_tool/applications/searcher_spec.rb +0 -38
  467. data/spec/unit/network/auth_config_parser_spec.rb +0 -115
  468. data/spec/unit/network/authstore_spec.rb +0 -422
  469. data/spec/unit/network/http/api/master/v3/authorization_spec.rb +0 -57
  470. data/spec/unit/network/http/api/master/v3/environment_spec.rb +0 -185
  471. data/spec/unit/network/http/compression_spec.rb +0 -240
  472. data/spec/unit/network/http/nocache_pool_spec.rb +0 -64
  473. data/spec/unit/network/http_spec.rb +0 -9
  474. data/spec/unit/network/rights_spec.rb +0 -439
  475. data/spec/unit/parser/environment_compiler_spec.rb +0 -730
  476. data/spec/unit/pops/evaluator/deferred_resolver_spec.rb +0 -20
  477. data/spec/unit/pops/types/enumeration_spec.rb +0 -51
  478. data/spec/unit/resource/capability_finder_spec.rb +0 -148
  479. data/spec/unit/rest/route_spec.rb +0 -132
  480. data/spec/unit/ssl/host_spec.rb +0 -645
  481. data/spec/unit/ssl/key_spec.rb +0 -173
  482. data/spec/unit/ssl/validator_spec.rb +0 -278
  483. data/spec/unit/status_spec.rb +0 -45
  484. data/spec/unit/util/ssl_spec.rb +0 -91
@@ -11,7 +11,9 @@ describe Puppet::Type.type(:package).provider(:apt) do
11
11
  end
12
12
 
13
13
  let(:provider) do
14
- resource.provider
14
+ provider = subject()
15
+ provider.resource = resource
16
+ provider
15
17
  end
16
18
 
17
19
  it "should be the default provider on :osfamily => Debian" do
@@ -86,7 +88,7 @@ Version table:
86
88
 
87
89
  describe ".instances" do
88
90
  before do
89
- allow(Puppet::Type::Package::ProviderDpkg).to receive(:instances).and_return([provider])
91
+ allow(Puppet::Type::Package::ProviderDpkg).to receive(:instances).and_return([resource])
90
92
  end
91
93
 
92
94
  context "when package is manual marked" do
@@ -95,7 +97,8 @@ Version table:
95
97
  end
96
98
 
97
99
  it 'sets mark to manual' do
98
- expect(described_class.instances.map(&:mark)).to eq([:manual])
100
+ expect(resource).to receive(:mark=).with(:manual)
101
+ described_class.instances
99
102
  end
100
103
  end
101
104
 
@@ -105,7 +108,8 @@ Version table:
105
108
  end
106
109
 
107
110
  it 'does not set mark to manual' do
108
- expect(described_class.instances.map(&:mark)).to eq([nil])
111
+ expect(resource).not_to receive(:mark=).with(:manual)
112
+ described_class.instances
109
113
  end
110
114
  end
111
115
  end
@@ -1,18 +1,17 @@
1
1
  require 'spec_helper'
2
2
  require 'puppet/provider/package'
3
3
 
4
- Puppet::Type.type(:package).provide(:test_base_provider, parent: Puppet::Provider::Package) do
5
- def query; end
6
- end
7
-
8
4
  describe Puppet::Provider::Package do
9
- let(:provider) { Puppet::Type.type(:package).provider(:test_base_provider).new }
10
-
11
5
  it 'returns absent for uninstalled packages when not purgeable' do
6
+ provider = Puppet::Provider::Package.new
7
+ expect(provider).to receive(:query).and_return(nil)
8
+ expect(provider.class).to receive(:feature?).with(:purgeable).and_return(false)
12
9
  expect(provider.properties[:ensure]).to eq(:absent)
13
10
  end
14
11
 
15
12
  it 'returns purged for uninstalled packages when purgeable' do
13
+ provider = Puppet::Provider::Package.new
14
+ expect(provider).to receive(:query).and_return(nil)
16
15
  expect(provider.class).to receive(:feature?).with(:purgeable).and_return(true)
17
16
  expect(provider.properties[:ensure]).to eq(:purged)
18
17
  end
@@ -392,39 +392,13 @@ describe Puppet::Type.type(:package).provider(:dpkg), unless: Puppet::Util::Plat
392
392
  allow(Tempfile).to receive(:open).and_yield(tempfile)
393
393
  end
394
394
 
395
- it "installs first if package is not present and ensure holding" do
396
- allow(provider).to receive(:execute)
397
- allow(provider).to receive(:package_not_installed?).and_return(true)
398
- expect(provider).to receive(:install).once
399
- expect(provider).to receive(:hold)
400
- provider.deprecated_hold
401
- end
402
-
403
- it "skips install new package if hold is true" do
404
- allow(provider).to receive(:execute)
405
- allow(provider).to receive(:package_not_installed?).and_return(true)
406
- expect(provider).to receive(:install).once
407
- expect(provider).to receive(:hold)
408
- provider.deprecated_hold
409
- end
410
-
411
- it "skips install new package if package is allready installed" do
412
- allow(provider).to receive(:execute)
413
- allow(provider).to receive(:package_not_installed?).and_return(false)
414
- expect(provider).not_to receive(:install)
415
- expect(provider).to receive(:hold)
416
- provider.deprecated_hold
417
- end
418
-
419
395
  it "executes dpkg --set-selections when holding" do
420
- allow(provider).to receive(:package_not_installed?).and_return(false)
421
396
  allow(provider).to receive(:install)
422
397
  expect(provider).to receive(:execute).with([:dpkg, '--set-selections'], {:failonfail => false, :combine => false, :stdinfile => tempfile.path}).once
423
398
  provider.hold
424
399
  end
425
400
 
426
401
  it "executes dpkg --set-selections when unholding" do
427
- allow(provider).to receive(:package_not_installed?).and_return(false)
428
402
  allow(provider).to receive(:install)
429
403
  expect(provider).to receive(:execute).with([:dpkg, '--set-selections'], {:failonfail => false, :combine => false, :stdinfile => tempfile.path}).once
430
404
  provider.hold
@@ -467,26 +441,4 @@ describe Puppet::Type.type(:package).provider(:dpkg), unless: Puppet::Util::Plat
467
441
  provider.purge
468
442
  end
469
443
 
470
- context "package_not_installed?" do
471
- context "allow_virtual false" do
472
- before do
473
- allow(resource).to receive(:allow_virtual?).and_return(false)
474
- end
475
-
476
- it "returns true if package is not found" do
477
- expect(provider).to receive(:dpkgquery).with("-W", "--showformat", "'${Status} ${Package} ${Version}\\n'", resource_name).and_raise(Puppet::ExecutionFailure.new("eh"))
478
- expect(provider.package_not_installed?).to eq(true)
479
- end
480
-
481
- it "returns true if package is not installed" do
482
- expect(provider).to receive(:dpkgquery).with("-W", "--showformat", "'${Status} ${Package} ${Version}\\n'", resource_name).and_return("unknown ok not-installed #{resource_name}")
483
- expect(provider.package_not_installed?).to eq(true)
484
- end
485
-
486
- it "returns false if package is installed" do
487
- expect(provider).to receive(:dpkgquery).with("-W", "--showformat", "'${Status} ${Package} ${Version}\\n'", resource_name).and_return("install ok installed resource_name 1.2.3")
488
- expect(provider.package_not_installed?).to eq(false)
489
- end
490
- end
491
- end
492
444
  end
@@ -12,6 +12,10 @@ context Puppet::Type.type(:package).provider(:gem) do
12
12
  let(:provider_gem_cmd) { '/provider/gem' }
13
13
  let(:execute_options) { {:failonfail => true, :combine => true, :custom_environment => {"HOME"=>ENV["HOME"]}} }
14
14
 
15
+ before do
16
+ allow(Puppet::Util::Platform).to receive(:windows?).and_return(false)
17
+ end
18
+
15
19
  context 'installing myresource' do
16
20
  let(:resource) do
17
21
  Puppet::Type.type(:package).new(
@@ -36,6 +40,34 @@ context Puppet::Type.type(:package).provider(:gem) do
36
40
  allow(provider).to receive(:rubygem_version).and_return('1.9.9')
37
41
  end
38
42
 
43
+ context 'on windows' do
44
+ let(:path) do
45
+ "C:\\Program Files\\Puppet Labs\\Puppet\\puppet\\bin;C:\\Program Files\\Puppet Labs\\Puppet\\bin;C:\\Ruby26-x64\\bin;C:\\Windows\\system32\\bin"
46
+ end
47
+
48
+ let(:expected_path) do
49
+ "C:\\Program Files\\Puppet Labs\\Puppet\\bin;C:\\Ruby26-x64\\bin;C:\\Windows\\system32\\bin"
50
+ end
51
+
52
+ before do
53
+ allow(Puppet::Util::Platform).to receive(:windows?).and_return(true)
54
+ allow(Puppet::Util).to receive(:get_env)
55
+ allow(Puppet::Util).to receive(:get_env).with('PATH').and_return(path)
56
+ allow(described_class).to receive(:validate_command).with(provider_gem_cmd)
57
+ stub_const('::File::PATH_SEPARATOR', ';')
58
+ end
59
+
60
+ it 'removes puppet/bin from PATH' do
61
+ expect(described_class).to receive(:execute) \
62
+ .with(
63
+ anything,
64
+ hash_including(custom_environment: hash_including(PATH: expected_path))
65
+ )
66
+ .and_return("")
67
+ provider.install
68
+ end
69
+ end
70
+
39
71
  it "should use the path to the gem command" do
40
72
  allow(described_class).to receive(:validate_command).with(provider_gem_cmd)
41
73
  expect(described_class).to receive(:execute).with(be_a(Array), execute_options) { |args| expect(args[0]).to eq(provider_gem_cmd) }.and_return("")
@@ -32,12 +32,10 @@ describe Puppet::Type.type(:package).provider(:pacman) do
32
32
  end
33
33
 
34
34
  it "should call yaourt to install the right package quietly when yaourt is installed" do
35
- without_partial_double_verification do
36
- allow(described_class).to receive(:yaourt?).and_return(true)
37
- args = ['--noconfirm', '--needed', '--noprogressbar', '-S', resource[:name]]
38
- expect(provider).to receive(:yaourt).at_least(:once).with(*args).and_return('')
39
- provider.install
40
- end
35
+ allow(described_class).to receive(:yaourt?).and_return(true)
36
+ args = ['--noconfirm', '--needed', '--noprogressbar', '-S', resource[:name]]
37
+ expect(provider).to receive(:yaourt).at_least(:once).with(*args).and_return('')
38
+ provider.install
41
39
  end
42
40
 
43
41
  it "should raise an Puppet::Error if the installation failed" do
@@ -76,12 +74,10 @@ describe Puppet::Type.type(:package).provider(:pacman) do
76
74
  end
77
75
 
78
76
  it "should call yaourt to install the right package quietly when yaourt is installed" do
79
- without_partial_double_verification do
80
- expect(described_class).to receive(:yaourt?).and_return(true)
81
- args = ['--noconfirm', '--needed', '--noprogressbar', '-x', '--arg=value', '-S', resource[:name]]
82
- expect(provider).to receive(:yaourt).at_least(:once).with(*args).and_return('')
83
- provider.install
84
- end
77
+ expect(described_class).to receive(:yaourt?).and_return(true)
78
+ args = ['--noconfirm', '--needed', '--noprogressbar', '-x', '--arg=value', '-S', resource[:name]]
79
+ expect(provider).to receive(:yaourt).at_least(:once).with(*args).and_return('')
80
+ provider.install
85
81
  end
86
82
  end
87
83
 
@@ -176,12 +172,10 @@ describe Puppet::Type.type(:package).provider(:pacman) do
176
172
  end
177
173
 
178
174
  it "should call yaourt to remove the right package quietly" do
179
- without_partial_double_verification do
180
- allow(described_class).to receive(:yaourt?).and_return(true)
181
- args = ["--noconfirm", "--noprogressbar", "-R", resource[:name]]
182
- expect(provider).to receive(:yaourt).with(*args)
183
- provider.uninstall
184
- end
175
+ allow(described_class).to receive(:yaourt?).and_return(true)
176
+ args = ["--noconfirm", "--noprogressbar", "-R", resource[:name]]
177
+ expect(provider).to receive(:yaourt).with(*args)
178
+ provider.uninstall
185
179
  end
186
180
 
187
181
  it "adds any uninstall_options" do
@@ -14,8 +14,9 @@ describe Puppet::Type.type(:package).provider(:pip) do
14
14
  it { is_expected.to be_version_ranges }
15
15
 
16
16
  before do
17
- @resource = Puppet::Type.type(:package).new(name: "fake_package", provider: :pip)
18
- @provider = @resource.provider
17
+ @resource = Puppet::Resource.new(:package, "fake_package")
18
+ allow(@resource).to receive(:original_parameters).and_return({})
19
+ @provider = described_class.new(@resource)
19
20
  @client = double('client')
20
21
  allow(@client).to receive(:call).with('package_releases', 'real_package').and_return(["1.3", "1.2.5", "1.2.4"])
21
22
  allow(@client).to receive(:call).with('package_releases', 'fake_package').and_return([])
@@ -334,6 +335,7 @@ describe Puppet::Type.type(:package).provider(:pip) do
334
335
 
335
336
  it "should install" do
336
337
  @resource[:ensure] = :installed
338
+ @resource[:source] = nil
337
339
  expect(@provider).to receive(:execute).with(["/fake/bin/pip", ["install", "-q", "fake_package"]])
338
340
  @provider.install
339
341
  end
@@ -366,6 +368,7 @@ describe Puppet::Type.type(:package).provider(:pip) do
366
368
 
367
369
  it "should install a particular version" do
368
370
  @resource[:ensure] = "0.0.0"
371
+ @resource[:source] = nil
369
372
  # TJK
370
373
  expect(@provider).to receive(:execute).with(["/fake/bin/pip", ["install", "-q", "fake_package==0.0.0"]])
371
374
  @provider.install
@@ -373,6 +376,7 @@ describe Puppet::Type.type(:package).provider(:pip) do
373
376
 
374
377
  it "should upgrade" do
375
378
  @resource[:ensure] = :latest
379
+ @resource[:source] = nil
376
380
  # TJK
377
381
  expect(@provider).to receive(:execute).with(["/fake/bin/pip", ["install", "-q", "--upgrade", "fake_package"]])
378
382
  @provider.install
@@ -380,6 +384,7 @@ describe Puppet::Type.type(:package).provider(:pip) do
380
384
 
381
385
  it "should handle install options" do
382
386
  @resource[:ensure] = :installed
387
+ @resource[:source] = nil
383
388
  @resource[:install_options] = [{"--timeout" => "10"}, "--no-index"]
384
389
  expect(@provider).to receive(:execute).with(["/fake/bin/pip", ["install", "-q", "--timeout=10", "--no-index", "fake_package"]])
385
390
  @provider.install
@@ -410,7 +415,7 @@ describe Puppet::Type.type(:package).provider(:pip) do
410
415
  let(:pip) { '/fake/bin/pip' }
411
416
 
412
417
  it "should look up version if pip is present" do
413
- allow(described_class).to receive(:cmd).and_return(pip)
418
+ allow(described_class).to receive(:pip_cmd).and_return(pip)
414
419
  process = ['pip 8.0.2 from /usr/local/lib/python2.7/dist-packages (python 2.7)']
415
420
  allow(described_class).to receive(:execpipe).with([pip, '--version']).and_yield(process)
416
421
 
@@ -418,7 +423,7 @@ describe Puppet::Type.type(:package).provider(:pip) do
418
423
  end
419
424
 
420
425
  it "parses multiple lines of output" do
421
- allow(described_class).to receive(:cmd).and_return(pip)
426
+ allow(described_class).to receive(:pip_cmd).and_return(pip)
422
427
  process = [
423
428
  "/usr/local/lib/python2.7/dist-packages/urllib3/contrib/socks.py:37: DependencyWarning: SOCKS support in urllib3 requires the installation of optional dependencies: specifically, PySocks. For more information, see https://urllib3.readthedocs.io/en/latest/contrib.html#socks-proxies",
424
429
  " DependencyWarning",
@@ -430,7 +435,7 @@ describe Puppet::Type.type(:package).provider(:pip) do
430
435
  end
431
436
 
432
437
  it "raises if there isn't a version string" do
433
- allow(described_class).to receive(:cmd).and_return(pip)
438
+ allow(described_class).to receive(:pip_cmd).and_return(pip)
434
439
  allow(described_class).to receive(:execpipe).with([pip, '--version']).and_yield([""])
435
440
  expect {
436
441
  described_class.pip_version(pip)
@@ -439,7 +444,7 @@ describe Puppet::Type.type(:package).provider(:pip) do
439
444
 
440
445
  it "quotes commands with spaces" do
441
446
  pip = 'C:\Program Files\Python27\Scripts\pip.exe'
442
- allow(described_class).to receive(:cmd).and_return(pip)
447
+ allow(described_class).to receive(:pip_cmd).and_return(pip)
443
448
  process = ["pip 18.1 from c:\program files\python27\lib\site-packages\pip (python 2.7)\r\n"]
444
449
  allow(described_class).to receive(:execpipe).with(["\"#{pip}\"", '--version']).and_yield(process)
445
450
 
@@ -8,6 +8,10 @@ describe Puppet::Type.type(:package).provider(:pkgdmg) do
8
8
  it { is_expected.not_to be_uninstallable }
9
9
 
10
10
  describe "when installing it should fail when" do
11
+ before :each do
12
+ expect(Puppet::Util).not_to receive(:execute)
13
+ end
14
+
11
15
  it "no source is specified" do
12
16
  expect { provider.install }.to raise_error(Puppet::Error, /must specify a package source/)
13
17
  end
@@ -15,19 +15,20 @@ describe Puppet::Type.type(:package).provider(:puppet_gem) do
15
15
  end
16
16
 
17
17
  if Puppet::Util::Platform.windows?
18
- let(:provider_gem_cmd) { 'gem' }
18
+ let(:provider_gem_cmd) { 'C:\Program Files\Puppet Labs\Puppet\puppet\bin\gem.bat' }
19
19
  else
20
20
  let(:provider_gem_cmd) { '/opt/puppetlabs/puppet/bin/gem' }
21
21
  end
22
22
 
23
23
  custom_environment = {"HOME"=>ENV["HOME"]}
24
- custom_environment['PKG_CONFIG_PATH'] = '/opt/puppetlabs/puppet/lib/pkgconfig' unless Puppet::Util::Platform.windows?
24
+ custom_environment['PKG_CONFIG_PATH'] = '/opt/puppetlabs/puppet/lib/pkgconfig'
25
25
 
26
26
  let(:execute_options) { {:failonfail => true, :combine => true, :custom_environment => custom_environment} }
27
27
 
28
28
  before :each do
29
29
  resource.provider = provider
30
30
  allow(described_class).to receive(:command).with(:gemcmd).and_return(provider_gem_cmd)
31
+ allow(Puppet::Util::Platform).to receive(:windows?).and_return(false)
31
32
  end
32
33
 
33
34
  context "when installing" do
@@ -4,6 +4,16 @@ describe 'Puppet::Type::Service::Provider::Smf',
4
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