puppet 5.4.0 → 5.5.0

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

Potentially problematic release.


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

Files changed (441) hide show
  1. data/Gemfile +3 -3
  2. data/MAINTAINERS +0 -19
  3. data/README.md +5 -5
  4. data/Rakefile +26 -0
  5. data/conf/auth.conf +5 -0
  6. data/ext/project_data.yaml +1 -0
  7. data/ext/regexp_nodes/regexp_nodes.rb +3 -4
  8. data/lib/puppet/application/apply.rb +1 -1
  9. data/lib/puppet/application/cert.rb +3 -1
  10. data/lib/puppet/application/device.rb +100 -13
  11. data/lib/puppet/application/facts.rb +5 -0
  12. data/lib/puppet/application/lookup.rb +12 -2
  13. data/lib/puppet/configurer.rb +37 -17
  14. data/lib/puppet/confine.rb +4 -1
  15. data/lib/puppet/datatypes.rb +1 -1
  16. data/lib/puppet/environments.rb +1 -1
  17. data/lib/puppet/error.rb +6 -3
  18. data/lib/puppet/external/dot.rb +0 -7
  19. data/lib/puppet/external/nagios/parser.rb +1 -1
  20. data/lib/puppet/face/config.rb +92 -10
  21. data/lib/puppet/face/epp.rb +31 -6
  22. data/lib/puppet/face/facts.rb +49 -0
  23. data/lib/puppet/face/help.rb +33 -35
  24. data/lib/puppet/face/help/action.erb +1 -1
  25. data/lib/puppet/face/help/face.erb +1 -1
  26. data/lib/puppet/face/man.rb +55 -12
  27. data/lib/puppet/face/parser.rb +30 -3
  28. data/lib/puppet/file_bucket/file.rb +0 -2
  29. data/lib/puppet/file_serving/base.rb +10 -10
  30. data/lib/puppet/forge.rb +3 -3
  31. data/lib/puppet/forge/errors.rb +3 -3
  32. data/lib/puppet/functions.rb +1 -3
  33. data/lib/puppet/functions/alert.rb +1 -1
  34. data/lib/puppet/functions/all.rb +6 -6
  35. data/lib/puppet/functions/annotate.rb +10 -10
  36. data/lib/puppet/functions/any.rb +6 -6
  37. data/lib/puppet/functions/assert_type.rb +4 -4
  38. data/lib/puppet/functions/binary_file.rb +14 -2
  39. data/lib/puppet/functions/break.rb +31 -2
  40. data/lib/puppet/functions/call.rb +4 -4
  41. data/lib/puppet/functions/contain.rb +19 -3
  42. data/lib/puppet/functions/convert_to.rb +6 -5
  43. data/lib/puppet/functions/crit.rb +1 -1
  44. data/lib/puppet/functions/debug.rb +1 -1
  45. data/lib/puppet/functions/defined.rb +11 -9
  46. data/lib/puppet/functions/dig.rb +26 -2
  47. data/lib/puppet/functions/each.rb +8 -8
  48. data/lib/puppet/functions/emerg.rb +1 -1
  49. data/lib/puppet/functions/empty.rb +79 -0
  50. data/lib/puppet/functions/err.rb +1 -1
  51. data/lib/puppet/functions/eyaml_lookup_key.rb +3 -1
  52. data/lib/puppet/functions/filter.rb +7 -7
  53. data/lib/puppet/functions/find_file.rb +15 -1
  54. data/lib/puppet/functions/flatten.rb +64 -0
  55. data/lib/puppet/functions/hiera.rb +6 -6
  56. data/lib/puppet/functions/hiera_array.rb +6 -6
  57. data/lib/puppet/functions/hiera_hash.rb +6 -6
  58. data/lib/puppet/functions/hiera_include.rb +8 -8
  59. data/lib/puppet/functions/include.rb +28 -2
  60. data/lib/puppet/functions/info.rb +1 -1
  61. data/lib/puppet/functions/inline_epp.rb +2 -2
  62. data/lib/puppet/functions/join.rb +56 -0
  63. data/lib/puppet/functions/json_data.rb +2 -2
  64. data/lib/puppet/functions/keys.rb +25 -0
  65. data/lib/puppet/functions/length.rb +44 -0
  66. data/lib/puppet/functions/lest.rb +39 -1
  67. data/lib/puppet/functions/lookup.rb +2 -1
  68. data/lib/puppet/functions/map.rb +10 -9
  69. data/lib/puppet/functions/match.rb +6 -6
  70. data/lib/puppet/functions/new.rb +995 -2
  71. data/lib/puppet/functions/next.rb +1 -1
  72. data/lib/puppet/functions/notice.rb +1 -1
  73. data/lib/puppet/functions/reduce.rb +6 -6
  74. data/lib/puppet/functions/regsubst.rb +9 -3
  75. data/lib/puppet/functions/require.rb +36 -2
  76. data/lib/puppet/functions/return.rb +1 -1
  77. data/lib/puppet/functions/reverse_each.rb +71 -2
  78. data/lib/puppet/functions/slice.rb +23 -9
  79. data/lib/puppet/functions/split.rb +12 -10
  80. data/lib/puppet/functions/step.rb +73 -1
  81. data/lib/puppet/functions/strftime.rb +176 -2
  82. data/lib/puppet/functions/then.rb +65 -2
  83. data/lib/puppet/functions/tree_each.rb +19 -19
  84. data/lib/puppet/functions/type.rb +42 -1
  85. data/lib/puppet/functions/unique.rb +13 -13
  86. data/lib/puppet/functions/unwrap.rb +8 -4
  87. data/lib/puppet/functions/values.rb +25 -0
  88. data/lib/puppet/functions/versioncmp.rb +1 -1
  89. data/lib/puppet/functions/warning.rb +1 -1
  90. data/lib/puppet/functions/with.rb +6 -4
  91. data/lib/puppet/functions/yaml_data.rb +3 -1
  92. data/lib/puppet/indirector/certificate_status/file.rb +1 -1
  93. data/lib/puppet/indirector/facts/facter.rb +1 -3
  94. data/lib/puppet/indirector/facts/rest.rb +21 -0
  95. data/lib/puppet/indirector/facts/yaml.rb +0 -4
  96. data/lib/puppet/indirector/rest.rb +2 -2
  97. data/lib/puppet/module.rb +3 -3
  98. data/lib/puppet/module/task.rb +2 -3
  99. data/lib/puppet/module_tool/applications/application.rb +4 -4
  100. data/lib/puppet/module_tool/applications/builder.rb +2 -2
  101. data/lib/puppet/module_tool/applications/checksummer.rb +3 -3
  102. data/lib/puppet/module_tool/applications/unpacker.rb +2 -2
  103. data/lib/puppet/module_tool/metadata.rb +3 -3
  104. data/lib/puppet/network/authconfig.rb +1 -1
  105. data/lib/puppet/network/format_support.rb +1 -1
  106. data/lib/puppet/network/formats.rb +5 -7
  107. data/lib/puppet/network/http/api/indirected_routes.rb +1 -0
  108. data/lib/puppet/network/http/api/master/v3/environment.rb +2 -2
  109. data/lib/puppet/network/http/api/master/v3/environments.rb +2 -2
  110. data/lib/puppet/network/http/error.rb +3 -3
  111. data/lib/puppet/network/resolver.rb +1 -2
  112. data/lib/puppet/parser/compiler.rb +12 -5
  113. data/lib/puppet/parser/compiler/catalog_validator/env_relationship_validator.rb +1 -1
  114. data/lib/puppet/parser/functions/fqdn_rand.rb +15 -4
  115. data/lib/puppet/parser/functions/new.rb +31 -46
  116. data/lib/puppet/parser/parser_factory.rb +1 -1
  117. data/lib/puppet/parser/resource.rb +1 -1
  118. data/lib/puppet/parser/type_loader.rb +11 -11
  119. data/lib/puppet/pops/evaluator/closure.rb +1 -1
  120. data/lib/puppet/pops/evaluator/collector_transformer.rb +1 -1
  121. data/lib/puppet/pops/evaluator/epp_evaluator.rb +2 -2
  122. data/lib/puppet/pops/evaluator/runtime3_resource_support.rb +2 -2
  123. data/lib/puppet/pops/evaluator/runtime3_support.rb +5 -2
  124. data/lib/puppet/pops/functions/dispatch.rb +1 -1
  125. data/lib/puppet/pops/issue_reporter.rb +18 -1
  126. data/lib/puppet/pops/issues.rb +6 -3
  127. data/lib/puppet/pops/loader/ruby_data_type_instantiator.rb +1 -2
  128. data/lib/puppet/pops/loader/ruby_function_instantiator.rb +1 -2
  129. data/lib/puppet/pops/loader/task_instantiator.rb +5 -5
  130. data/lib/puppet/pops/loader/type_definition_instantiator.rb +4 -1
  131. data/lib/puppet/pops/loaders.rb +18 -7
  132. data/lib/puppet/pops/lookup/global_data_provider.rb +1 -1
  133. data/lib/puppet/pops/lookup/lookup_adapter.rb +55 -6
  134. data/lib/puppet/pops/model/factory.rb +6 -3
  135. data/lib/puppet/pops/model/model_tree_dumper.rb +4 -0
  136. data/lib/puppet/pops/model/pn_transformer.rb +400 -0
  137. data/lib/puppet/pops/parser/egrammar.ra +1 -1
  138. data/lib/puppet/pops/parser/eparser.rb +1 -1
  139. data/lib/puppet/pops/parser/heredoc_support.rb +1 -1
  140. data/lib/puppet/pops/parser/lexer_support.rb +3 -2
  141. data/lib/puppet/pops/parser/locator.rb +0 -2
  142. data/lib/puppet/pops/parser/pn_parser.rb +316 -0
  143. data/lib/puppet/pops/pcore.rb +17 -17
  144. data/lib/puppet/pops/pn.rb +236 -0
  145. data/lib/puppet/pops/serialization/json.rb +7 -7
  146. data/lib/puppet/pops/types/class_loader.rb +6 -3
  147. data/lib/puppet/pops/types/implementation_registry.rb +28 -35
  148. data/lib/puppet/pops/types/p_object_type.rb +3 -3
  149. data/lib/puppet/pops/types/p_timespan_type.rb +2 -2
  150. data/lib/puppet/pops/types/p_type_set_type.rb +24 -1
  151. data/lib/puppet/pops/types/ruby_generator.rb +3 -4
  152. data/lib/puppet/pops/types/type_calculator.rb +1 -1
  153. data/lib/puppet/pops/types/type_factory.rb +0 -4
  154. data/lib/puppet/pops/types/type_mismatch_describer.rb +1 -1
  155. data/lib/puppet/pops/types/type_parser.rb +14 -7
  156. data/lib/puppet/pops/types/types.rb +1 -1
  157. data/lib/puppet/pops/utils.rb +2 -2
  158. data/lib/puppet/pops/validation/checker4_0.rb +6 -2
  159. data/lib/puppet/provider/group/groupadd.rb +3 -1
  160. data/lib/puppet/provider/group/windows_adsi.rb +4 -7
  161. data/lib/puppet/provider/nameservice.rb +3 -3
  162. data/lib/puppet/provider/package/pacman.rb +4 -4
  163. data/lib/puppet/provider/package/pip.rb +3 -3
  164. data/lib/puppet/provider/package/pkgdmg.rb +3 -3
  165. data/lib/puppet/provider/package/pkgutil.rb +2 -2
  166. data/lib/puppet/provider/package/portage.rb +9 -9
  167. data/lib/puppet/provider/package/zypper.rb +2 -2
  168. data/lib/puppet/provider/service/base.rb +1 -1
  169. data/lib/puppet/provider/service/smf.rb +3 -2
  170. data/lib/puppet/provider/service/systemd.rb +1 -1
  171. data/lib/puppet/provider/user/useradd.rb +6 -2
  172. data/lib/puppet/provider/user/windows_adsi.rb +1 -1
  173. data/lib/puppet/provider/yumrepo/inifile.rb +20 -9
  174. data/lib/puppet/provider/zfs/zfs.rb +1 -1
  175. data/lib/puppet/reference/configuration.rb +2 -0
  176. data/lib/puppet/reference/type.rb +11 -11
  177. data/lib/puppet/resource.rb +1 -1
  178. data/lib/puppet/resource/capability_finder.rb +5 -5
  179. data/lib/puppet/resource/catalog.rb +6 -3
  180. data/lib/puppet/resource/status.rb +9 -2
  181. data/lib/puppet/resource/type.rb +1 -1
  182. data/lib/puppet/settings.rb +31 -19
  183. data/lib/puppet/settings/base_setting.rb +5 -0
  184. data/lib/puppet/settings/config_file.rb +1 -1
  185. data/lib/puppet/settings/ttl_setting.rb +5 -0
  186. data/lib/puppet/ssl/certificate_factory.rb +2 -2
  187. data/lib/puppet/ssl/certificate_request.rb +0 -2
  188. data/lib/puppet/syntax_checkers/json.rb +1 -1
  189. data/lib/puppet/transaction/additional_resource_generator.rb +2 -2
  190. data/lib/puppet/transaction/event.rb +1 -1
  191. data/lib/puppet/transaction/report.rb +18 -12
  192. data/lib/puppet/type.rb +9 -13
  193. data/lib/puppet/type/augeas.rb +2 -2
  194. data/lib/puppet/type/cron.rb +11 -6
  195. data/lib/puppet/type/exec.rb +1 -1
  196. data/lib/puppet/type/file.rb +4 -5
  197. data/lib/puppet/type/host.rb +1 -1
  198. data/lib/puppet/type/k5login.rb +30 -54
  199. data/lib/puppet/type/package.rb +3 -3
  200. data/lib/puppet/type/schedule.rb +12 -12
  201. data/lib/puppet/type/scheduled_task.rb +2 -2
  202. data/lib/puppet/type/ssh_authorized_key.rb +5 -5
  203. data/lib/puppet/type/sshkey.rb +2 -2
  204. data/lib/puppet/type/tidy.rb +1 -1
  205. data/lib/puppet/type/user.rb +1 -1
  206. data/lib/puppet/type/yumrepo.rb +26 -5
  207. data/lib/puppet/util.rb +0 -4
  208. data/lib/puppet/util/backups.rb +1 -1
  209. data/lib/puppet/util/inifile.rb +3 -4
  210. data/lib/puppet/util/json.rb +68 -0
  211. data/lib/puppet/util/json_lockfile.rb +3 -3
  212. data/lib/puppet/util/log.rb +2 -5
  213. data/lib/puppet/util/log/destinations.rb +2 -2
  214. data/lib/puppet/util/network_device/cisco/facts.rb +1 -1
  215. data/lib/puppet/util/plist.rb +1 -1
  216. data/lib/puppet/util/reference.rb +1 -8
  217. data/lib/puppet/util/tagging.rb +1 -1
  218. data/lib/puppet/util/warnings.rb +0 -2
  219. data/lib/puppet/util/windows/adsi.rb +15 -18
  220. data/lib/puppet/util/windows/com.rb +2 -1
  221. data/lib/puppet/util/windows/file.rb +2 -2
  222. data/lib/puppet/util/windows/principal.rb +7 -6
  223. data/lib/puppet/util/windows/sid.rb +60 -7
  224. data/lib/puppet/util/windows/taskscheduler.rb +0 -9
  225. data/lib/puppet/version.rb +1 -1
  226. data/lib/puppet_pal.rb +53 -48
  227. data/locales/ja/puppet.po +1357 -912
  228. data/locales/puppet.pot +549 -466
  229. data/man/man5/puppet.conf.5 +103 -20
  230. data/man/man8/puppet-agent.8 +6 -2
  231. data/man/man8/puppet-apply.8 +2 -2
  232. data/man/man8/puppet-ca.8 +1 -1
  233. data/man/man8/puppet-catalog.8 +1 -1
  234. data/man/man8/puppet-cert.8 +1 -1
  235. data/man/man8/puppet-certificate.8 +1 -1
  236. data/man/man8/puppet-certificate_request.8 +1 -1
  237. data/man/man8/puppet-certificate_revocation_list.8 +1 -1
  238. data/man/man8/puppet-config.8 +35 -1
  239. data/man/man8/puppet-describe.8 +1 -1
  240. data/man/man8/puppet-device.8 +33 -11
  241. data/man/man8/puppet-doc.8 +1 -1
  242. data/man/man8/puppet-epp.8 +34 -12
  243. data/man/man8/puppet-facts.8 +50 -1
  244. data/man/man8/puppet-filebucket.8 +38 -11
  245. data/man/man8/puppet-generate.8 +1 -1
  246. data/man/man8/puppet-help.8 +1 -1
  247. data/man/man8/puppet-key.8 +1 -1
  248. data/man/man8/puppet-lookup.8 +1 -1
  249. data/man/man8/puppet-man.8 +10 -4
  250. data/man/man8/puppet-master.8 +1 -1
  251. data/man/man8/puppet-module.8 +15 -6
  252. data/man/man8/puppet-node.8 +1 -1
  253. data/man/man8/puppet-parser.8 +31 -8
  254. data/man/man8/puppet-plugin.8 +1 -1
  255. data/man/man8/puppet-report.8 +1 -1
  256. data/man/man8/puppet-resource.8 +1 -1
  257. data/man/man8/puppet-script.8 +67 -0
  258. data/man/man8/puppet-status.8 +1 -1
  259. data/man/man8/puppet.8 +3 -3
  260. data/spec/fixtures/unit/pops/binder/bindings_composer/ok/modules/awesome2/lib/puppet_x/awesome2/echo_scheme_handler.rb +1 -1
  261. data/spec/integration/application/apply_spec.rb +15 -15
  262. data/spec/integration/application/lookup_spec.rb +21 -0
  263. data/spec/integration/faces/config_spec.rb +16 -4
  264. data/spec/integration/network/http/api/indirected_routes_spec.rb +5 -5
  265. data/spec/integration/parser/catalog_spec.rb +1 -1
  266. data/spec/integration/parser/collection_spec.rb +2 -2
  267. data/spec/integration/parser/compiler_spec.rb +17 -18
  268. data/spec/integration/parser/pcore_resource_spec.rb +2 -2
  269. data/spec/integration/parser/scope_spec.rb +2 -2
  270. data/spec/integration/ssl/certificate_authority_spec.rb +7 -7
  271. data/spec/integration/ssl/certificate_revocation_list_spec.rb +1 -1
  272. data/spec/integration/ssl/key_spec.rb +1 -1
  273. data/spec/integration/transaction/report_spec.rb +3 -3
  274. data/spec/integration/transaction_spec.rb +0 -1
  275. data/spec/integration/type/file_spec.rb +10 -11
  276. data/spec/integration/type_spec.rb +1 -2
  277. data/spec/integration/util/windows/adsi_spec.rb +86 -1
  278. data/spec/integration/util/windows/principal_spec.rb +11 -2
  279. data/spec/integration/util/windows/security_spec.rb +2 -2
  280. data/spec/lib/matchers/json.rb +4 -4
  281. data/spec/lib/puppet_spec/language.rb +34 -35
  282. data/spec/lib/puppet_spec/module_tool/shared_functions.rb +2 -2
  283. data/spec/shared_behaviours/file_server_terminus.rb +0 -2
  284. data/spec/shared_behaviours/things_that_declare_options.rb +2 -2
  285. data/spec/spec_helper.rb +1 -1
  286. data/spec/unit/application/cert_spec.rb +21 -9
  287. data/spec/unit/application/device_spec.rb +96 -2
  288. data/spec/unit/application/face_base_spec.rb +2 -2
  289. data/spec/unit/application/lookup_spec.rb +0 -1
  290. data/spec/unit/configurer_spec.rb +14 -0
  291. data/spec/unit/confine_spec.rb +16 -0
  292. data/spec/unit/data_providers/hiera_data_provider_spec.rb +4 -4
  293. data/spec/unit/datatypes_spec.rb +49 -0
  294. data/spec/unit/environments_spec.rb +7 -0
  295. data/spec/unit/face/config_spec.rb +116 -12
  296. data/spec/unit/face/epp_face_spec.rb +53 -2
  297. data/spec/unit/face/facts_spec.rb +53 -0
  298. data/spec/unit/face/help_spec.rb +62 -69
  299. data/spec/unit/face/man_spec.rb +26 -0
  300. data/spec/unit/face/module/list_spec.rb +0 -1
  301. data/spec/unit/face/parser_spec.rb +78 -0
  302. data/spec/unit/file_bucket/dipper_spec.rb +0 -4
  303. data/spec/unit/file_serving/content_spec.rb +0 -1
  304. data/spec/unit/file_serving/fileset_spec.rb +0 -1
  305. data/spec/unit/file_serving/metadata_spec.rb +0 -1
  306. data/spec/unit/file_serving/terminus_selector_spec.rb +0 -2
  307. data/spec/unit/forge_spec.rb +1 -2
  308. data/spec/unit/functions/assert_type_spec.rb +1 -1
  309. data/spec/unit/functions/empty_spec.rb +77 -0
  310. data/spec/unit/functions/epp_spec.rb +1 -1
  311. data/spec/unit/functions/flatten_spec.rb +31 -0
  312. data/spec/unit/functions/include_spec.rb +2 -2
  313. data/spec/unit/functions/inline_epp_spec.rb +1 -1
  314. data/spec/unit/functions/join_spec.rb +33 -0
  315. data/spec/unit/functions/keys_spec.rb +31 -0
  316. data/spec/unit/functions/length_spec.rb +50 -0
  317. data/spec/unit/functions/lookup_fixture_spec.rb +1 -1
  318. data/spec/unit/functions/lookup_spec.rb +52 -0
  319. data/spec/unit/functions/shared.rb +1 -1
  320. data/spec/unit/functions/values_spec.rb +30 -0
  321. data/spec/unit/functions/versioncmp_spec.rb +1 -1
  322. data/spec/unit/functions4_spec.rb +30 -32
  323. data/spec/unit/graph/title_hash_prioritizer_spec.rb +2 -1
  324. data/spec/unit/indirector/catalog/compiler_spec.rb +0 -15
  325. data/spec/unit/indirector/facts/rest_spec.rb +45 -0
  326. data/spec/unit/indirector/facts/yaml_spec.rb +6 -0
  327. data/spec/unit/indirector/file_bucket_file/file_spec.rb +2 -2
  328. data/spec/unit/indirector/indirection_spec.rb +1 -1
  329. data/spec/unit/indirector/node/ldap_spec.rb +2 -2
  330. data/spec/unit/indirector/request_spec.rb +0 -2
  331. data/spec/unit/indirector/rest_spec.rb +2 -2
  332. data/spec/unit/indirector_spec.rb +0 -1
  333. data/spec/unit/info_service_spec.rb +1 -1
  334. data/spec/unit/interface/action_manager_spec.rb +1 -1
  335. data/spec/unit/interface/action_spec.rb +1 -1
  336. data/spec/unit/module_spec.rb +0 -5
  337. data/spec/unit/module_tool/applications/builder_spec.rb +1 -1
  338. data/spec/unit/module_tool/applications/unpacker_spec.rb +4 -4
  339. data/spec/unit/network/formats_spec.rb +5 -13
  340. data/spec/unit/network/http/api/indirected_routes_spec.rb +6 -2
  341. data/spec/unit/network/http/connection_spec.rb +1 -1
  342. data/spec/unit/network/http/handler_spec.rb +3 -2
  343. data/spec/unit/node/environment_spec.rb +1 -1
  344. data/spec/unit/node_spec.rb +3 -3
  345. data/spec/unit/parser/compiler_spec.rb +9 -2
  346. data/spec/unit/parser/environment_compiler_spec.rb +8 -8
  347. data/spec/unit/parser/functions/create_resources_spec.rb +1 -1
  348. data/spec/unit/parser/functions/fail_spec.rb +1 -1
  349. data/spec/unit/parser/functions/fqdn_rand_spec.rb +24 -0
  350. data/spec/unit/parser/functions/realize_spec.rb +1 -1
  351. data/spec/unit/parser/resource_spec.rb +0 -1
  352. data/spec/unit/parser/scope_spec.rb +3 -3
  353. data/spec/unit/parser/type_loader_spec.rb +1 -1
  354. data/spec/unit/pops/adaptable_spec.rb +0 -1
  355. data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +0 -3
  356. data/spec/unit/pops/evaluator/runtime3_converter_spec.rb +0 -4
  357. data/spec/unit/pops/factory_rspec_helper.rb +1 -1
  358. data/spec/unit/pops/factory_spec.rb +5 -5
  359. data/spec/unit/pops/issues_spec.rb +23 -8
  360. data/spec/unit/pops/loaders/loaders_spec.rb +24 -2
  361. data/spec/unit/pops/loaders/static_loader_spec.rb +1 -1
  362. data/spec/unit/pops/lookup/interpolation_spec.rb +5 -0
  363. data/spec/unit/pops/lookup/lookup_spec.rb +56 -0
  364. data/spec/unit/pops/model/pn_transformer_spec.rb +53 -0
  365. data/spec/unit/pops/parser/lexer2_spec.rb +14 -5
  366. data/spec/unit/pops/parser/parse_basic_expressions_spec.rb +9 -9
  367. data/spec/unit/pops/parser/parse_calls_spec.rb +1 -1
  368. data/spec/unit/pops/parser/parse_functions_spec.rb +1 -1
  369. data/spec/unit/pops/parser/parse_heredoc_spec.rb +3 -3
  370. data/spec/unit/pops/parser/parse_lambda_spec.rb +1 -1
  371. data/spec/unit/pops/parser/parse_resource_spec.rb +35 -35
  372. data/spec/unit/pops/parser/pn_parser_spec.rb +101 -0
  373. data/spec/unit/pops/pn_spec.rb +148 -0
  374. data/spec/unit/pops/types/iterable_spec.rb +1 -1
  375. data/spec/unit/pops/types/p_object_type_spec.rb +5 -5
  376. data/spec/unit/pops/types/p_timespan_type_spec.rb +11 -4
  377. data/spec/unit/pops/types/p_timestamp_type_spec.rb +9 -2
  378. data/spec/unit/pops/types/p_type_set_type_spec.rb +106 -2
  379. data/spec/unit/pops/types/ruby_generator_spec.rb +3 -8
  380. data/spec/unit/pops/types/string_converter_spec.rb +3 -3
  381. data/spec/unit/pops/types/type_calculator_spec.rb +1 -1
  382. data/spec/unit/pops/validator/validator_spec.rb +3 -1
  383. data/spec/unit/property_spec.rb +2 -2
  384. data/spec/unit/provider/aixobject_spec.rb +1 -1
  385. data/spec/unit/provider/cron/crontab_spec.rb +3 -3
  386. data/spec/unit/provider/exec/posix_spec.rb +6 -6
  387. data/spec/unit/provider/group/groupadd_spec.rb +4 -4
  388. data/spec/unit/provider/group/windows_adsi_spec.rb +79 -22
  389. data/spec/unit/provider/ldap_spec.rb +0 -1
  390. data/spec/unit/provider/nameservice_spec.rb +5 -5
  391. data/spec/unit/provider/package/rpm_spec.rb +3 -4
  392. data/spec/unit/provider/package/yum_spec.rb +6 -2
  393. data/spec/unit/provider/parsedfile_spec.rb +1 -1
  394. data/spec/unit/provider/service/base_spec.rb +2 -4
  395. data/spec/unit/provider/service/init_spec.rb +2 -2
  396. data/spec/unit/provider/service/openrc_spec.rb +2 -2
  397. data/spec/unit/provider/service/redhat_spec.rb +2 -2
  398. data/spec/unit/provider/service/smf_spec.rb +2 -0
  399. data/spec/unit/provider/service/systemd_spec.rb +3 -3
  400. data/spec/unit/provider/service/upstart_spec.rb +7 -7
  401. data/spec/unit/provider/ssh_authorized_key/parsed_spec.rb +0 -4
  402. data/spec/unit/provider/sshkey/parsed_spec.rb +0 -2
  403. data/spec/unit/provider/user/useradd_spec.rb +15 -9
  404. data/spec/unit/provider/user/windows_adsi_spec.rb +4 -4
  405. data/spec/unit/provider/yumrepo/inifile_spec.rb +76 -0
  406. data/spec/unit/puppet_pal_2pec.rb +4 -5
  407. data/spec/unit/resource/catalog_spec.rb +8 -3
  408. data/spec/unit/resource/status_spec.rb +15 -4
  409. data/spec/unit/resource/type_spec.rb +2 -3
  410. data/spec/unit/settings_spec.rb +9 -4
  411. data/spec/unit/ssl/certificate_authority_spec.rb +1 -9
  412. data/spec/unit/ssl/certificate_request_spec.rb +1 -2
  413. data/spec/unit/transaction/report_spec.rb +41 -0
  414. data/spec/unit/transaction_spec.rb +1 -1
  415. data/spec/unit/type/exec_spec.rb +7 -9
  416. data/spec/unit/type/file/selinux_spec.rb +0 -1
  417. data/spec/unit/type/file_spec.rb +4 -3
  418. data/spec/unit/type/k5login_spec.rb +79 -10
  419. data/spec/unit/type/mount_spec.rb +1 -1
  420. data/spec/unit/type/nagios_spec.rb +6 -6
  421. data/spec/unit/type/user_spec.rb +1 -1
  422. data/spec/unit/type/yumrepo_spec.rb +18 -0
  423. data/spec/unit/type/zfs_spec.rb +1 -1
  424. data/spec/unit/type_spec.rb +14 -15
  425. data/spec/unit/util/docs_spec.rb +1 -1
  426. data/spec/unit/util/execution_spec.rb +0 -1
  427. data/spec/unit/util/inifile_spec.rb +35 -4
  428. data/spec/unit/util/log/destinations_spec.rb +2 -2
  429. data/spec/unit/util/log_spec.rb +6 -5
  430. data/spec/unit/util/network_device/cisco/device_spec.rb +2 -2
  431. data/spec/unit/util/plist_spec.rb +3 -3
  432. data/spec/unit/util/selinux_spec.rb +2 -2
  433. data/spec/unit/util/tagging_spec.rb +1 -7
  434. data/spec/unit/util/windows/adsi_spec.rb +31 -27
  435. data/spec/unit/util/windows/sid_spec.rb +86 -15
  436. data/spec/unit/util_spec.rb +2 -2
  437. data/spec/watchr.rb +0 -1
  438. data/tasks/benchmark.rake +37 -0
  439. data/tasks/manpages.rake +1 -1
  440. metadata +71 -11
  441. checksums.yaml +0 -7
@@ -1,4 +1,4 @@
1
- require 'json'
1
+ require 'puppet/util/json'
2
2
 
3
3
  module PuppetSpec
4
4
  module ModuleTool
@@ -15,7 +15,7 @@ module PuppetSpec
15
15
  moddir = File.join(options[:into], name)
16
16
  FileUtils.mkdir_p(moddir)
17
17
  File.open(File.join(moddir, 'metadata.json'), 'w') do |file|
18
- file.puts(JSON.generate(release.metadata))
18
+ file.puts(Puppet::Util::Json.dump(release.metadata))
19
19
  end
20
20
  end
21
21
 
@@ -34,8 +34,6 @@ shared_examples_for "Puppet::Indirector::FileServerTerminus" do
34
34
  @modules.stubs(:find).returns(nil)
35
35
  @terminus.indirection.stubs(:terminus).with(:modules).returns(@modules)
36
36
 
37
- path = File.join(@path, "myfile")
38
-
39
37
  expect(@terminus.find(@request)).to be_instance_of(@test_class)
40
38
  end
41
39
  end
@@ -87,8 +87,8 @@ shared_examples_for "things that declare options" do
87
87
  it "should detect conflicts between #{base.inspect} and #{conflict.inspect}" do
88
88
  expect {
89
89
  add_options_to do
90
- option *base
91
- option *conflict
90
+ option(*base)
91
+ option(*conflict)
92
92
  end
93
93
  }.to raise_error ArgumentError, /conflicts with existing option/
94
94
  end
@@ -27,7 +27,7 @@ require 'rspec/collection_matchers'
27
27
 
28
28
  # So everyone else doesn't have to include this base constant.
29
29
  module PuppetSpec
30
- FIXTURE_DIR = File.join(dir = File.expand_path(File.dirname(__FILE__)), "fixtures") unless defined?(FIXTURE_DIR)
30
+ FIXTURE_DIR = File.join(File.expand_path(File.dirname(__FILE__)), "fixtures") unless defined?(FIXTURE_DIR)
31
31
  end
32
32
 
33
33
  require 'pathname'
@@ -191,9 +191,9 @@ describe Puppet::Application::Cert => true do
191
191
  @cert_app.subcommand = :destroy
192
192
  @cert_app.command_line.stubs(:args).returns(["unsigned-node"])
193
193
 
194
- Puppet::SSL::CertificateAuthority::Interface.expects(:new).returns(@iface).with { |cert_mode,to| cert_mode == :destroy
195
- to[:to] == ["unsigned-node"]
196
- }
194
+ Puppet::SSL::CertificateAuthority::Interface.unstub(:new)
195
+ Puppet::SSL::CertificateAuthority::Interface.expects(:new).with(:revoke, anything).never
196
+ Puppet::SSL::CertificateAuthority::Interface.expects(:new).with(:destroy, {:to => ['unsigned-node'], :digest => nil}).returns(@iface)
197
197
 
198
198
  @cert_app.main
199
199
  end
@@ -202,17 +202,29 @@ describe Puppet::Application::Cert => true do
202
202
  @cert_app.subcommand = :destroy
203
203
  @cert_app.command_line.stubs(:args).returns(["host","unsigned-node"])
204
204
 
205
- Puppet::SSL::CertificateAuthority::Interface.expects(:new).returns(@iface).with { |cert_mode,to|
206
- cert_mode == :revoke
205
+ Puppet::SSL::CertificateAuthority::Interface.expects(:new).returns(@iface).with do |cert_mode,to|
206
+ cert_mode == :revoke &&
207
207
  to[:to] == ["host"]
208
- }
209
- Puppet::SSL::CertificateAuthority::Interface.expects(:new).returns(@iface).with { |cert_mode,to|
210
- cert_mode == :destroy
208
+ end
209
+ Puppet::SSL::CertificateAuthority::Interface.expects(:new).returns(@iface).with do |cert_mode,to|
210
+ cert_mode == :destroy &&
211
211
  to[:to] == ["host","unsigned-node"]
212
- }
212
+ end
213
213
 
214
214
  @cert_app.main
215
215
  end
216
+
217
+ it "should refuse to destroy all certificates" do
218
+ @cert_app.subcommand = :destroy
219
+ @cert_app.all = true
220
+
221
+ Puppet::SSL::CertificateAuthority::Interface.unstub(:new)
222
+ Puppet::SSL::CertificateAuthority::Interface.expects(:new).never
223
+
224
+ Puppet.expects(:log_exception).with {|e| e.message == "Refusing to destroy all certs, provide an explicit list of certs to destroy"}
225
+
226
+ expect { @cert_app.main }.to exit_with(24)
227
+ end
216
228
  end
217
229
 
218
230
  describe "when identifying subcommands" do
@@ -5,6 +5,7 @@ require 'puppet/application/device'
5
5
  require 'puppet/util/network_device/config'
6
6
  require 'ostruct'
7
7
  require 'puppet/configurer'
8
+ require 'puppet/application/apply'
8
9
 
9
10
  describe Puppet::Application::Device do
10
11
  include PuppetSpec::Files
@@ -127,6 +128,18 @@ describe Puppet::Application::Device do
127
128
  expect(@device.args[:Port]).to eq("42")
128
129
  end
129
130
 
131
+ it "should store the target options with --target" do
132
+ @device.options.expects(:[]=).with(:target,'test123')
133
+
134
+ @device.handle_target('test123')
135
+ end
136
+
137
+ it "should store the resource options with --resource" do
138
+ @device.options.expects(:[]=).with(:resource,true)
139
+
140
+ @device.handle_resource(true)
141
+ end
142
+
130
143
  end
131
144
 
132
145
  describe "during setup" do
@@ -277,7 +290,11 @@ describe Puppet::Application::Device do
277
290
  Puppet.stubs(:notice)
278
291
  @device.options.stubs(:[]).with(:detailed_exitcodes).returns(false)
279
292
  @device.options.stubs(:[]).with(:target).returns(nil)
293
+ @device.options.stubs(:[]).with(:apply).returns(nil)
294
+ @device.options.stubs(:[]).with(:resource).returns(false)
295
+ @device.options.stubs(:[]).with(:to_yaml).returns(false)
280
296
  @device.options.stubs(:[]).with(:client)
297
+ @device.command_line.stubs(:args).returns([])
281
298
  Puppet::Util::NetworkDevice::Config.stubs(:devices).returns({})
282
299
  end
283
300
 
@@ -286,6 +303,12 @@ describe Puppet::Application::Device do
286
303
  @device.run_command
287
304
  end
288
305
 
306
+ it "should exit if resource is requested without target" do
307
+ @device.options.stubs(:[]).with(:resource).returns(true)
308
+ Puppet.expects(:err).with "resource command requires target"
309
+ expect { @device.main }.to exit_with 1
310
+ end
311
+
289
312
  it "should get the device list" do
290
313
  device_hash = stub_everything 'device hash'
291
314
  Puppet::Util::NetworkDevice::Config.expects(:devices).returns(device_hash)
@@ -301,8 +324,8 @@ describe Puppet::Application::Device do
301
324
  }
302
325
 
303
326
  Puppet::Util::NetworkDevice::Config.expects(:devices).returns(device_hash)
304
- Puppet.expects(:info).with("starting applying configuration to device1 at ssh://testhost")
305
- Puppet.expects(:info).with("starting applying configuration to device2 at https://testhost:443/some/path").never
327
+ URI.expects(:parse).with("ssh://user:pass@testhost")
328
+ URI.expects(:parse).with("https://user:pass@testhost/some/path").never
306
329
  expect { @device.main }.to exit_with 1
307
330
  end
308
331
 
@@ -318,6 +341,32 @@ describe Puppet::Application::Device do
318
341
  expect { @device.main }.to exit_with 1
319
342
  end
320
343
 
344
+ it "should error if target is passed and the apply path is incorrect" do
345
+ @device.options.stubs(:[]).with(:apply).returns('file.pp')
346
+ @device.options.stubs(:[]).with(:target).returns('device1')
347
+
348
+ File.expects(:file?).returns(false)
349
+ Puppet.expects(:err).with(regexp_matches(/does not exist, cannot apply/))
350
+ expect { @device.main }.to exit_with 1
351
+ end
352
+
353
+ it "should run an apply" do
354
+ @device.options.stubs(:[]).with(:apply).returns('file.pp')
355
+ @device.options.stubs(:[]).with(:target).returns('device1')
356
+ device_hash = {
357
+ "device1" => OpenStruct.new(:name => "device1", :url => "ssh://user:pass@testhost", :provider => "cisco"),
358
+ }
359
+ Puppet::Util::NetworkDevice::Config.expects(:devices).returns(device_hash)
360
+ Puppet::Util::NetworkDevice.stubs(:init)
361
+ File.expects(:file?).returns(true)
362
+
363
+ Puppet::Util::CommandLine.expects(:new).once
364
+ Puppet::Application::Apply.expects(:new).once
365
+
366
+ Puppet::Configurer.expects(:new).never
367
+ expect { @device.main }.to exit_with 1
368
+ end
369
+
321
370
  it "should exit if the device list is empty" do
322
371
  expect { @device.main }.to exit_with 1
323
372
  end
@@ -356,6 +405,51 @@ describe Puppet::Application::Device do
356
405
  expect { @device.main }.to exit_with 1
357
406
  end
358
407
 
408
+ it "should raise an error if no type is given" do
409
+ @device.options.stubs(:[]).with(:resource).returns(true)
410
+ @device.options.stubs(:[]).with(:target).returns('device1')
411
+ @device.command_line.stubs(:args).returns([])
412
+ Puppet.expects(:log_exception).with {|e| e.message == "You must specify the type to display"}
413
+ expect { @device.main }.to exit_with 1
414
+ end
415
+
416
+ it "should raise an error if the type is not found" do
417
+ @device.options.stubs(:[]).with(:resource).returns(true)
418
+ @device.options.stubs(:[]).with(:target).returns('device1')
419
+ @device.command_line.stubs(:args).returns(['nope'])
420
+ Puppet.expects(:log_exception).with {|e| e.message == "Could not find type nope"}
421
+ expect { @device.main }.to exit_with 1
422
+ end
423
+
424
+ it "should retrieve all resources of a type" do
425
+ @device.options.stubs(:[]).with(:resource).returns(true)
426
+ @device.options.stubs(:[]).with(:target).returns('device1')
427
+ @device.command_line.stubs(:args).returns(['user'])
428
+ Puppet::Resource.indirection.expects(:search).with('user/', {}).returns([])
429
+ expect { @device.main }.to exit_with 1
430
+ end
431
+
432
+ it "should retrieve named resources of a type" do
433
+ @device.options.stubs(:[]).with(:resource).returns(true)
434
+ @device.options.stubs(:[]).with(:target).returns('device1')
435
+ @device.command_line.stubs(:args).returns(['user', 'title'])
436
+ Puppet::Resource.indirection.expects(:find).with('user/title')
437
+ expect { @device.main }.to exit_with 1
438
+ end
439
+
440
+ it "should output resources as YAML" do
441
+ resources = [
442
+ Puppet::Type.type(:user).new(:name => "title").to_resource,
443
+ ]
444
+ @device.options.stubs(:[]).with(:resource).returns(true)
445
+ @device.options.stubs(:[]).with(:target).returns('device1')
446
+ @device.options.stubs(:[]).with(:to_yaml).returns(true)
447
+ @device.command_line.stubs(:args).returns(['user'])
448
+ Puppet::Resource.indirection.expects(:search).with('user/', {}).returns(resources)
449
+ @device.expects(:puts).with("user:\n title:\n")
450
+ expect { @device.main }.to exit_with 1
451
+ end
452
+
359
453
  it "should make sure all the required folders and files are created" do
360
454
  Puppet.settings.expects(:use).with(:main, :agent, :ssl).twice
361
455
  expect { @device.main }.to exit_with 1
@@ -343,7 +343,7 @@ describe Puppet::Application::FaceBase do
343
343
 
344
344
  it "should render a non-trivially-keyed Hash with using pretty printed JSON" do
345
345
  hash = { [1,2] => 3, [2,3] => 5, [3,4] => 7 }
346
- expect(app.render(hash, {})).to eq(JSON.pretty_generate(hash).chomp)
346
+ expect(app.render(hash, {})).to eq(Puppet::Util::Json.dump(hash, :pretty => true).chomp)
347
347
  end
348
348
 
349
349
  it "should render a {String,Numeric}-keyed Hash into a table" do
@@ -356,7 +356,7 @@ describe Puppet::Application::FaceBase do
356
356
  expect(app.render(hash, {})).to eq <<EOT
357
357
  5 5
358
358
  6.0 6
359
- four #{object.to_json.chomp}
359
+ four #{Puppet::Util::Json.dump(object).chomp}
360
360
  one 1
361
361
  three {}
362
362
  two []
@@ -89,7 +89,6 @@ describe Puppet::Application::Lookup do
89
89
  end
90
90
  end
91
91
 
92
-
93
92
  context 'when given a valid configuration' do
94
93
  let (:lookup) { Puppet::Application[:lookup] }
95
94
 
@@ -352,6 +352,13 @@ describe Puppet::Configurer do
352
352
  expect(@agent.run).to be_nil
353
353
  end
354
354
 
355
+ it "should record the time it took to apply the catalog" do
356
+ report = Puppet::Transaction::Report.new
357
+ @catalog.stubs(:apply).with(:report => report)
358
+ report.expects(:add_times).with(:catalog_application, kind_of(Numeric))
359
+ @agent.apply_catalog(@catalog, {:report => report})
360
+ end
361
+
355
362
  it "should refetch the catalog if the server specifies a new environment in the catalog" do
356
363
  catalog = Puppet::Resource::Catalog.new("tester", Puppet::Node::Environment.remote('second_env'))
357
364
  @agent.expects(:retrieve_catalog).returns(catalog).twice
@@ -930,6 +937,13 @@ describe Puppet::Configurer do
930
937
 
931
938
  @agent.convert_catalog(catalog, 10)
932
939
  end
940
+
941
+ it "should set catalog conversion time on the report" do
942
+ report = Puppet::Transaction::Report.new
943
+
944
+ report.expects(:add_times).with(:convert_catalog, kind_of(Numeric))
945
+ @agent.convert_catalog(catalog, 10, {:report => report})
946
+ end
933
947
  end
934
948
 
935
949
  describe "when determining whether to pluginsync" do
@@ -74,4 +74,20 @@ describe Puppet::Confine do
74
74
  expect(@confine.result).to eq([true, false, true, false])
75
75
  end
76
76
  end
77
+
78
+ describe "when requiring" do
79
+ it "does not cache failed requires when always_retry_plugins is true" do
80
+ Puppet[:always_retry_plugins] = true
81
+ Puppet::Confine.expects(:require).with('puppet/confine/osfamily').twice.raises(LoadError)
82
+ Puppet::Confine.test(:osfamily)
83
+ Puppet::Confine.test(:osfamily)
84
+ end
85
+
86
+ it "caches failed requires when always_retry_plugins is false" do
87
+ Puppet[:always_retry_plugins] = false
88
+ Puppet::Confine.expects(:require).with('puppet/confine/osfamily').once.raises(LoadError)
89
+ Puppet::Confine.test(:osfamily)
90
+ Puppet::Confine.test(:osfamily)
91
+ end
92
+ end
77
93
  end
@@ -201,7 +201,7 @@ describe "when using a hiera data provider" do
201
201
  it 'will report config path (original and resolved), data path (original and resolved), and interpolation (before and after)' do
202
202
  compile('hiera_misc', '$target_scope = "with scope"') do |compiler|
203
203
  lookup_invocation = Puppet::Pops::Lookup::Invocation.new(compiler.topscope, {}, {}, true)
204
- value = Puppet::Pops::Lookup.lookup('km_scope', nil, nil, nil, nil, lookup_invocation)
204
+ Puppet::Pops::Lookup.lookup('km_scope', nil, nil, nil, nil, lookup_invocation)
205
205
  expect(lookup_invocation.explainer.explain).to include(<<-EOS)
206
206
  Path "#{environmentpath}/hiera_misc/data/common.yaml"
207
207
  Original path: "common.yaml"
@@ -216,7 +216,7 @@ describe "when using a hiera data provider" do
216
216
  it 'will report that merge options was found in the lookup_options hash' do
217
217
  compile('hiera_misc', '$target_scope = "with scope"') do |compiler|
218
218
  lookup_invocation = Puppet::Pops::Lookup::Invocation.new(compiler.topscope, {}, {}, true)
219
- value = Puppet::Pops::Lookup.lookup('one::loptsm_test::hash', nil, nil, nil, nil, lookup_invocation)
219
+ Puppet::Pops::Lookup.lookup('one::loptsm_test::hash', nil, nil, nil, nil, lookup_invocation)
220
220
  expect(lookup_invocation.explainer.explain).to include("Using merge options from \"lookup_options\" hash")
221
221
  end
222
222
  end
@@ -224,7 +224,7 @@ describe "when using a hiera data provider" do
224
224
  it 'will report lookup_options details in combination with details of found value' do
225
225
  compile('hiera_misc', '$target_scope = "with scope"') do |compiler|
226
226
  lookup_invocation = Puppet::Pops::Lookup::Invocation.new(compiler.topscope, {}, {}, Puppet::Pops::Lookup::Explainer.new(true))
227
- value = Puppet::Pops::Lookup.lookup('one::loptsm_test::hash', nil, nil, nil, nil, lookup_invocation)
227
+ Puppet::Pops::Lookup.lookup('one::loptsm_test::hash', nil, nil, nil, nil, lookup_invocation)
228
228
  expect(lookup_invocation.explainer.explain).to eq(<<EOS)
229
229
  Searching for "lookup_options"
230
230
  Global Data Provider (hiera configuration version 5)
@@ -314,7 +314,7 @@ EOS
314
314
  it 'will report config path (original and resolved), data path (original and resolved), and interpolation (before and after)' do
315
315
  compile('hiera_misc', '$target_scope = "with scope"') do |compiler|
316
316
  lookup_invocation = Puppet::Pops::Lookup::Invocation.new(compiler.topscope, {}, {}, Puppet::Pops::Lookup::Explainer.new(true, true))
317
- value = Puppet::Pops::Lookup.lookup('one::loptsm_test::hash', nil, nil, nil, nil, lookup_invocation)
317
+ Puppet::Pops::Lookup.lookup('one::loptsm_test::hash', nil, nil, nil, nil, lookup_invocation)
318
318
  expect(lookup_invocation.explainer.explain).to eq(<<EOS)
319
319
  Merge strategy hash
320
320
  Global Data Provider (hiera configuration version 5)
@@ -229,6 +229,55 @@ describe "Puppet::DataTypes" do
229
229
  end
230
230
  end
231
231
 
232
+ context 'when creating type with custom new_function' do
233
+ let(:datatypes) {
234
+ {
235
+ 'mytest.rb' => <<-RUBY.unindent,
236
+ Puppet::DataTypes.create_type('Mytest') do
237
+ interface <<-PUPPET
238
+ attributes => {
239
+ strings => { type => Array[String] },
240
+ ints => { type => Array[Integer] },
241
+ }
242
+ PUPPET
243
+
244
+ implementation_class PuppetSpec::DataTypes::MyTest
245
+ end
246
+ RUBY
247
+ }
248
+ }
249
+
250
+ before(:each) do
251
+ class ::PuppetSpec::DataTypes::MyTest
252
+ def self.create_new_function(t)
253
+ Puppet::Functions.create_function('new_%s' % t.name) do
254
+ dispatch :create do
255
+ repeated_param 'Variant[String,Integer]', :args
256
+ end
257
+
258
+ def create(*args)
259
+ ::PuppetSpec::DataTypes::MyTest.new(*args.partition { |arg| arg.is_a?(String) })
260
+ end
261
+ end
262
+ end
263
+ attr_reader :strings, :ints
264
+
265
+ def initialize(strings, ints)
266
+ @strings = strings
267
+ @ints = ints
268
+ end
269
+ end
270
+ end
271
+
272
+ after(:each) do
273
+ ::PuppetSpec::DataTypes.send(:remove_const, :MyTest)
274
+ end
275
+
276
+ it 'loads and calls custom new function' do
277
+ expect(eval_and_collect_notices('notice(Mytest("A", 32, "B", 20).ints)', node)).to eql(['[32, 20]'])
278
+ end
279
+ end
280
+
232
281
  context 'with data type and class defined in a module' do
233
282
  let(:mytest_classes) {
234
283
  {
@@ -421,6 +421,13 @@ config_version=$vardir/random/scripts
421
421
  expect(loader.get_conf(:doesnotexist)).to be_nil
422
422
  end
423
423
 
424
+ it "gets the conf environment_timeout if one is specified" do
425
+ Puppet[:environment_timeout] = 8675
426
+ conf = loader.get_conf(:static1)
427
+
428
+ expect(conf.environment_timeout).to eq(8675)
429
+ end
430
+
424
431
  context "that are private" do
425
432
  let(:private_env) { Puppet::Node::Environment.create(:private, []) }
426
433
  let(:loader) { Puppet::Environments::StaticPrivate.new(private_env) }
@@ -2,46 +2,117 @@
2
2
  require 'spec_helper'
3
3
  require 'puppet/face'
4
4
 
5
- module PuppetFaceSpecs
5
+ module PuppetFaceSpecs
6
6
  describe Puppet::Face[:config, '0.0.1'] do
7
7
 
8
+ let(:config) { described_class }
9
+
10
+ def render(action, result)
11
+ config.get_action(action).when_rendering(:console).call(result)
12
+ end
13
+
8
14
  FS = Puppet::FileSystem
9
15
 
16
+ before :each do
17
+ subject.stubs(:warn_default_section)
18
+ subject.stubs(:report_section_and_environment)
19
+ end
20
+
10
21
  it "prints a single setting without the name" do
11
22
  Puppet[:trace] = true
12
23
 
13
- expect { subject.print("trace") }.to have_printed('true')
24
+ result = subject.print("trace")
25
+ expect(render(:print, result)).to eq("true\n")
14
26
  end
15
27
 
16
28
  it "prints multiple settings with the names" do
17
29
  Puppet[:trace] = true
18
30
  Puppet[:syslogfacility] = "file"
19
31
 
20
- expect { subject.print("trace", "syslogfacility") }.to have_printed(<<-OUTPUT)
32
+ result = subject.print("trace", "syslogfacility")
33
+ expect(render(:print, result)).to eq(<<-OUTPUT)
21
34
  syslogfacility = file
22
35
  trace = true
23
36
  OUTPUT
24
37
  end
25
38
 
39
+ it "prints environment_timeout=unlimited correctly" do
40
+ Puppet[:environment_timeout] = "unlimited"
41
+
42
+ result = subject.print("environment_timeout")
43
+ expect(render(:print, result)).to eq("unlimited\n")
44
+ end
45
+
46
+ it "prints arrays correctly" do
47
+ pending "Still doesn't print arrays like they would appear in config"
48
+ Puppet[:server_list] = %w{server1 server2}
49
+
50
+ result = subject.print("server_list")
51
+ expect(render(:print, result)).to eq("server1, server2\n")
52
+ end
53
+
26
54
  it "prints the setting from the selected section" do
27
55
  Puppet.settings.parse_config(<<-CONF)
28
56
  [user]
29
57
  syslogfacility = file
30
58
  CONF
31
59
 
32
- expect { subject.print("syslogfacility", :section => "user") }.to have_printed('file')
60
+ result = subject.print("syslogfacility", :section => "user")
61
+ expect(render(:print, result)).to eq("file\n")
33
62
  end
34
63
 
35
- it "defaults to all when no arguments are given" do
36
- subject.expects(:puts).times(Puppet.settings.to_a.length)
64
+ it "prints the section and environment, and not a warning, when a section is given" do
65
+ Puppet.settings.parse_config(<<-CONF)
66
+ [user]
67
+ syslogfacility = file
68
+ CONF
37
69
 
38
- subject.print
70
+ subject.expects(:warn_default_section).never
71
+ subject.expects(:report_section_and_environment).once
72
+
73
+ result = subject.print("syslogfacility", :section => "user")
74
+ expect(render(:print, result)).to eq("file\n")
75
+ end
76
+
77
+ it "prints a warning and the section and environment when no section is given" do
78
+ Puppet[:trace] = true
79
+
80
+ subject.expects(:warn_default_section).once
81
+ subject.expects(:report_section_and_environment).once
82
+
83
+ result = subject.print("trace")
84
+ expect(render(:print, result)).to eq("true\n")
85
+ end
86
+
87
+ it "defaults to all when no arguments are given" do
88
+ result = subject.print
89
+ expect(render(:print, result).lines.to_a.length).to eq(Puppet.settings.to_a.length)
39
90
  end
40
91
 
41
92
  it "prints out all of the settings when asked for 'all'" do
42
- subject.expects(:puts).times(Puppet.settings.to_a.length)
93
+ result = subject.print('all')
94
+ expect(render(:print, result).lines.to_a.length).to eq(Puppet.settings.to_a.length)
95
+ end
96
+
97
+ it "stringifies all keys for network format handlers to consume" do
98
+ Puppet[:syslogfacility] = "file"
99
+
100
+ result = subject.print
101
+ expect(result["syslogfacility"]).to eq("file")
102
+ expect(result.keys).to all(be_a(String))
103
+ end
104
+
105
+ it "stringifies multiple keys for network format handlers to consume" do
106
+ Puppet[:trace] = true
107
+ Puppet[:syslogfacility] = "file"
108
+
109
+ expect(subject.print("trace", "syslogfacility")).to eq({"syslogfacility" => "file", "trace" => true})
110
+ end
111
+
112
+ it "stringifies single key for network format handlers to consume" do
113
+ Puppet[:trace] = true
43
114
 
44
- subject.print('all')
115
+ expect(subject.print("trace")).to eq({"trace" => true})
45
116
  end
46
117
 
47
118
  context "when setting config values" do
@@ -53,6 +124,18 @@ trace = true
53
124
  Puppet::FileSystem.stubs(:touch)
54
125
  end
55
126
 
127
+ it "prints the section and environment when no section is given" do
128
+ Puppet::FileSystem.stubs(:open).with(path, anything, anything).yields(StringIO.new)
129
+ subject.expects(:report_section_and_environment).once
130
+ subject.set('foo', 'bar')
131
+ end
132
+
133
+ it "prints the section and environment when a section is given" do
134
+ Puppet::FileSystem.stubs(:open).with(path, anything, anything).yields(StringIO.new)
135
+ subject.expects(:report_section_and_environment).once
136
+ subject.set('foo', 'bar', {:section => "baz"})
137
+ end
138
+
56
139
  it "writes to the correct puppet config file" do
57
140
  Puppet::FileSystem.expects(:open).with(path, anything, anything)
58
141
  subject.set('foo', 'bar')
@@ -84,6 +167,21 @@ trace = true
84
167
  subject.set('foo', 'bar', {:section => "baz"})
85
168
  end
86
169
 
170
+ it "does not duplicate an existing default section when a section is not specified" do
171
+ contents = <<-CONF
172
+ [main]
173
+ myport = 4444
174
+ CONF
175
+
176
+ myfile = StringIO.new(contents)
177
+ Puppet::FileSystem.stubs(:open).with(path, anything, anything).yields(myfile)
178
+
179
+ subject.set('foo', 'bar')
180
+
181
+ expect(myfile.string).to match(/foo = bar/)
182
+ expect(myfile.string).not_to match(/main.*main/)
183
+ end
184
+
87
185
  it "opens the file with UTF-8 encoding" do
88
186
  Puppet::FileSystem.expects(:open).with(path, nil, 'r+:UTF-8')
89
187
  subject.set('foo', 'bar')
@@ -152,7 +250,9 @@ trace = true
152
250
  ])
153
251
  ) do
154
252
  args = "environmentpath","manifest","modulepath","environment","basemodulepath"
155
- expect { subject.print(*add_section_option(args, section)) }.to have_printed(<<-OUTPUT)
253
+
254
+ result = subject.print(*add_section_option(args, section))
255
+ expect(render(:print, result)).to eq(<<-OUTPUT)
156
256
  basemodulepath = #{File.expand_path("/some/base")}
157
257
  environment = production
158
258
  environmentpath = #{File.expand_path("/dev/null/environments")}
@@ -173,7 +273,9 @@ modulepath = #{File.expand_path("/dev/null/environments/production/modules")}#{F
173
273
  ])
174
274
  ) do
175
275
  args = "environmentpath","manifest","modulepath","environment","basemodulepath"
176
- expect { subject.print(*add_section_option(args, section)) }.to have_printed(<<-OUTPUT)
276
+
277
+ result = subject.print(*add_section_option(args, section))
278
+ expect(render(:print, result)).to eq(<<-OUTPUT)
177
279
  basemodulepath = #{File.expand_path("/some/base")}
178
280
  environment = production
179
281
  environmentpath = #{File.expand_path("/dev/null/environments")}
@@ -192,7 +294,9 @@ modulepath = #{File.expand_path("/custom/modules")}#{File::PATH_SEPARATOR}#{File
192
294
  ])
193
295
  ) do
194
296
  args = "environmentpath","manifest","modulepath","environment","basemodulepath"
195
- expect { subject.print(*add_section_option(args, section)) }.to have_printed(<<-OUTPUT)
297
+
298
+ result = subject.print(*add_section_option(args, section))
299
+ expect(render(:print, result)).to eq(<<-OUTPUT)
196
300
  basemodulepath = #{File.expand_path("/some/base")}
197
301
  environment = doesnotexist
198
302
  environmentpath = #{File.expand_path("/dev/null/environments")}