puppet 6.21.1 → 7.4.1

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 (402) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +1 -4
  3. data/Gemfile.lock +5 -5
  4. data/README.md +1 -1
  5. data/conf/fileserver.conf +5 -10
  6. data/ext/build_defaults.yaml +1 -2
  7. data/ext/osx/file_mapping.yaml +0 -5
  8. data/ext/project_data.yaml +2 -14
  9. data/ext/redhat/puppet.spec.erb +0 -1
  10. data/ext/windows/service/daemon.rb +6 -5
  11. data/install.rb +21 -17
  12. data/lib/puppet.rb +11 -20
  13. data/lib/puppet/application.rb +172 -98
  14. data/lib/puppet/application/device.rb +100 -104
  15. data/lib/puppet/application/filebucket.rb +13 -9
  16. data/lib/puppet/application/ssl.rb +1 -1
  17. data/lib/puppet/configurer.rb +27 -29
  18. data/lib/puppet/configurer/plugin_handler.rb +21 -19
  19. data/lib/puppet/defaults.rb +57 -162
  20. data/lib/puppet/environments.rb +8 -23
  21. data/lib/puppet/face/facts.rb +73 -49
  22. data/lib/puppet/face/help.rb +1 -1
  23. data/lib/puppet/face/node/clean.rb +8 -0
  24. data/lib/puppet/face/plugin.rb +5 -8
  25. data/lib/puppet/ffi/windows.rb +12 -0
  26. data/lib/puppet/ffi/windows/api_types.rb +311 -0
  27. data/lib/puppet/ffi/windows/constants.rb +404 -0
  28. data/lib/puppet/ffi/windows/functions.rb +628 -0
  29. data/lib/puppet/ffi/windows/structs.rb +338 -0
  30. data/lib/puppet/file_serving/configuration.rb +0 -5
  31. data/lib/puppet/file_serving/configuration/parser.rb +6 -32
  32. data/lib/puppet/file_serving/http_metadata.rb +1 -1
  33. data/lib/puppet/file_serving/mount.rb +1 -2
  34. data/lib/puppet/forge/repository.rb +0 -1
  35. data/lib/puppet/generate/models/type/type.rb +4 -1
  36. data/lib/puppet/http.rb +22 -13
  37. data/lib/puppet/http/client.rb +164 -114
  38. data/lib/puppet/{network/resolver.rb → http/dns.rb} +2 -2
  39. data/lib/puppet/http/errors.rb +16 -0
  40. data/lib/puppet/http/external_client.rb +5 -7
  41. data/lib/puppet/{network/http → http}/factory.rb +8 -11
  42. data/lib/puppet/{network/http → http}/pool.rb +61 -26
  43. data/lib/puppet/{network/http/session.rb → http/pool_entry.rb} +2 -3
  44. data/lib/puppet/http/proxy.rb +137 -0
  45. data/lib/puppet/http/redirector.rb +4 -12
  46. data/lib/puppet/http/resolver.rb +5 -15
  47. data/lib/puppet/http/resolver/server_list.rb +6 -10
  48. data/lib/puppet/http/resolver/settings.rb +4 -7
  49. data/lib/puppet/http/resolver/srv.rb +7 -11
  50. data/lib/puppet/http/response.rb +36 -54
  51. data/lib/puppet/http/response_converter.rb +24 -0
  52. data/lib/puppet/http/response_net_http.rb +42 -0
  53. data/lib/puppet/http/retry_after_handler.rb +4 -13
  54. data/lib/puppet/http/service.rb +12 -26
  55. data/lib/puppet/http/service/ca.rb +11 -22
  56. data/lib/puppet/http/service/compiler.rb +22 -69
  57. data/lib/puppet/http/service/file_server.rb +18 -27
  58. data/lib/puppet/http/service/puppetserver.rb +26 -12
  59. data/lib/puppet/http/service/report.rb +8 -10
  60. data/lib/puppet/http/session.rb +11 -20
  61. data/lib/puppet/{network/http → http}/site.rb +1 -2
  62. data/lib/puppet/indirector/catalog/rest.rb +2 -4
  63. data/lib/puppet/indirector/facts/facter.rb +25 -3
  64. data/lib/puppet/indirector/facts/rest.rb +3 -22
  65. data/lib/puppet/indirector/file_bucket_file/rest.rb +3 -9
  66. data/lib/puppet/indirector/file_content/rest.rb +2 -6
  67. data/lib/puppet/indirector/file_metadata/rest.rb +3 -9
  68. data/lib/puppet/indirector/file_server.rb +1 -8
  69. data/lib/puppet/indirector/generic_http.rb +0 -11
  70. data/lib/puppet/indirector/node/rest.rb +2 -4
  71. data/lib/puppet/indirector/report/rest.rb +3 -8
  72. data/lib/puppet/indirector/request.rb +0 -101
  73. data/lib/puppet/indirector/rest.rb +12 -263
  74. data/lib/puppet/module_tool/applications.rb +0 -1
  75. data/lib/puppet/network/authconfig.rb +2 -96
  76. data/lib/puppet/network/authorization.rb +13 -35
  77. data/lib/puppet/network/formats.rb +67 -0
  78. data/lib/puppet/network/http.rb +3 -3
  79. data/lib/puppet/network/http/api/indirected_routes.rb +2 -20
  80. data/lib/puppet/network/http/api/master/v3.rb +11 -13
  81. data/lib/puppet/network/http/connection.rb +247 -316
  82. data/lib/puppet/network/http/handler.rb +0 -1
  83. data/lib/puppet/network/http_pool.rb +16 -34
  84. data/lib/puppet/node.rb +1 -30
  85. data/lib/puppet/pal/json_catalog_encoder.rb +4 -0
  86. data/lib/puppet/pal/pal_impl.rb +3 -1
  87. data/lib/puppet/parser/ast/pops_bridge.rb +0 -38
  88. data/lib/puppet/parser/compiler.rb +0 -198
  89. data/lib/puppet/parser/compiler/catalog_validator/relationship_validator.rb +14 -39
  90. data/lib/puppet/parser/resource.rb +0 -69
  91. data/lib/puppet/pops/evaluator/evaluator_impl.rb +0 -5
  92. data/lib/puppet/pops/evaluator/runtime3_resource_support.rb +3 -3
  93. data/lib/puppet/pops/evaluator/runtime3_support.rb +1 -1
  94. data/lib/puppet/pops/issues.rb +0 -5
  95. data/lib/puppet/pops/loader/ruby_legacy_function_instantiator.rb +6 -8
  96. data/lib/puppet/pops/model/ast.pp +0 -42
  97. data/lib/puppet/pops/model/ast.rb +0 -290
  98. data/lib/puppet/pops/model/factory.rb +0 -45
  99. data/lib/puppet/pops/model/model_label_provider.rb +0 -5
  100. data/lib/puppet/pops/model/model_tree_dumper.rb +0 -22
  101. data/lib/puppet/pops/model/pn_transformer.rb +0 -16
  102. data/lib/puppet/pops/parser/egrammar.ra +0 -56
  103. data/lib/puppet/pops/parser/eparser.rb +1520 -1712
  104. data/lib/puppet/pops/parser/lexer2.rb +4 -4
  105. data/lib/puppet/pops/parser/parser_support.rb +0 -5
  106. data/lib/puppet/pops/resource/resource_type_impl.rb +2 -24
  107. data/lib/puppet/pops/types/type_calculator.rb +0 -7
  108. data/lib/puppet/pops/types/type_parser.rb +0 -4
  109. data/lib/puppet/pops/types/types.rb +0 -1
  110. data/lib/puppet/pops/validation/checker4_0.rb +9 -37
  111. data/lib/puppet/pops/validation/tasks_checker.rb +0 -12
  112. data/lib/puppet/pops/validation/validator_factory_4_0.rb +1 -2
  113. data/lib/puppet/provider.rb +0 -13
  114. data/lib/puppet/provider/nameservice.rb +0 -18
  115. data/lib/puppet/provider/package/dpkg.rb +0 -10
  116. data/lib/puppet/provider/package/gem.rb +23 -3
  117. data/lib/puppet/provider/package/pip.rb +0 -1
  118. data/lib/puppet/provider/package/pkg.rb +0 -4
  119. data/lib/puppet/provider/package/portage.rb +1 -1
  120. data/lib/puppet/provider/package/puppet_gem.rb +1 -4
  121. data/lib/puppet/provider/service/smf.rb +191 -73
  122. data/lib/puppet/provider/user/directoryservice.rb +0 -10
  123. data/lib/puppet/reference/configuration.rb +7 -5
  124. data/lib/puppet/reference/indirection.rb +1 -1
  125. data/lib/puppet/resource.rb +1 -89
  126. data/lib/puppet/resource/catalog.rb +1 -14
  127. data/lib/puppet/resource/type.rb +3 -119
  128. data/lib/puppet/resource/type_collection.rb +3 -48
  129. data/lib/puppet/runtime.rb +1 -2
  130. data/lib/puppet/settings.rb +45 -33
  131. data/lib/puppet/settings/integer_setting.rb +17 -0
  132. data/lib/puppet/settings/port_setting.rb +15 -0
  133. data/lib/puppet/settings/priority_setting.rb +5 -4
  134. data/lib/puppet/ssl.rb +10 -6
  135. data/lib/puppet/ssl/base.rb +3 -5
  136. data/lib/puppet/ssl/certificate.rb +0 -6
  137. data/lib/puppet/ssl/certificate_request.rb +1 -12
  138. data/lib/puppet/ssl/certificate_signer.rb +6 -0
  139. data/lib/puppet/ssl/oids.rb +3 -1
  140. data/lib/puppet/ssl/ssl_provider.rb +17 -0
  141. data/lib/puppet/ssl/state_machine.rb +3 -1
  142. data/lib/puppet/ssl/verifier.rb +2 -0
  143. data/lib/puppet/test/test_helper.rb +1 -3
  144. data/lib/puppet/transaction.rb +1 -7
  145. data/lib/puppet/transaction/report.rb +2 -4
  146. data/lib/puppet/type.rb +0 -76
  147. data/lib/puppet/type/file.rb +5 -7
  148. data/lib/puppet/type/file/checksum.rb +1 -1
  149. data/lib/puppet/type/file/source.rb +1 -1
  150. data/lib/puppet/type/filebucket.rb +3 -3
  151. data/lib/puppet/type/package.rb +5 -13
  152. data/lib/puppet/type/user.rb +1 -1
  153. data/lib/puppet/util/execution.rb +0 -11
  154. data/lib/puppet/util/http_proxy.rb +2 -215
  155. data/lib/puppet/util/monkey_patches.rb +0 -46
  156. data/lib/puppet/util/rdoc.rb +0 -7
  157. data/lib/puppet/util/retry_action.rb +1 -1
  158. data/lib/puppet/util/run_mode.rb +9 -1
  159. data/lib/puppet/util/windows.rb +3 -8
  160. data/lib/puppet/util/windows/daemon.rb +360 -0
  161. data/lib/puppet/util/windows/error.rb +1 -0
  162. data/lib/puppet/util/windows/eventlog.rb +4 -9
  163. data/lib/puppet/util/windows/file.rb +8 -242
  164. data/lib/puppet/util/windows/monkey_patches/process.rb +414 -0
  165. data/lib/puppet/util/windows/process.rb +4 -226
  166. data/lib/puppet/util/windows/service.rb +9 -460
  167. data/lib/puppet/util/windows/string.rb +12 -13
  168. data/lib/puppet/util/yaml.rb +0 -22
  169. data/lib/puppet/vendor/require_vendored.rb +0 -1
  170. data/lib/puppet/version.rb +1 -1
  171. data/lib/puppet/x509.rb +5 -1
  172. data/lib/puppet/x509/cert_provider.rb +29 -1
  173. data/locales/puppet.pot +521 -1226
  174. data/man/man5/puppet.conf.5 +34 -94
  175. data/man/man8/puppet-facts.8 +56 -35
  176. data/man/man8/puppet-filebucket.8 +3 -3
  177. data/man/man8/puppet-module.8 +0 -57
  178. data/man/man8/puppet.8 +1 -1
  179. data/spec/fixtures/unit/provider/service/smf/{svcs.out → svcs_instances.out} +0 -0
  180. data/spec/integration/application/agent_spec.rb +24 -11
  181. data/spec/integration/application/apply_spec.rb +1 -1
  182. data/spec/integration/application/filebucket_spec.rb +16 -16
  183. data/spec/integration/application/help_spec.rb +2 -0
  184. data/spec/integration/application/plugin_spec.rb +23 -1
  185. data/spec/integration/defaults_spec.rb +7 -3
  186. data/spec/integration/indirector/file_content/file_server_spec.rb +0 -2
  187. data/spec/integration/indirector/file_metadata/file_server_spec.rb +0 -2
  188. data/spec/integration/network/http_pool_spec.rb +3 -21
  189. data/spec/integration/parser/catalog_spec.rb +0 -38
  190. data/spec/integration/parser/node_spec.rb +0 -9
  191. data/spec/integration/parser/pcore_resource_spec.rb +0 -37
  192. data/spec/integration/type/file_spec.rb +5 -4
  193. data/spec/integration/util/windows/monkey_patches/process_spec.rb +231 -0
  194. data/spec/integration/util/windows/security_spec.rb +1 -1
  195. data/spec/lib/puppet_spec/puppetserver.rb +1 -1
  196. data/spec/lib/puppet_spec/settings.rb +1 -0
  197. data/spec/spec_helper.rb +2 -0
  198. data/spec/unit/agent_spec.rb +0 -2
  199. data/spec/unit/application/facts_spec.rb +86 -0
  200. data/spec/unit/application/filebucket_spec.rb +41 -39
  201. data/spec/unit/application/ssl_spec.rb +2 -2
  202. data/spec/unit/certificate_factory_spec.rb +1 -1
  203. data/spec/unit/configurer/downloader_spec.rb +6 -2
  204. data/spec/unit/configurer/plugin_handler_spec.rb +56 -18
  205. data/spec/unit/configurer_spec.rb +12 -9
  206. data/spec/unit/context/trusted_information_spec.rb +2 -6
  207. data/spec/unit/defaults_spec.rb +22 -47
  208. data/spec/unit/environments_spec.rb +0 -3
  209. data/spec/unit/face/facts_spec.rb +4 -0
  210. data/spec/unit/face/node_spec.rb +14 -2
  211. data/spec/unit/face/plugin_spec.rb +73 -33
  212. data/spec/unit/file_bucket/file_spec.rb +1 -1
  213. data/spec/unit/file_serving/configuration/parser_spec.rb +22 -18
  214. data/spec/unit/file_serving/configuration_spec.rb +6 -12
  215. data/spec/unit/functions/camelcase_spec.rb +1 -1
  216. data/spec/unit/functions/capitalize_spec.rb +1 -1
  217. data/spec/unit/functions/downcase_spec.rb +1 -1
  218. data/spec/unit/functions/upcase_spec.rb +1 -1
  219. data/spec/unit/http/client_spec.rb +7 -8
  220. data/spec/unit/{network/resolver_spec.rb → http/dns_spec.rb} +3 -3
  221. data/spec/unit/http/external_client_spec.rb +4 -4
  222. data/spec/unit/{network/http → http}/factory_spec.rb +5 -11
  223. data/spec/unit/{network/http/session_spec.rb → http/pool_entry_spec.rb} +3 -3
  224. data/spec/unit/{network/http → http}/pool_spec.rb +12 -17
  225. data/spec/unit/{util/http_proxy_spec.rb → http/proxy_spec.rb} +2 -69
  226. data/spec/unit/http/resolver_spec.rb +13 -13
  227. data/spec/unit/http/service/compiler_spec.rb +0 -62
  228. data/spec/unit/http/service/file_server_spec.rb +3 -3
  229. data/spec/unit/http/service/puppetserver_spec.rb +34 -4
  230. data/spec/unit/http/service_spec.rb +0 -1
  231. data/spec/unit/http/session_spec.rb +16 -14
  232. data/spec/unit/{network/http → http}/site_spec.rb +3 -3
  233. data/spec/unit/indirector/facts/facter_spec.rb +113 -0
  234. data/spec/unit/indirector/file_bucket_file/file_spec.rb +5 -3
  235. data/spec/unit/indirector/file_content/rest_spec.rb +0 -4
  236. data/spec/unit/indirector/file_metadata/rest_spec.rb +0 -4
  237. data/spec/unit/indirector/file_server_spec.rb +1 -15
  238. data/spec/unit/indirector/report/rest_spec.rb +2 -17
  239. data/spec/unit/indirector/request_spec.rb +0 -264
  240. data/spec/unit/indirector/rest_spec.rb +98 -752
  241. data/spec/unit/network/authconfig_spec.rb +2 -129
  242. data/spec/unit/network/authorization_spec.rb +2 -55
  243. data/spec/unit/network/formats_spec.rb +45 -4
  244. data/spec/unit/network/http/api/indirected_routes_spec.rb +1 -92
  245. data/spec/unit/network/http/api/master/v3_spec.rb +28 -7
  246. data/spec/unit/network/http/api_spec.rb +10 -0
  247. data/spec/unit/network/http/connection_spec.rb +19 -41
  248. data/spec/unit/network/http/handler_spec.rb +0 -1
  249. data/spec/unit/network/http_pool_spec.rb +0 -4
  250. data/spec/unit/node/environment_spec.rb +33 -21
  251. data/spec/unit/node_spec.rb +2 -54
  252. data/spec/unit/parser/functions/create_resources_spec.rb +2 -20
  253. data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +4 -7
  254. data/spec/unit/pops/loaders/loaders_spec.rb +6 -21
  255. data/spec/unit/pops/parser/parse_application_spec.rb +4 -22
  256. data/spec/unit/pops/parser/parse_basic_expressions_spec.rb +0 -1
  257. data/spec/unit/pops/parser/parse_capabilities_spec.rb +8 -21
  258. data/spec/unit/pops/parser/parse_site_spec.rb +20 -24
  259. data/spec/unit/pops/resource/resource_type_impl_spec.rb +0 -71
  260. data/spec/unit/pops/serialization/to_from_hr_spec.rb +1 -1
  261. data/spec/unit/pops/types/type_calculator_spec.rb +6 -6
  262. data/spec/unit/pops/types/type_factory_spec.rb +1 -1
  263. data/spec/unit/pops/validator/validator_spec.rb +61 -46
  264. data/spec/unit/pops/visitor_spec.rb +1 -1
  265. data/spec/unit/provider/nameservice_spec.rb +0 -57
  266. data/spec/unit/provider/package/dpkg_spec.rb +0 -48
  267. data/spec/unit/provider/package/gem_spec.rb +32 -0
  268. data/spec/unit/provider/package/puppet_gem_spec.rb +3 -2
  269. data/spec/unit/provider/service/smf_spec.rb +401 -165
  270. data/spec/unit/provider/service/windows_spec.rb +0 -1
  271. data/spec/unit/provider_spec.rb +0 -12
  272. data/spec/unit/resource/type_collection_spec.rb +2 -22
  273. data/spec/unit/resource_spec.rb +0 -56
  274. data/spec/unit/settings/http_extra_headers_spec.rb +2 -4
  275. data/spec/unit/settings/integer_setting_spec.rb +42 -0
  276. data/spec/unit/settings/port_setting_spec.rb +31 -0
  277. data/spec/unit/settings/priority_setting_spec.rb +4 -4
  278. data/spec/unit/settings_spec.rb +17 -0
  279. data/spec/unit/ssl/base_spec.rb +36 -3
  280. data/spec/unit/ssl/certificate_request_spec.rb +19 -55
  281. data/spec/unit/ssl/certificate_spec.rb +2 -11
  282. data/spec/unit/ssl/state_machine_spec.rb +0 -1
  283. data/spec/unit/ssl/verifier_spec.rb +0 -21
  284. data/spec/unit/transaction/report_spec.rb +0 -2
  285. data/spec/unit/transaction/resource_harness_spec.rb +2 -2
  286. data/spec/unit/transaction_spec.rb +45 -79
  287. data/spec/unit/type/file/checksum_spec.rb +6 -6
  288. data/spec/unit/type/file/content_spec.rb +1 -1
  289. data/spec/unit/type/file/ensure_spec.rb +1 -1
  290. data/spec/unit/type/file/mode_spec.rb +1 -1
  291. data/spec/unit/type/file/source_spec.rb +0 -1
  292. data/spec/unit/type/file_spec.rb +12 -6
  293. data/spec/unit/type/package_spec.rb +1 -1
  294. data/spec/unit/type_spec.rb +20 -0
  295. data/spec/unit/util/backups_spec.rb +0 -2
  296. data/spec/unit/util/execution_spec.rb +0 -29
  297. data/spec/unit/util/monkey_patches_spec.rb +0 -6
  298. data/spec/unit/util/run_mode_spec.rb +21 -121
  299. data/spec/unit/util/windows/string_spec.rb +1 -3
  300. data/spec/unit/util/yaml_spec.rb +0 -54
  301. data/spec/unit/util_spec.rb +0 -18
  302. metadata +47 -162
  303. data/conf/auth.conf +0 -150
  304. data/lib/puppet/application/cert.rb +0 -76
  305. data/lib/puppet/application/key.rb +0 -4
  306. data/lib/puppet/application/man.rb +0 -4
  307. data/lib/puppet/application/status.rb +0 -4
  308. data/lib/puppet/face/key.rb +0 -16
  309. data/lib/puppet/face/man.rb +0 -145
  310. data/lib/puppet/face/module/build.rb +0 -14
  311. data/lib/puppet/face/module/generate.rb +0 -14
  312. data/lib/puppet/face/module/search.rb +0 -103
  313. data/lib/puppet/face/status.rb +0 -51
  314. data/lib/puppet/indirector/certificate/file.rb +0 -9
  315. data/lib/puppet/indirector/certificate/rest.rb +0 -18
  316. data/lib/puppet/indirector/certificate_request/file.rb +0 -9
  317. data/lib/puppet/indirector/certificate_request/memory.rb +0 -7
  318. data/lib/puppet/indirector/certificate_request/rest.rb +0 -11
  319. data/lib/puppet/indirector/file_content/http.rb +0 -22
  320. data/lib/puppet/indirector/key/file.rb +0 -46
  321. data/lib/puppet/indirector/key/memory.rb +0 -7
  322. data/lib/puppet/indirector/ssl_file.rb +0 -162
  323. data/lib/puppet/indirector/status.rb +0 -3
  324. data/lib/puppet/indirector/status/local.rb +0 -12
  325. data/lib/puppet/indirector/status/rest.rb +0 -27
  326. data/lib/puppet/module_tool/applications/searcher.rb +0 -29
  327. data/lib/puppet/network/auth_config_parser.rb +0 -90
  328. data/lib/puppet/network/authstore.rb +0 -283
  329. data/lib/puppet/network/http/api/master/v3/authorization.rb +0 -18
  330. data/lib/puppet/network/http/api/master/v3/environment.rb +0 -88
  331. data/lib/puppet/network/http/base_pool.rb +0 -36
  332. data/lib/puppet/network/http/compression.rb +0 -127
  333. data/lib/puppet/network/http/connection_adapter.rb +0 -184
  334. data/lib/puppet/network/http/nocache_pool.rb +0 -28
  335. data/lib/puppet/network/rest_controller.rb +0 -2
  336. data/lib/puppet/network/rights.rb +0 -210
  337. data/lib/puppet/parser/compiler/catalog_validator/env_relationship_validator.rb +0 -66
  338. data/lib/puppet/parser/compiler/catalog_validator/site_validator.rb +0 -22
  339. data/lib/puppet/parser/environment_compiler.rb +0 -202
  340. data/lib/puppet/pops/types/enumeration.rb +0 -16
  341. data/lib/puppet/resource/capability_finder.rb +0 -154
  342. data/lib/puppet/rest/errors.rb +0 -15
  343. data/lib/puppet/rest/response.rb +0 -35
  344. data/lib/puppet/rest/route.rb +0 -85
  345. data/lib/puppet/rest/routes.rb +0 -135
  346. data/lib/puppet/ssl/host.rb +0 -505
  347. data/lib/puppet/ssl/key.rb +0 -61
  348. data/lib/puppet/ssl/validator.rb +0 -61
  349. data/lib/puppet/ssl/validator/default_validator.rb +0 -209
  350. data/lib/puppet/ssl/validator/no_validator.rb +0 -22
  351. data/lib/puppet/ssl/verifier_adapter.rb +0 -58
  352. data/lib/puppet/status.rb +0 -40
  353. data/lib/puppet/util/connection.rb +0 -88
  354. data/lib/puppet/util/fact_dif.rb +0 -62
  355. data/lib/puppet/util/ssl.rb +0 -83
  356. data/lib/puppet/util/windows/api_types.rb +0 -309
  357. data/lib/puppet/util/windows/monkey_patches/dir.rb +0 -40
  358. data/lib/puppet/vendor/load_pathspec.rb +0 -1
  359. data/lib/puppet/vendor/pathspec/CHANGELOG.md +0 -2
  360. data/lib/puppet/vendor/pathspec/LICENSE +0 -201
  361. data/lib/puppet/vendor/pathspec/PUPPET_README.md +0 -6
  362. data/lib/puppet/vendor/pathspec/README.md +0 -53
  363. data/lib/puppet/vendor/pathspec/lib/pathspec.rb +0 -122
  364. data/lib/puppet/vendor/pathspec/lib/pathspec/gitignorespec.rb +0 -275
  365. data/lib/puppet/vendor/pathspec/lib/pathspec/regexspec.rb +0 -17
  366. data/lib/puppet/vendor/pathspec/lib/pathspec/spec.rb +0 -14
  367. data/man/man8/puppet-key.8 +0 -126
  368. data/man/man8/puppet-man.8 +0 -76
  369. data/man/man8/puppet-status.8 +0 -108
  370. data/spec/integration/network/authconfig_spec.rb +0 -256
  371. data/spec/integration/util/windows/monkey_patches/dir_spec.rb +0 -11
  372. data/spec/unit/application/man_spec.rb +0 -52
  373. data/spec/unit/capability_spec.rb +0 -414
  374. data/spec/unit/face/key_spec.rb +0 -9
  375. data/spec/unit/face/module/search_spec.rb +0 -231
  376. data/spec/unit/face/status_spec.rb +0 -9
  377. data/spec/unit/indirector/certificate/file_spec.rb +0 -14
  378. data/spec/unit/indirector/certificate/rest_spec.rb +0 -61
  379. data/spec/unit/indirector/certificate_request/file_spec.rb +0 -14
  380. data/spec/unit/indirector/certificate_request/rest_spec.rb +0 -25
  381. data/spec/unit/indirector/key/file_spec.rb +0 -78
  382. data/spec/unit/indirector/ssl_file_spec.rb +0 -305
  383. data/spec/unit/indirector/status/local_spec.rb +0 -10
  384. data/spec/unit/indirector/status/rest_spec.rb +0 -50
  385. data/spec/unit/module_tool/applications/searcher_spec.rb +0 -38
  386. data/spec/unit/network/auth_config_parser_spec.rb +0 -115
  387. data/spec/unit/network/authstore_spec.rb +0 -422
  388. data/spec/unit/network/http/api/master/v3/authorization_spec.rb +0 -57
  389. data/spec/unit/network/http/api/master/v3/environment_spec.rb +0 -185
  390. data/spec/unit/network/http/compression_spec.rb +0 -240
  391. data/spec/unit/network/http/nocache_pool_spec.rb +0 -64
  392. data/spec/unit/network/http_spec.rb +0 -9
  393. data/spec/unit/network/rights_spec.rb +0 -439
  394. data/spec/unit/parser/environment_compiler_spec.rb +0 -730
  395. data/spec/unit/pops/types/enumeration_spec.rb +0 -51
  396. data/spec/unit/resource/capability_finder_spec.rb +0 -148
  397. data/spec/unit/rest/route_spec.rb +0 -132
  398. data/spec/unit/ssl/host_spec.rb +0 -645
  399. data/spec/unit/ssl/key_spec.rb +0 -173
  400. data/spec/unit/ssl/validator_spec.rb +0 -278
  401. data/spec/unit/status_spec.rb +0 -45
  402. data/spec/unit/util/ssl_spec.rb +0 -91
@@ -162,63 +162,6 @@ describe Puppet::Provider::NameService do
162
162
  end
163
163
  end
164
164
 
165
- describe "#listbyname" do
166
- it "should be deprecated" do
167
- expect(Puppet).to receive(:deprecation_warning).with(/listbyname is deprecated/)
168
- described_class.listbyname
169
- end
170
-
171
- it "should return a list of users if resource_type is user" do
172
- described_class.resource_type = Puppet::Type.type(:user)
173
- expect(Puppet::Etc).to receive(:setpwent)
174
- allow(Puppet::Etc).to receive(:getpwent).and_return(*users)
175
- expect(Puppet::Etc).to receive(:endpwent)
176
- expect(described_class.listbyname).to eq(%w{root foo})
177
- end
178
-
179
- context "encoding handling" do
180
- described_class.resource_type = Puppet::Type.type(:user)
181
-
182
- # These two tests simulate an environment where there are two users with
183
- # the same name on disk, but each name is stored on disk in a different
184
- # encoding
185
- it "should return names with invalid byte sequences replaced with '?'" do
186
- allow(Etc).to receive(:getpwent).and_return(*utf_8_mixed_users)
187
- expect(invalid_utf_8_jose).to_not be_valid_encoding
188
- result = PuppetSpec::CharacterEncoding.with_external_encoding(Encoding::UTF_8) do
189
- described_class.listbyname
190
- end
191
- expect(result).to eq(['root', 'foo', utf_8_jose, escaped_utf_8_jose])
192
- end
193
-
194
- it "should return names in their original encoding/bytes if they would not be valid UTF-8" do
195
- allow(Etc).to receive(:getpwent).and_return(*latin_1_mixed_users)
196
- result = PuppetSpec::CharacterEncoding.with_external_encoding(Encoding::ISO_8859_1) do
197
- described_class.listbyname
198
- end
199
- expect(result).to eq(['root'.force_encoding(Encoding::UTF_8), 'foo'.force_encoding(Encoding::UTF_8), utf_8_jose, valid_latin1_jose])
200
- end
201
- end
202
-
203
- it "should return a list of groups if resource_type is group", :unless => Puppet::Util::Platform.windows? do
204
- described_class.resource_type = Puppet::Type.type(:group)
205
- expect(Puppet::Etc).to receive(:setgrent)
206
- allow(Puppet::Etc).to receive(:getgrent).and_return(*groups)
207
- expect(Puppet::Etc).to receive(:endgrent)
208
- expect(described_class.listbyname).to eq(%w{root bin})
209
- end
210
-
211
- it "should yield if a block given" do
212
- yield_results = []
213
- described_class.resource_type = Puppet::Type.type(:user)
214
- expect(Puppet::Etc).to receive(:setpwent)
215
- allow(Puppet::Etc).to receive(:getpwent).and_return(*users)
216
- expect(Puppet::Etc).to receive(:endpwent)
217
- described_class.listbyname {|x| yield_results << x }
218
- expect(yield_results).to eq(%w{root foo})
219
- end
220
- end
221
-
222
165
  describe "instances" do
223
166
  it "should return a list of objects in UTF-8 with any invalid characters replaced with '?'" do
224
167
  # These two tests simulate an environment where there are two users with
@@ -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("")
@@ -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