puppet 4.5.3-universal-darwin → 4.6.1-universal-darwin

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 (422) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile +10 -1
  3. data/ext/debian/control +2 -4
  4. data/ext/project_data.yaml +4 -4
  5. data/install.rb +6 -2
  6. data/lib/puppet.rb +3 -1
  7. data/lib/puppet/agent/locker.rb +1 -1
  8. data/lib/puppet/application.rb +6 -4
  9. data/lib/puppet/application/agent.rb +2 -1
  10. data/lib/puppet/application/cert.rb +35 -2
  11. data/lib/puppet/application/device.rb +1 -1
  12. data/lib/puppet/application/generate.rb +5 -0
  13. data/lib/puppet/application/lookup.rb +3 -3
  14. data/lib/puppet/application_support.rb +1 -1
  15. data/lib/puppet/compilable_resource_type.rb +15 -0
  16. data/lib/puppet/configurer.rb +67 -10
  17. data/lib/puppet/configurer/plugin_handler.rb +2 -4
  18. data/lib/puppet/data_providers/hiera_config.rb +1 -1
  19. data/lib/puppet/defaults.rb +34 -7
  20. data/lib/puppet/environments.rb +4 -2
  21. data/lib/puppet/error.rb +1 -1
  22. data/lib/puppet/external/dot.rb +1 -1
  23. data/lib/puppet/face/ca.rb +4 -1
  24. data/lib/puppet/face/certificate.rb +7 -1
  25. data/lib/puppet/face/epp.rb +5 -5
  26. data/lib/puppet/face/generate.rb +64 -0
  27. data/lib/puppet/face/help.rb +19 -13
  28. data/lib/puppet/face/man.rb +1 -1
  29. data/lib/puppet/feature/external_facts.rb +1 -1
  30. data/lib/puppet/file_system.rb +16 -0
  31. data/lib/puppet/file_system/file_impl.rb +5 -0
  32. data/lib/puppet/file_system/memory_impl.rb +4 -0
  33. data/lib/puppet/file_system/path_pattern.rb +1 -0
  34. data/lib/puppet/file_system/windows.rb +19 -0
  35. data/lib/puppet/functions.rb +3 -5
  36. data/lib/puppet/functions/assert_type.rb +1 -1
  37. data/lib/puppet/functions/defined.rb +7 -5
  38. data/lib/puppet/functions/dig.rb +2 -18
  39. data/lib/puppet/functions/hiera.rb +1 -1
  40. data/lib/puppet/functions/lest.rb +1 -37
  41. data/lib/puppet/functions/new.rb +2 -473
  42. data/lib/puppet/functions/reverse_each.rb +2 -59
  43. data/lib/puppet/functions/scanf.rb +4 -4
  44. data/lib/puppet/functions/step.rb +1 -63
  45. data/lib/puppet/functions/then.rb +1 -61
  46. data/lib/puppet/functions/type.rb +1 -40
  47. data/lib/puppet/functions/unwrap.rb +40 -0
  48. data/lib/puppet/generate/models/type/property.rb +70 -0
  49. data/lib/puppet/generate/models/type/type.rb +57 -0
  50. data/lib/puppet/generate/templates/type/pcore.erb +41 -0
  51. data/lib/puppet/generate/type.rb +239 -0
  52. data/lib/puppet/graph/simple_graph.rb +2 -6
  53. data/lib/puppet/indirector/catalog/static_compiler.rb +5 -2
  54. data/lib/puppet/indirector/facts/facter.rb +1 -1
  55. data/lib/puppet/indirector/key/ca.rb +2 -2
  56. data/lib/puppet/indirector/request.rb +25 -4
  57. data/lib/puppet/indirector/rest.rb +73 -3
  58. data/lib/puppet/info_service/class_information_service.rb +1 -2
  59. data/lib/puppet/interface/documentation.rb +1 -1
  60. data/lib/puppet/loaders.rb +2 -0
  61. data/lib/puppet/metatype/manager.rb +6 -6
  62. data/lib/puppet/module.rb +8 -1
  63. data/lib/puppet/module_tool.rb +2 -2
  64. data/lib/puppet/module_tool/checksums.rb +1 -1
  65. data/lib/puppet/module_tool/errors/installer.rb +2 -2
  66. data/lib/puppet/module_tool/metadata.rb +1 -1
  67. data/lib/puppet/network/http/api/indirected_routes.rb +23 -32
  68. data/lib/puppet/network/http/rack/rest.rb +15 -1
  69. data/lib/puppet/network/rights.rb +1 -11
  70. data/lib/puppet/node/environment.rb +7 -3
  71. data/lib/puppet/node/facts.rb +1 -1
  72. data/lib/puppet/parameter.rb +23 -3
  73. data/lib/puppet/parameter/boolean.rb +1 -1
  74. data/lib/puppet/parameter/value.rb +1 -1
  75. data/lib/puppet/parser.rb +0 -1
  76. data/lib/puppet/parser/ast/pops_bridge.rb +1 -1
  77. data/lib/puppet/parser/ast/resource.rb +5 -0
  78. data/lib/puppet/parser/ast/resource_instance.rb +5 -1
  79. data/lib/puppet/parser/ast/resourceparam.rb +5 -0
  80. data/lib/puppet/parser/compiler.rb +14 -17
  81. data/lib/puppet/parser/compiler/catalog_validator/relationship_validator.rb +1 -1
  82. data/lib/puppet/parser/environment_compiler.rb +10 -0
  83. data/lib/puppet/parser/functions/create_resources.rb +39 -24
  84. data/lib/puppet/parser/functions/defined.rb +2 -26
  85. data/lib/puppet/parser/functions/dig.rb +29 -0
  86. data/lib/puppet/parser/functions/lest.rb +49 -0
  87. data/lib/puppet/parser/functions/new.rb +530 -0
  88. data/lib/puppet/parser/functions/require.rb +1 -1
  89. data/lib/puppet/parser/functions/reverse_each.rb +83 -0
  90. data/lib/puppet/parser/functions/scanf.rb +4 -4
  91. data/lib/puppet/parser/functions/step.rb +84 -0
  92. data/lib/puppet/parser/functions/then.rb +73 -0
  93. data/lib/puppet/parser/functions/type.rb +53 -0
  94. data/lib/puppet/parser/resource.rb +16 -7
  95. data/lib/puppet/parser/scope.rb +36 -28
  96. data/lib/puppet/parser/type_loader.rb +1 -1
  97. data/lib/puppet/plugins/data_providers/data_provider.rb +1 -1
  98. data/lib/puppet/pops.rb +13 -0
  99. data/lib/puppet/pops/adapters.rb +49 -49
  100. data/lib/puppet/pops/binder/scheme_handler/confdir_scheme.rb +1 -1
  101. data/lib/puppet/pops/evaluator/access_operator.rb +39 -2
  102. data/lib/puppet/pops/evaluator/closure.rb +39 -13
  103. data/lib/puppet/pops/evaluator/collector_transformer.rb +10 -1
  104. data/lib/puppet/pops/evaluator/evaluator_impl.rb +16 -11
  105. data/lib/puppet/pops/evaluator/external_syntax_support.rb +1 -1
  106. data/lib/puppet/pops/evaluator/json_strict_literal_evaluator.rb +0 -1
  107. data/lib/puppet/pops/evaluator/literal_evaluator.rb +0 -1
  108. data/lib/puppet/pops/evaluator/relationship_operator.rb +1 -2
  109. data/lib/puppet/pops/evaluator/runtime3_resource_support.rb +119 -0
  110. data/lib/puppet/pops/evaluator/runtime3_support.rb +19 -45
  111. data/lib/puppet/pops/functions/function.rb +5 -0
  112. data/lib/puppet/pops/issues.rb +1 -1
  113. data/lib/puppet/pops/label_provider.rb +2 -2
  114. data/lib/puppet/pops/loader/base_loader.rb +12 -15
  115. data/lib/puppet/pops/loader/loader.rb +15 -50
  116. data/lib/puppet/pops/loader/loader_paths.rb +28 -2
  117. data/lib/puppet/pops/loader/module_loaders.rb +16 -1
  118. data/lib/puppet/pops/loader/null_loader.rb +17 -1
  119. data/lib/puppet/pops/loader/puppet_function_instantiator.rb +12 -11
  120. data/lib/puppet/pops/loader/puppet_resource_type_impl_instantiator.rb +80 -0
  121. data/lib/puppet/pops/loader/ruby_function_instantiator.rb +2 -3
  122. data/lib/puppet/pops/loader/runtime3_type_loader.rb +52 -13
  123. data/lib/puppet/pops/loader/static_loader.rb +55 -0
  124. data/lib/puppet/pops/loader/type_definition_instantiator.rb +30 -14
  125. data/lib/puppet/pops/loader/typed_name.rb +50 -0
  126. data/lib/puppet/pops/loaders.rb +64 -19
  127. data/lib/puppet/pops/merge_strategy.rb +7 -7
  128. data/lib/puppet/pops/migration/migration_checker.rb +4 -0
  129. data/lib/puppet/pops/model/model_label_provider.rb +2 -0
  130. data/lib/puppet/pops/parser/egrammar.ra +8 -5
  131. data/lib/puppet/pops/parser/eparser.rb +1550 -1498
  132. data/lib/puppet/pops/parser/evaluating_parser.rb +1 -1
  133. data/lib/puppet/pops/parser/interpolation_support.rb +7 -0
  134. data/lib/puppet/pops/parser/lexer2.rb +14 -1
  135. data/lib/puppet/pops/parser/locator.rb +30 -1
  136. data/lib/puppet/pops/parser/parser_support.rb +0 -3
  137. data/lib/puppet/pops/parser/slurp_support.rb +3 -3
  138. data/lib/puppet/pops/patterns.rb +9 -1
  139. data/lib/puppet/pops/pcore.rb +67 -11
  140. data/lib/puppet/pops/puppet_stack.rb +43 -0
  141. data/lib/puppet/pops/resource/param.rb +51 -0
  142. data/lib/puppet/pops/resource/resource_type_impl.rb +301 -0
  143. data/lib/puppet/pops/resource/resource_type_set.pcore +21 -0
  144. data/lib/puppet/pops/serialization.rb +17 -0
  145. data/lib/puppet/pops/serialization/abstract_reader.rb +149 -0
  146. data/lib/puppet/pops/serialization/abstract_writer.rb +179 -0
  147. data/lib/puppet/pops/serialization/deserializer.rb +60 -0
  148. data/lib/puppet/pops/serialization/extension.rb +126 -0
  149. data/lib/puppet/pops/serialization/instance_reader.rb +19 -0
  150. data/lib/puppet/pops/serialization/instance_writer.rb +14 -0
  151. data/lib/puppet/pops/serialization/json.rb +247 -0
  152. data/lib/puppet/pops/serialization/object.rb +63 -0
  153. data/lib/puppet/pops/serialization/rgen.rb +151 -0
  154. data/lib/puppet/pops/serialization/serializer.rb +91 -0
  155. data/lib/puppet/pops/serialization/time_factory.rb +66 -0
  156. data/lib/puppet/pops/types/annotatable.rb +36 -0
  157. data/lib/puppet/pops/types/implementation_registry.rb +3 -8
  158. data/lib/puppet/pops/types/p_meta_type.rb +83 -0
  159. data/lib/puppet/pops/types/p_object_type.rb +110 -117
  160. data/lib/puppet/pops/types/p_runtime_type.rb +13 -0
  161. data/lib/puppet/pops/types/p_sem_ver_range_type.rb +23 -0
  162. data/lib/puppet/pops/types/p_sem_ver_type.rb +30 -2
  163. data/lib/puppet/pops/types/p_sensitive_type.rb +69 -0
  164. data/lib/puppet/pops/types/p_type_set_type.rb +361 -0
  165. data/lib/puppet/pops/types/puppet_object.rb +0 -5
  166. data/lib/puppet/pops/types/ruby_generator.rb +9 -2
  167. data/lib/puppet/pops/types/type_calculator.rb +6 -1
  168. data/lib/puppet/pops/types/type_factory.rb +14 -12
  169. data/lib/puppet/pops/types/type_formatter.rb +78 -33
  170. data/lib/puppet/pops/types/type_mismatch_describer.rb +0 -2
  171. data/lib/puppet/pops/types/type_parser.rb +27 -2
  172. data/lib/puppet/pops/types/type_set_reference.rb +59 -0
  173. data/lib/puppet/pops/types/types.rb +366 -13
  174. data/lib/puppet/pops/validation.rb +4 -4
  175. data/lib/puppet/pops/validation/checker4_0.rb +5 -2
  176. data/lib/puppet/pops/visitor.rb +2 -2
  177. data/lib/puppet/property.rb +64 -5
  178. data/lib/puppet/provider.rb +1 -1
  179. data/lib/puppet/provider/aixobject.rb +3 -3
  180. data/lib/puppet/provider/group/aix.rb +4 -4
  181. data/lib/puppet/provider/macauthorization/macauthorization.rb +1 -1
  182. data/lib/puppet/provider/mailalias/aliases.rb +1 -1
  183. data/lib/puppet/provider/mcx/mcxcontent.rb +2 -2
  184. data/lib/puppet/provider/mount/parsed.rb +1 -1
  185. data/lib/puppet/provider/nameservice/directoryservice.rb +5 -5
  186. data/lib/puppet/provider/package/appdmg.rb +3 -3
  187. data/lib/puppet/provider/package/apple.rb +1 -1
  188. data/lib/puppet/provider/package/dnf.rb +5 -0
  189. data/lib/puppet/provider/package/nim.rb +1 -1
  190. data/lib/puppet/provider/package/pacman.rb +2 -2
  191. data/lib/puppet/provider/package/pip.rb +5 -3
  192. data/lib/puppet/provider/package/pip3.rb +1 -1
  193. data/lib/puppet/provider/package/pkg.rb +5 -5
  194. data/lib/puppet/provider/package/pkgdmg.rb +4 -4
  195. data/lib/puppet/provider/package/pkgin.rb +1 -1
  196. data/lib/puppet/provider/package/pkgutil.rb +1 -1
  197. data/lib/puppet/provider/package/portage.rb +48 -8
  198. data/lib/puppet/provider/package/sun.rb +1 -1
  199. data/lib/puppet/provider/package/tdnf.rb +28 -0
  200. data/lib/puppet/provider/package/yum.rb +22 -4
  201. data/lib/puppet/provider/parsedfile.rb +2 -2
  202. data/lib/puppet/provider/service/base.rb +1 -1
  203. data/lib/puppet/provider/service/bsd.rb +1 -1
  204. data/lib/puppet/provider/service/daemontools.rb +2 -2
  205. data/lib/puppet/provider/service/debian.rb +3 -3
  206. data/lib/puppet/provider/service/init.rb +5 -3
  207. data/lib/puppet/provider/service/launchd.rb +16 -2
  208. data/lib/puppet/provider/service/runit.rb +1 -1
  209. data/lib/puppet/provider/service/smf.rb +8 -1
  210. data/lib/puppet/provider/service/systemd.rb +39 -6
  211. data/lib/puppet/provider/ssh_authorized_key/parsed.rb +1 -1
  212. data/lib/puppet/provider/user/aix.rb +3 -2
  213. data/lib/puppet/provider/user/directoryservice.rb +4 -3
  214. data/lib/puppet/provider/user/hpux.rb +1 -1
  215. data/lib/puppet/provider/user/user_role_add.rb +1 -1
  216. data/lib/puppet/provider/user/windows_adsi.rb +3 -0
  217. data/lib/puppet/provider/zfs/zfs.rb +1 -1
  218. data/lib/puppet/reference/type.rb +1 -1
  219. data/lib/puppet/resource.rb +33 -7
  220. data/lib/puppet/resource/capability_finder.rb +74 -54
  221. data/lib/puppet/resource/status.rb +11 -2
  222. data/lib/puppet/settings.rb +17 -6
  223. data/lib/puppet/settings/environment_conf.rb +1 -1
  224. data/lib/puppet/settings/server_list_setting.rb +20 -0
  225. data/lib/puppet/ssl/certificate_authority.rb +32 -9
  226. data/lib/puppet/ssl/certificate_authority/interface.rb +164 -24
  227. data/lib/puppet/ssl/host.rb +3 -3
  228. data/lib/puppet/ssl/oids.rb +10 -0
  229. data/lib/puppet/ssl/validator/default_validator.rb +2 -2
  230. data/lib/puppet/test/test_helper.rb +2 -2
  231. data/lib/puppet/transaction.rb +12 -0
  232. data/lib/puppet/transaction/additional_resource_generator.rb +1 -1
  233. data/lib/puppet/transaction/event.rb +29 -2
  234. data/lib/puppet/transaction/event_manager.rb +1 -1
  235. data/lib/puppet/transaction/persistence.rb +84 -0
  236. data/lib/puppet/transaction/report.rb +49 -2
  237. data/lib/puppet/transaction/resource_harness.rb +98 -18
  238. data/lib/puppet/type.rb +63 -21
  239. data/lib/puppet/type/augeas.rb +3 -3
  240. data/lib/puppet/type/cron.rb +1 -1
  241. data/lib/puppet/type/file.rb +39 -2
  242. data/lib/puppet/type/file/data_sync.rb +13 -5
  243. data/lib/puppet/type/host.rb +1 -1
  244. data/lib/puppet/type/mount.rb +2 -6
  245. data/lib/puppet/type/notify.rb +1 -1
  246. data/lib/puppet/type/package.rb +1 -1
  247. data/lib/puppet/type/resources.rb +1 -1
  248. data/lib/puppet/type/scheduled_task.rb +1 -1
  249. data/lib/puppet/type/ssh_authorized_key.rb +2 -2
  250. data/lib/puppet/type/tidy.rb +1 -1
  251. data/lib/puppet/type/yumrepo.rb +3 -3
  252. data/lib/puppet/type/zone.rb +1 -1
  253. data/lib/puppet/util.rb +2 -2
  254. data/lib/puppet/util/classgen.rb +1 -1
  255. data/lib/puppet/util/command_line.rb +6 -2
  256. data/lib/puppet/util/command_line/trollop.rb +1 -1
  257. data/lib/puppet/util/execution.rb +2 -2
  258. data/lib/puppet/util/http_proxy.rb +1 -1
  259. data/lib/puppet/util/inifile.rb +1 -1
  260. data/lib/puppet/util/instance_loader.rb +1 -1
  261. data/lib/puppet/util/logging.rb +1 -1
  262. data/lib/puppet/util/multi_match.rb +1 -1
  263. data/lib/puppet/util/plist.rb +15 -5
  264. data/lib/puppet/util/profiler.rb +1 -1
  265. data/lib/puppet/util/profiler/around_profiler.rb +1 -1
  266. data/lib/puppet/util/psych_support.rb +1 -1
  267. data/lib/puppet/util/rdoc.rb +2 -2
  268. data/lib/puppet/util/rubygems.rb +1 -1
  269. data/lib/puppet/util/watcher/periodic_watcher.rb +2 -2
  270. data/lib/puppet/util/windows/access_control_entry.rb +1 -1
  271. data/lib/puppet/util/windows/adsi.rb +30 -8
  272. data/lib/puppet/util/windows/api_types.rb +1 -1
  273. data/lib/puppet/util/windows/file.rb +59 -0
  274. data/lib/puppet/util/windows/process.rb +10 -0
  275. data/lib/puppet/util/windows/security.rb +1 -1
  276. data/lib/puppet/util/windows/user.rb +22 -4
  277. data/lib/puppet/util/yaml.rb +15 -3
  278. data/lib/puppet/vendor/deep_merge/test/test_deep_merge.rb +1 -1
  279. data/lib/puppet/vendor/rgen_patch.rb +1 -1
  280. data/lib/puppet/version.rb +2 -2
  281. data/spec/fixtures/unit/pops/loaders/loaders/no_modules/manifests/site.pp +10 -0
  282. data/spec/integration/agent/logging_spec.rb +15 -14
  283. data/spec/integration/application/apply_spec.rb +1 -0
  284. data/spec/integration/directory_environments_spec.rb +16 -0
  285. data/spec/integration/environments/settings_spec.rb +32 -4
  286. data/spec/integration/faces/documentation_spec.rb +1 -1
  287. data/spec/integration/network/http/api/indirected_routes_spec.rb +33 -0
  288. data/spec/integration/node/environment_spec.rb +21 -0
  289. data/spec/integration/parser/collection_spec.rb +10 -0
  290. data/spec/integration/parser/compiler_spec.rb +76 -840
  291. data/spec/integration/parser/functions/require_spec.rb +3 -3
  292. data/spec/integration/parser/parameter_defaults_spec.rb +6 -2
  293. data/spec/integration/parser/pcore_resource_spec.rb +208 -0
  294. data/spec/integration/parser/resource_expressions_spec.rb +4 -2
  295. data/spec/integration/provider/yumrepo_spec.rb +4 -1
  296. data/spec/integration/transaction/report_spec.rb +666 -0
  297. data/spec/integration/type/file_spec.rb +11 -12
  298. data/spec/integration/util/windows/adsi_spec.rb +99 -0
  299. data/spec/integration/util/windows/principal_spec.rb +109 -60
  300. data/spec/integration/util/windows/process_spec.rb +4 -2
  301. data/spec/integration/util/windows/security_spec.rb +34 -8
  302. data/spec/integration/util/windows/user_spec.rb +26 -4
  303. data/spec/lib/puppet_spec/files.rb +2 -2
  304. data/spec/lib/puppet_spec/network.rb +12 -8
  305. data/spec/shared_examples/rhel_package_provider.rb +341 -0
  306. data/spec/spec_helper.rb +8 -2
  307. data/spec/unit/application/cert_spec.rb +20 -0
  308. data/spec/unit/configurer/plugin_handler_spec.rb +0 -26
  309. data/spec/unit/configurer_spec.rb +46 -0
  310. data/spec/unit/defaults_spec.rb +14 -0
  311. data/spec/unit/face/generate_spec.rb +230 -0
  312. data/spec/unit/face/help_spec.rb +53 -0
  313. data/spec/unit/face/parser_spec.rb +6 -0
  314. data/spec/unit/face/plugin_spec.rb +0 -4
  315. data/spec/unit/file_system_spec.rb +85 -0
  316. data/spec/unit/functions/lookup_spec.rb +4 -4
  317. data/spec/unit/functions/match_spec.rb +2 -2
  318. data/spec/unit/functions/regsubst_spec.rb +1 -1
  319. data/spec/unit/functions/split_spec.rb +1 -1
  320. data/spec/unit/functions/unwrap_spec.rb +29 -0
  321. data/spec/unit/functions/versioncmp_spec.rb +1 -1
  322. data/spec/unit/functions4_spec.rb +8 -8
  323. data/spec/unit/indirector/facts/facter_spec.rb +1 -9
  324. data/spec/unit/indirector/rest_spec.rb +95 -9
  325. data/spec/unit/module_spec.rb +43 -7
  326. data/spec/unit/module_tool/applications/installer_spec.rb +10 -1
  327. data/spec/unit/module_tool/applications/unpacker_spec.rb +2 -1
  328. data/spec/unit/module_tool/applications/upgrader_spec.rb +8 -0
  329. data/spec/unit/module_tool/tar/mini_spec.rb +3 -3
  330. data/spec/unit/network/http/api/indirected_routes_spec.rb +49 -58
  331. data/spec/unit/network/http/api/master/v3_spec.rb +7 -4
  332. data/spec/unit/network/rights_spec.rb +1 -1
  333. data/spec/unit/parameter_spec.rb +11 -0
  334. data/spec/unit/parser/compiler_spec.rb +19 -33
  335. data/spec/unit/{appmgmt_spec.rb → parser/environment_compiler_spec.rb} +12 -1
  336. data/spec/unit/parser/functions/create_resources_spec.rb +76 -4
  337. data/spec/unit/parser/functions/require_spec.rb +2 -2
  338. data/spec/unit/parser/resource_spec.rb +21 -11
  339. data/spec/unit/parser/scope_spec.rb +1 -5
  340. data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +1 -1
  341. data/spec/unit/pops/loaders/dependency_loader_spec.rb +1 -1
  342. data/spec/unit/pops/loaders/loader_paths_spec.rb +1 -1
  343. data/spec/unit/pops/loaders/loaders_spec.rb +63 -5
  344. data/spec/unit/pops/loaders/module_loaders_spec.rb +2 -2
  345. data/spec/unit/pops/loaders/static_loader_spec.rb +1 -1
  346. data/spec/unit/pops/parser/lexer2_spec.rb +27 -3
  347. data/spec/unit/pops/parser/parse_basic_expressions_spec.rb +8 -0
  348. data/spec/unit/pops/parser/parse_calls_spec.rb +9 -0
  349. data/spec/unit/pops/puppet_stack_spec.rb +79 -0
  350. data/spec/unit/pops/resource/resource_type_impl_spec.rb +37 -0
  351. data/spec/unit/pops/serialization/packer_spec.rb +153 -0
  352. data/spec/unit/pops/serialization/rgen_spec.rb +88 -0
  353. data/spec/unit/pops/serialization/serialization_spec.rb +228 -0
  354. data/spec/unit/pops/types/p_object_type_spec.rb +44 -2
  355. data/spec/unit/pops/types/p_sem_ver_type_spec.rb +42 -0
  356. data/spec/unit/pops/types/p_sensitive_type_spec.rb +139 -0
  357. data/spec/unit/pops/types/p_type_set_type_spec.rb +424 -0
  358. data/spec/unit/pops/types/ruby_generator_spec.rb +497 -181
  359. data/spec/unit/pops/types/type_calculator_spec.rb +10 -4
  360. data/spec/unit/pops/types/type_formatter_spec.rb +1 -1
  361. data/spec/unit/pops/types/type_mismatch_describer_spec.rb +2 -2
  362. data/spec/unit/pops/types/type_parser_spec.rb +1 -1
  363. data/spec/unit/pops/types/types_spec.rb +1 -1
  364. data/spec/unit/pops/validator/validator_spec.rb +18 -1
  365. data/spec/unit/property_spec.rb +48 -11
  366. data/spec/unit/provider/group/windows_adsi_spec.rb +11 -1
  367. data/spec/unit/provider/package/dnf_spec.rb +1 -99
  368. data/spec/unit/provider/package/pacman_spec.rb +4 -4
  369. data/spec/unit/provider/package/pip_spec.rb +14 -0
  370. data/spec/unit/provider/package/pkg_spec.rb +6 -0
  371. data/spec/unit/provider/package/pkgdmg_spec.rb +0 -3
  372. data/spec/unit/provider/package/portage_spec.rb +64 -8
  373. data/spec/unit/provider/package/tdnf_spec.rb +18 -0
  374. data/spec/unit/provider/package/windows/package_spec.rb +4 -1
  375. data/spec/unit/provider/package/windows_spec.rb +8 -2
  376. data/spec/unit/provider/package/yum_spec.rb +6 -377
  377. data/spec/unit/provider/service/base_spec.rb +6 -0
  378. data/spec/unit/provider/service/debian_spec.rb +16 -7
  379. data/spec/unit/provider/service/gentoo_spec.rb +6 -0
  380. data/spec/unit/provider/service/init_spec.rb +7 -0
  381. data/spec/unit/provider/service/launchd_spec.rb +35 -4
  382. data/spec/unit/provider/service/openrc_spec.rb +6 -0
  383. data/spec/unit/provider/service/smf_spec.rb +31 -6
  384. data/spec/unit/provider/service/src_spec.rb +6 -0
  385. data/spec/unit/provider/service/systemd_spec.rb +70 -20
  386. data/spec/unit/provider/service/upstart_spec.rb +6 -0
  387. data/spec/unit/provider/user/aix_spec.rb +7 -0
  388. data/spec/unit/provider/user/directoryservice_spec.rb +30 -1
  389. data/spec/unit/provider/user/windows_adsi_spec.rb +19 -0
  390. data/spec/unit/resource/capability_finder_spec.rb +51 -3
  391. data/spec/unit/resource/catalog_spec.rb +5 -0
  392. data/spec/unit/resource/type_spec.rb +2 -2
  393. data/spec/unit/resource_spec.rb +19 -0
  394. data/spec/unit/settings_spec.rb +13 -0
  395. data/spec/unit/ssl/certificate_authority/interface_spec.rb +176 -10
  396. data/spec/unit/ssl/certificate_authority_spec.rb +63 -22
  397. data/spec/unit/ssl/host_spec.rb +1 -1
  398. data/spec/unit/ssl/oids_spec.rb +24 -21
  399. data/spec/unit/transaction/event_spec.rb +3 -1
  400. data/spec/unit/transaction/persistence_spec.rb +173 -0
  401. data/spec/unit/transaction/report_spec.rb +64 -1
  402. data/spec/unit/transaction/resource_harness_spec.rb +91 -0
  403. data/spec/unit/type/file/content_spec.rb +47 -15
  404. data/spec/unit/type/file_spec.rb +28 -0
  405. data/spec/unit/type/mount_spec.rb +5 -12
  406. data/spec/unit/type/yumrepo_spec.rb +1 -5
  407. data/spec/unit/type_spec.rb +32 -0
  408. data/spec/unit/util/command_line_spec.rb +11 -0
  409. data/spec/unit/util/execution_spec.rb +1 -1
  410. data/spec/unit/util/plist_spec.rb +16 -3
  411. data/spec/unit/util/storage_spec.rb +4 -1
  412. data/spec/unit/util/windows/adsi_spec.rb +23 -2
  413. data/spec/unit/util/windows/file_spec.rb +56 -1
  414. data/spec/unit/util/windows/sid_spec.rb +31 -7
  415. data/spec/unit/util/yaml_spec.rb +12 -0
  416. data/spec/unit/util_spec.rb +87 -20
  417. metadata +89 -34
  418. data/ext/puppetlisten/puppetlisten.rb +0 -77
  419. data/ext/puppetlisten/puppetrun.rb +0 -38
  420. data/lib/puppet/resource/type_collection_helper.rb +0 -7
  421. data/spec/unit/parser/functions/defined_spec.rb +0 -120
  422. data/spec/unit/resource/type_collection_helper_spec.rb +0 -24
@@ -17,6 +17,12 @@ describe "base service provider" do
17
17
 
18
18
  subject { provider }
19
19
 
20
+ if Puppet.features.microsoft_windows?
21
+ # Get a pid for $CHILD_STATUS to latch on to
22
+ command = "cmd.exe /c \"exit 0\""
23
+ Puppet::Util::Execution.execute(command, {:failonfail => false})
24
+ end
25
+
20
26
  context "basic operations" do
21
27
  subject do
22
28
  type.new(
@@ -9,6 +9,12 @@ provider_class = Puppet::Type.type(:service).provider(:debian)
9
9
 
10
10
  describe provider_class do
11
11
 
12
+ if Puppet.features.microsoft_windows?
13
+ # Get a pid for $CHILD_STATUS to latch on to
14
+ command = "cmd.exe /c \"exit 0\""
15
+ Puppet::Util::Execution.execute(command, {:failonfail => false})
16
+ end
17
+
12
18
  before(:each) do
13
19
  # Create a mock resource
14
20
  @resource = stub 'resource'
@@ -33,17 +39,20 @@ describe provider_class do
33
39
  @provider.stubs(:invoke_rc)
34
40
  end
35
41
 
36
- operatingsystem = [ 'Debian', 'CumulusLinux' ]
37
- operatingsystem.each do |os|
38
- it "should be the default provider on #{os}" do
39
- Facter.expects(:value).with(:operatingsystem).at_least_once.returns(os)
40
- if os == 'Debian'
41
- Facter.expects(:value).with(:operatingsystemmajrelease).returns('7')
42
- end
42
+ ['1','2'].each do |version|
43
+ it "should be the default provider on CumulusLinux #{version}" do
44
+ Facter.expects(:value).with(:operatingsystem).at_least_once.returns('CumulusLinux')
45
+ Facter.expects(:value).with(:operatingsystemmajrelease).returns(version)
43
46
  expect(provider_class.default?).to be_truthy
44
47
  end
45
48
  end
46
49
 
50
+ it "should be the default provider on Debian" do
51
+ Facter.expects(:value).with(:operatingsystem).at_least_once.returns('Debian')
52
+ Facter.expects(:value).with(:operatingsystemmajrelease).returns('7')
53
+ expect(provider_class.default?).to be_truthy
54
+ end
55
+
47
56
  it "should have an enabled? method" do
48
57
  expect(@provider).to respond_to(:enabled?)
49
58
  end
@@ -4,6 +4,12 @@ require 'spec_helper'
4
4
 
5
5
  describe Puppet::Type.type(:service).provider(:gentoo) do
6
6
 
7
+ if Puppet.features.microsoft_windows?
8
+ # Get a pid for $CHILD_STATUS to latch on to
9
+ command = "cmd.exe /c \"exit 0\""
10
+ Puppet::Util::Execution.execute(command, {:failonfail => false})
11
+ end
12
+
7
13
  before :each do
8
14
  Puppet::Type.type(:service).stubs(:defaultprovider).returns described_class
9
15
  FileTest.stubs(:file?).with('/sbin/rc-update').returns true
@@ -6,6 +6,13 @@
6
6
  require 'spec_helper'
7
7
 
8
8
  describe Puppet::Type.type(:service).provider(:init) do
9
+
10
+ if Puppet.features.microsoft_windows?
11
+ # Get a pid for $CHILD_STATUS to latch on to
12
+ command = "cmd.exe /c \"exit 0\""
13
+ Puppet::Util::Execution.execute(command, {:failonfail => false})
14
+ end
15
+
9
16
  before do
10
17
  Puppet::Type.type(:service).defaultprovider = described_class
11
18
  end
@@ -7,11 +7,17 @@ describe Puppet::Type.type(:service).provider(:launchd) do
7
7
  let (:plistlib) { Puppet::Util::Plist }
8
8
  let (:joblabel) { "com.foo.food" }
9
9
  let (:provider) { subject.class }
10
- let(:resource) { Puppet::Type.type(:service).new(:name => joblabel, :provider => :launchd) }
10
+ let (:resource) { Puppet::Type.type(:service).new(:name => joblabel, :provider => :launchd) }
11
11
  let (:launchd_overrides_6_9) { '/var/db/launchd.db/com.apple.launchd/overrides.plist' }
12
12
  let (:launchd_overrides_10_) { '/var/db/com.apple.xpc.launchd/disabled.plist' }
13
13
  subject { resource.provider }
14
14
 
15
+ if Puppet.features.microsoft_windows?
16
+ # Get a pid for $CHILD_STATUS to latch on to
17
+ command = "cmd.exe /c \"exit 0\""
18
+ Puppet::Util::Execution.execute(command, {:failonfail => false})
19
+ end
20
+
15
21
  describe "the type interface" do
16
22
  %w{ start stop enabled? enable disable status}.each do |method|
17
23
  it { is_expected.to respond_to method.to_sym }
@@ -20,9 +26,9 @@ describe Puppet::Type.type(:service).provider(:launchd) do
20
26
 
21
27
  describe 'the status of the services' do
22
28
  it "should call the external command 'launchctl list' once" do
23
- provider.expects(:launchctl).with(:list).returns(joblabel)
24
- provider.expects(:jobsearch).with(nil).returns({joblabel => "/Library/LaunchDaemons/#{joblabel}"})
25
- provider.prefetch({})
29
+ provider.expects(:launchctl).with(:list).returns(joblabel)
30
+ provider.expects(:jobsearch).with(nil).returns({joblabel => "/Library/LaunchDaemons/#{joblabel}"})
31
+ provider.prefetch({})
26
32
  end
27
33
  it "should return stopped if not listed in launchctl list output" do
28
34
  provider.expects(:launchctl).with(:list).returns('com.bar.is_running')
@@ -37,6 +43,31 @@ describe Puppet::Type.type(:service).provider(:launchd) do
37
43
  after :each do
38
44
  provider.instance_variable_set(:@job_list, nil)
39
45
  end
46
+
47
+ describe "when hasstatus is set to false" do
48
+ before :each do
49
+ resource[:hasstatus] = :false
50
+ end
51
+
52
+ it "should use the user-provided status command if present and return running if true" do
53
+ resource[:status] = '/bin/true'
54
+ subject.expects(:texecute).with(:status, ["/bin/true"], false).returns(0)
55
+ $CHILD_STATUS.stubs(:exitstatus).returns(0)
56
+ expect(subject.status).to eq(:running)
57
+ end
58
+
59
+ it "should use the user-provided status command if present and return stopped if false" do
60
+ resource[:status] = '/bin/false'
61
+ subject.expects(:texecute).with(:status, ["/bin/false"], false).returns(nil)
62
+ $CHILD_STATUS.stubs(:exitstatus).returns(1)
63
+ expect(subject.status).to eq(:stopped)
64
+ end
65
+
66
+ it "should fall back to getpid if no status command is provided" do
67
+ subject.expects(:getpid).returns(123)
68
+ expect(subject.status).to eq(:running)
69
+ end
70
+ end
40
71
  end
41
72
 
42
73
  [[10, '10.6'], [13, '10.9']].each do |kernel, version|
@@ -4,6 +4,12 @@ require 'spec_helper'
4
4
 
5
5
  describe Puppet::Type.type(:service).provider(:openrc) do
6
6
 
7
+ if Puppet.features.microsoft_windows?
8
+ # Get a pid for $CHILD_STATUS to latch on to
9
+ command = "cmd.exe /c \"exit 0\""
10
+ Puppet::Util::Execution.execute(command, {:failonfail => false})
11
+ end
12
+
7
13
  before :each do
8
14
  Puppet::Type.type(:service).stubs(:defaultprovider).returns described_class
9
15
  ['/sbin/rc-service', '/bin/rc-status', '/sbin/rc-update'].each do |command|
@@ -20,6 +20,9 @@ describe provider_class, :if => Puppet.features.posix? do
20
20
  FileTest.stubs(:executable?).with('/usr/sbin/svcadm').returns true
21
21
  FileTest.stubs(:file?).with('/usr/bin/svcs').returns true
22
22
  FileTest.stubs(:executable?).with('/usr/bin/svcs').returns true
23
+ Facter.stubs(:value).with(:operatingsystem).returns('Solaris')
24
+ Facter.stubs(:value).with(:osfamily).returns('Solaris')
25
+ Facter.stubs(:value).with(:operatingsystemrelease).returns '11.2'
23
26
  end
24
27
 
25
28
  describe ".instances" do
@@ -174,17 +177,39 @@ describe provider_class, :if => Puppet.features.posix? do
174
177
  end
175
178
 
176
179
  describe "when restarting" do
177
- it "should call 'svcadm restart /system/myservice'" do
178
- @provider.expects(:texecute).with(:restart, ["/usr/sbin/svcadm", :restart, "/system/myservice"], true)
179
- @provider.expects(:wait).with('online')
180
- @provider.restart
181
- end
182
180
 
183
181
  it "should error if timeout occurs while restarting the service" do
184
- @provider.expects(:texecute).with(:restart, ["/usr/sbin/svcadm", :restart, "/system/myservice"], true)
182
+ @provider.expects(:texecute).with(:restart, ["/usr/sbin/svcadm", :restart, "-s", "/system/myservice"], true)
185
183
  Timeout.expects(:timeout).with(60).raises(Timeout::Error)
186
184
  expect { @provider.restart }.to raise_error Puppet::Error, ('Timed out waiting for /system/myservice to transition states')
187
185
  end
188
186
 
187
+ context 'with :operatingsystemrelease == 10_u10' do
188
+ it "should call 'svcadm restart /system/myservice'" do
189
+ Facter.stubs(:value).with(:operatingsystemrelease).returns '10_u10'
190
+ @provider.expects(:texecute).with(:restart, ["/usr/sbin/svcadm", :restart, "/system/myservice"], true)
191
+ @provider.expects(:wait).with('online')
192
+ @provider.restart
193
+ end
194
+ end
195
+
196
+ context 'with :operatingsystemrelease == 11.2' do
197
+ it "should call 'svcadm restart -s /system/myservice'" do
198
+ Facter.stubs(:value).with(:operatingsystemrelease).returns '11.2'
199
+ @provider.expects(:texecute).with(:restart, ["/usr/sbin/svcadm", :restart, "-s", "/system/myservice"], true)
200
+ @provider.expects(:wait).with('online')
201
+ @provider.restart
202
+ end
203
+ end
204
+
205
+ context 'with :operatingsystemrelease > 11.2' do
206
+ it "should call 'svcadm restart -s /system/myservice'" do
207
+ Facter.stubs(:value).with(:operatingsystemrelease).returns '11.3'
208
+ @provider.expects(:texecute).with(:restart, ["/usr/sbin/svcadm", :restart, "-s", "/system/myservice"], true)
209
+ @provider.expects(:wait).with('online')
210
+ @provider.restart
211
+ end
212
+ end
213
+
189
214
  end
190
215
  end
@@ -9,6 +9,12 @@ provider_class = Puppet::Type.type(:service).provider(:src)
9
9
 
10
10
  describe provider_class do
11
11
 
12
+ if Puppet.features.microsoft_windows?
13
+ # Get a pid for $CHILD_STATUS to latch on to
14
+ command = "cmd.exe /c \"exit 0\""
15
+ Puppet::Util::Execution.execute(command, {:failonfail => false})
16
+ end
17
+
12
18
  before :each do
13
19
  @resource = stub 'resource'
14
20
  @resource.stubs(:[]).returns(nil)
@@ -5,6 +5,13 @@
5
5
  require 'spec_helper'
6
6
 
7
7
  describe Puppet::Type.type(:service).provider(:systemd) do
8
+
9
+ if Puppet.features.microsoft_windows?
10
+ # Get a pid for $CHILD_STATUS to latch on to
11
+ command = "cmd.exe /c \"exit 0\""
12
+ Puppet::Util::Execution.execute(command, {:failonfail => false})
13
+ end
14
+
8
15
  before :each do
9
16
  Puppet::Type.type(:service).stubs(:defaultprovider).returns described_class
10
17
  described_class.stubs(:which).with('systemctl').returns '/bin/systemctl'
@@ -51,6 +58,13 @@ describe Puppet::Type.type(:service).provider(:systemd) do
51
58
  end
52
59
  end
53
60
 
61
+ it "should be the default provider on cumulus3" do
62
+ Facter.stubs(:value).with(:osfamily).returns(:debian)
63
+ Facter.stubs(:value).with(:operatingsystem).returns('CumulusLinux')
64
+ Facter.stubs(:value).with(:operatingsystemmajrelease).returns("3")
65
+ expect(described_class).to be_default
66
+ end
67
+
54
68
  it "should be the default provider on sles12" do
55
69
  Facter.stubs(:value).with(:osfamily).returns(:suse)
56
70
  Facter.stubs(:value).with(:operatingsystemmajrelease).returns("12")
@@ -98,25 +112,13 @@ describe Puppet::Type.type(:service).provider(:systemd) do
98
112
  expect(described_class).not_to be_default
99
113
  end
100
114
 
101
- it "should be the default provider on ubuntu15.04" do
102
- Facter.stubs(:value).with(:osfamily).returns(:debian)
103
- Facter.stubs(:value).with(:operatingsystem).returns(:ubuntu)
104
- Facter.stubs(:value).with(:operatingsystemmajrelease).returns("15.04")
105
- expect(described_class).to be_default
106
- end
107
-
108
- it "should be the default provider on ubuntu15.10" do
109
- Facter.stubs(:value).with(:osfamily).returns(:debian)
110
- Facter.stubs(:value).with(:operatingsystem).returns(:ubuntu)
111
- Facter.stubs(:value).with(:operatingsystemmajrelease).returns("15.10")
112
- expect(described_class).to be_default
113
- end
114
-
115
- it "should be the default provider on ubuntu16.04" do
116
- Facter.stubs(:value).with(:osfamily).returns(:debian)
117
- Facter.stubs(:value).with(:operatingsystem).returns(:ubuntu)
118
- Facter.stubs(:value).with(:operatingsystemmajrelease).returns("16.04")
119
- expect(described_class).to be_default
115
+ [ '15.04', '15.10', '16.04', '16.10' ].each do |ver|
116
+ it "should be the default provider on ubuntu#{ver}" do
117
+ Facter.stubs(:value).with(:osfamily).returns(:debian)
118
+ Facter.stubs(:value).with(:operatingsystem).returns(:ubuntu)
119
+ Facter.stubs(:value).with(:operatingsystemmajrelease).returns("#{ver}")
120
+ expect(described_class).to be_default
121
+ end
120
122
  end
121
123
 
122
124
  [:enabled?, :enable, :disable, :start, :stop, :status, :restart].each do |method|
@@ -152,9 +154,24 @@ describe Puppet::Type.type(:service).provider(:systemd) do
152
154
  it "should start the service with systemctl start otherwise" do
153
155
  provider = described_class.new(Puppet::Type.type(:service).new(:name => 'sshd.service'))
154
156
  provider.expects(:systemctl).with(:unmask, 'sshd.service')
155
- provider.expects(:execute).with(['/bin/systemctl','start','sshd.service'], :failonfail => true, :override_locale => false, :squelch => false, :combine => true)
157
+ provider.expects(:execute).with(['/bin/systemctl','start','sshd.service'], {:failonfail => true, :override_locale => false, :squelch => false, :combine => true})
156
158
  provider.start
157
159
  end
160
+
161
+ it "should show journald logs on failure" do
162
+ provider = described_class.new(Puppet::Type.type(:service).new(:name => 'sshd.service'))
163
+ provider.expects(:systemctl).with(:unmask, 'sshd.service')
164
+ provider.expects(:execute).with(['/bin/systemctl','start','sshd.service'],{:failonfail => true, :override_locale => false, :squelch => false, :combine => true})
165
+ .raises(Puppet::ExecutionFailure, "Failed to start sshd.service: Unit sshd.service failed to load: Invalid argument. See system logs and 'systemctl status sshd.service' for details.")
166
+ journalctl_logs = <<-EOS
167
+ -- Logs begin at Tue 2016-06-14 11:59:21 UTC, end at Tue 2016-06-14 21:45:02 UTC. --
168
+ Jun 14 21:41:34 foo.example.com systemd[1]: Stopping sshd Service...
169
+ Jun 14 21:41:35 foo.example.com systemd[1]: Starting sshd Service...
170
+ Jun 14 21:43:23 foo.example.com systemd[1]: sshd.service lacks both ExecStart= and ExecStop= setting. Refusing.
171
+ EOS
172
+ provider.expects(:execute).with("journalctl -n 50 --since '5 minutes ago' -u sshd.service --no-pager").returns(journalctl_logs)
173
+ expect { provider.start }.to raise_error(Puppet::Error, /Systemd start for sshd.service failed![\n]+journalctl log for sshd.service:[\n]+-- Logs begin at Tue 2016-06-14 11:59:21 UTC, end at Tue 2016-06-14 21:45:02 UTC. --/m)
174
+ end
158
175
  end
159
176
 
160
177
  describe "#stop" do
@@ -169,36 +186,55 @@ describe Puppet::Type.type(:service).provider(:systemd) do
169
186
  provider.expects(:execute).with(['/bin/systemctl','stop','sshd.service'], :failonfail => true, :override_locale => false, :squelch => false, :combine => true)
170
187
  provider.stop
171
188
  end
189
+
190
+ it "should show journald logs on failure" do
191
+ provider = described_class.new(Puppet::Type.type(:service).new(:name => 'sshd.service'))
192
+ provider.expects(:execute).with(['/bin/systemctl','stop','sshd.service'],{:failonfail => true, :override_locale => false, :squelch => false, :combine => true})
193
+ .raises(Puppet::ExecutionFailure, "Failed to stop sshd.service: Unit sshd.service failed to load: Invalid argument. See system logs and 'systemctl status sshd.service' for details.")
194
+ journalctl_logs = <<-EOS
195
+ -- Logs begin at Tue 2016-06-14 11:59:21 UTC, end at Tue 2016-06-14 21:45:02 UTC. --
196
+ Jun 14 21:41:34 foo.example.com systemd[1]: Stopping sshd Service...
197
+ Jun 14 21:41:35 foo.example.com systemd[1]: Starting sshd Service...
198
+ Jun 14 21:43:23 foo.example.com systemd[1]: sshd.service lacks both ExecStart= and ExecStop= setting. Refusing.
199
+ EOS
200
+ provider.expects(:execute).with("journalctl -n 50 --since '5 minutes ago' -u sshd.service --no-pager").returns(journalctl_logs)
201
+ expect { provider.stop }.to raise_error(Puppet::Error, /Systemd stop for sshd.service failed![\n]+journalctl log for sshd.service:[\n]-- Logs begin at Tue 2016-06-14 11:59:21 UTC, end at Tue 2016-06-14 21:45:02 UTC. --/m)
202
+ end
172
203
  end
173
204
 
174
205
  describe "#enabled?" do
175
206
  it "should return :true if the service is enabled" do
176
207
  provider = described_class.new(Puppet::Type.type(:service).new(:name => 'sshd.service'))
177
208
  provider.expects(:execute).with(['/bin/systemctl','is-enabled','sshd.service'], :failonfail => false).returns "enabled\n"
209
+ $CHILD_STATUS.stubs(:exitstatus).returns(0)
178
210
  expect(provider.enabled?).to eq(:true)
179
211
  end
180
212
 
181
213
  it "should return :true if the service is static" do
182
214
  provider = described_class.new(Puppet::Type.type(:service).new(:name => 'sshd.service'))
183
215
  provider.expects(:execute).with(['/bin/systemctl','is-enabled','sshd.service'], :failonfail => false).returns "static\n"
216
+ $CHILD_STATUS.stubs(:exitstatus).returns(0)
184
217
  expect(provider.enabled?).to eq(:true)
185
218
  end
186
219
 
187
220
  it "should return :false if the service is disabled" do
188
221
  provider = described_class.new(Puppet::Type.type(:service).new(:name => 'sshd.service'))
189
222
  provider.expects(:execute).with(['/bin/systemctl','is-enabled','sshd.service'], :failonfail => false).returns "disabled\n"
223
+ $CHILD_STATUS.stubs(:exitstatus).returns(1)
190
224
  expect(provider.enabled?).to eq(:false)
191
225
  end
192
226
 
193
227
  it "should return :false if the service is masked and the resource is attempting to be disabled" do
194
228
  provider = described_class.new(Puppet::Type.type(:service).new(:name => 'sshd.service', :enable => false))
195
229
  provider.expects(:execute).with(['/bin/systemctl','is-enabled','sshd.service'], :failonfail => false).returns "masked\n"
230
+ $CHILD_STATUS.stubs(:exitstatus).returns(1)
196
231
  expect(provider.enabled?).to eq(:false)
197
232
  end
198
233
 
199
234
  it "should return :mask if the service is masked and the resource is attempting to be masked" do
200
235
  provider = described_class.new(Puppet::Type.type(:service).new(:name => 'sshd.service', :enable => 'mask'))
201
236
  provider.expects(:execute).with(['/bin/systemctl','is-enabled','sshd.service'], :failonfail => false).returns "masked\n"
237
+ $CHILD_STATUS.stubs(:exitstatus).returns(1)
202
238
  expect(provider.enabled?).to eq(:mask)
203
239
  end
204
240
  end
@@ -273,6 +309,20 @@ describe Puppet::Type.type(:service).provider(:systemd) do
273
309
  provider.expects(:execute).with(['/bin/systemctl','restart','sshd.service'], :failonfail => true, :override_locale => false, :squelch => false, :combine => true)
274
310
  provider.restart
275
311
  end
312
+
313
+ it "should show journald logs on failure" do
314
+ provider = described_class.new(Puppet::Type.type(:service).new(:name => 'sshd.service'))
315
+ provider.expects(:execute).with(['/bin/systemctl','restart','sshd.service'],{:failonfail => true, :override_locale => false, :squelch => false, :combine => true})
316
+ .raises(Puppet::ExecutionFailure, "Failed to restart sshd.service: Unit sshd.service failed to load: Invalid argument. See system logs and 'systemctl status sshd.service' for details.")
317
+ journalctl_logs = <<-EOS
318
+ -- Logs begin at Tue 2016-06-14 11:59:21 UTC, end at Tue 2016-06-14 21:45:02 UTC. --
319
+ Jun 14 21:41:34 foo.example.com systemd[1]: Stopping sshd Service...
320
+ Jun 14 21:41:35 foo.example.com systemd[1]: Starting sshd Service...
321
+ Jun 14 21:43:23 foo.example.com systemd[1]: sshd.service lacks both ExecStart= and ExecStop= setting. Refusing.
322
+ EOS
323
+ provider.expects(:execute).with("journalctl -n 50 --since '5 minutes ago' -u sshd.service --no-pager").returns(journalctl_logs)
324
+ expect { provider.restart }.to raise_error(Puppet::Error, /Systemd restart for sshd.service failed![\n]+journalctl log for sshd.service:[\n]+-- Logs begin at Tue 2016-06-14 11:59:21 UTC, end at Tue 2016-06-14 21:45:02 UTC. --/m)
325
+ end
276
326
  end
277
327
 
278
328
  describe "#debian_enabled?" do
@@ -7,6 +7,12 @@ describe Puppet::Type.type(:service).provider(:upstart) do
7
7
  let(:start_on_default_runlevels) { "\nstart on runlevel [2,3,4,5]" }
8
8
  let(:provider_class) { Puppet::Type.type(:service).provider(:upstart) }
9
9
 
10
+ if Puppet.features.microsoft_windows?
11
+ # Get a pid for $CHILD_STATUS to latch on to
12
+ command = "cmd.exe /c \"exit 0\""
13
+ Puppet::Util::Execution.execute(command, {:failonfail => false})
14
+ end
15
+
10
16
  def given_contents_of(file, content)
11
17
  File.open(file, 'w') do |file|
12
18
  file.write(content)
@@ -55,6 +55,7 @@ guest id=100 pgrp=usr groups=usr home=/home/guest
55
55
 
56
56
  describe "invoked via manifest" do
57
57
  let(:attribute_array) { ["rlogin=false", "login =true"] }
58
+ let(:single_attribute_array) { "rlogin=false" }
58
59
 
59
60
  it "should return only the keys of the attribute key=value pair from manifest" do
60
61
  keys = @provider.managed_attribute_keys(existing_attributes)
@@ -79,6 +80,12 @@ guest id=100 pgrp=usr groups=usr home=/home/guest
79
80
  all_symbols = keys.all? {|k| k.is_a? Symbol}
80
81
  expect(all_symbols).to be_truthy
81
82
  end
83
+
84
+ it "should allow a single attribute to be specified" do
85
+ @resource.stubs(:original_parameters).returns({ :attributes => single_attribute_array })
86
+ keys = @provider.managed_attribute_keys(existing_attributes)
87
+ keys.should be_include(:rlogin)
88
+ end
82
89
  end
83
90
 
84
91
  describe "invoked via RAL" do
@@ -350,6 +350,33 @@ describe Puppet::Type.type(:user).provider(:directoryservice) do
350
350
  end
351
351
  end
352
352
 
353
+ describe 'self#generate_attribute_hash empty shadowhashdata' do
354
+ let(:user_plist_resource) do
355
+ {
356
+ :ensure => :present,
357
+ :provider => :directoryservice,
358
+ :groups => 'testgroup,third',
359
+ :comment => username,
360
+ :password => '*',
361
+ :shadowhashdata => nil,
362
+ :name => username,
363
+ :uid => 1000,
364
+ :gid => 22,
365
+ :home => user_path
366
+ }
367
+ end
368
+
369
+ it 'should handle empty shadowhashdata' do
370
+ provider.class.stubs(:get_os_version).returns('10.7')
371
+ provider.class.stubs(:get_all_users).returns(testuser_hash)
372
+ provider.class.stubs(:get_attribute_from_dscl).with('Users', username, 'ShadowHashData').returns(nil)
373
+ provider.class.stubs(:get_list_of_groups).returns(group_plist_hash_guid)
374
+ provider.class.stubs(:convert_binary_to_hash).with(sha512_embedded_bplist).returns(sha512_embedded_bplist_hash)
375
+ provider.class.prefetch({})
376
+ expect(provider.class.generate_attribute_hash(user_plist_hash)).to eq(user_plist_resource)
377
+ end
378
+ end
379
+
353
380
  describe '#exists?' do
354
381
  # This test expects an error to be raised
355
382
  # I'm PROBABLY doing this wrong...
@@ -849,13 +876,14 @@ describe Puppet::Type.type(:user).provider(:directoryservice) do
849
876
  # This will also catch the edge-case where a 10.6-style user exists on
850
877
  # a 10.8 system and Puppet attempts to set a password
851
878
  it 'should not fail if shadow_hash_data is not a Hash' do
852
- provider.expects(:base64_decode_string).with(pbkdf2_password_hash).returns('binary_string')
879
+ Puppet::Util::Plist.expects(:string_to_blob).with(provider.base64_decode_string(pbkdf2_password_hash)).returns('binary_string')
853
880
  provider.class.expects(:convert_hash_to_binary).with(entropy_shadow_hash_data).returns('binary_plist')
854
881
  provider.expects(:set_shadow_hash_data).with({'passwd' => '********'}, 'binary_plist')
855
882
  provider.set_salted_pbkdf2({}, false, 'entropy', pbkdf2_password_hash)
856
883
  end
857
884
 
858
885
  it "should set the PBKDF2 password hash when the 'entropy' field is passed with a valid password hash" do
886
+ Puppet::Util::Plist.expects(:string_to_blob).with(provider.base64_decode_string(pbkdf2_password_hash))
859
887
  provider.class.expects(:convert_hash_to_binary).with(pbkdf2_embedded_bplist_hash).returns(pbkdf2_embedded_plist)
860
888
  provider.expects(:set_shadow_hash_data).with(users_plist, pbkdf2_embedded_plist)
861
889
  users_plist.expects(:[]=).with('passwd', '********')
@@ -863,6 +891,7 @@ describe Puppet::Type.type(:user).provider(:directoryservice) do
863
891
  end
864
892
 
865
893
  it "should set the PBKDF2 password hash when the 'salt' field is passed with a valid password hash" do
894
+ Puppet::Util::Plist.expects(:string_to_blob).with(provider.base64_decode_string(pbkdf2_salt_value))
866
895
  provider.class.expects(:convert_hash_to_binary).with(pbkdf2_embedded_bplist_hash).returns(pbkdf2_embedded_plist)
867
896
  provider.expects(:set_shadow_hash_data).with(users_plist, pbkdf2_embedded_plist)
868
897
  users_plist.expects(:[]=).with('passwd', '********')