puppet 3.4.3 → 3.5.0.rc1

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 (811) hide show
  1. data/CONTRIBUTING.md +6 -6
  2. data/Gemfile +22 -16
  3. data/LICENSE +1 -1
  4. data/README.md +33 -11
  5. data/Rakefile +1 -1
  6. data/conf/auth.conf +4 -0
  7. data/ext/build_defaults.yaml +1 -1
  8. data/ext/debian/control +6 -6
  9. data/ext/ips/transforms +1 -1
  10. data/ext/nagios/naggen +1 -1
  11. data/ext/project_data.yaml +21 -1
  12. data/ext/puppet-test +3 -3
  13. data/ext/redhat/puppet.spec.erb +28 -2
  14. data/ext/suse/puppet.spec +1 -1
  15. data/ext/upload_facts.rb +1 -1
  16. data/ext/windows/service/daemon.rb +99 -20
  17. data/lib/hiera_puppet.rb +2 -2
  18. data/lib/puppet.rb +68 -5
  19. data/lib/puppet/agent.rb +5 -1
  20. data/lib/puppet/application.rb +20 -11
  21. data/lib/puppet/application/agent.rb +1 -1
  22. data/lib/puppet/application/apply.rb +61 -41
  23. data/lib/puppet/application/cert.rb +3 -3
  24. data/lib/puppet/application/device.rb +7 -8
  25. data/lib/puppet/application/doc.rb +1 -1
  26. data/lib/puppet/application/filebucket.rb +3 -3
  27. data/lib/puppet/application/kick.rb +2 -2
  28. data/lib/puppet/application/master.rb +1 -1
  29. data/lib/puppet/application/queue.rb +9 -9
  30. data/lib/puppet/application/resource.rb +2 -2
  31. data/lib/puppet/bindings.rb +6 -6
  32. data/lib/puppet/configurer.rb +17 -14
  33. data/lib/puppet/configurer/fact_handler.rb +1 -1
  34. data/lib/puppet/confine/any.rb +26 -0
  35. data/lib/puppet/confine/exists.rb +1 -1
  36. data/lib/puppet/confiner.rb +1 -0
  37. data/lib/puppet/context.rb +55 -0
  38. data/lib/puppet/context/trusted_information.rb +56 -0
  39. data/lib/puppet/defaults.rb +97 -26
  40. data/lib/puppet/environments.rb +187 -0
  41. data/lib/puppet/error.rb +2 -1
  42. data/lib/puppet/external/pson/common.rb +1 -1
  43. data/lib/puppet/external/pson/pure/generator.rb +1 -1
  44. data/lib/puppet/external/pson/pure/parser.rb +1 -1
  45. data/lib/puppet/face/config.rb +73 -15
  46. data/lib/puppet/face/file/store.rb +1 -1
  47. data/lib/puppet/face/help.rb +2 -1
  48. data/lib/puppet/face/help/action.erb +1 -0
  49. data/lib/puppet/face/help/face.erb +1 -0
  50. data/lib/puppet/face/help/global.erb +1 -0
  51. data/lib/puppet/face/help/man.erb +9 -8
  52. data/lib/puppet/face/module/list.rb +13 -7
  53. data/lib/puppet/face/node/clean.rb +2 -2
  54. data/lib/puppet/face/parser.rb +11 -5
  55. data/lib/puppet/face/status.rb +1 -1
  56. data/lib/puppet/feature/external_facts.rb +2 -2
  57. data/lib/puppet/feature/libuser.rb +1 -1
  58. data/lib/puppet/feature/msgpack.rb +2 -0
  59. data/lib/puppet/feature/rails.rb +2 -2
  60. data/lib/puppet/file_bucket/dipper.rb +9 -9
  61. data/lib/puppet/file_bucket/file.rb +9 -5
  62. data/lib/puppet/file_serving/base.rb +1 -1
  63. data/lib/puppet/file_serving/configuration.rb +1 -1
  64. data/lib/puppet/file_serving/configuration/parser.rb +3 -3
  65. data/lib/puppet/file_serving/content.rb +2 -2
  66. data/lib/puppet/file_serving/fileset.rb +4 -4
  67. data/lib/puppet/file_serving/metadata.rb +69 -15
  68. data/lib/puppet/file_serving/mount/file.rb +1 -1
  69. data/lib/puppet/file_system.rb +361 -1
  70. data/lib/puppet/file_system/file18.rb +3 -3
  71. data/lib/puppet/file_system/file19.rb +3 -3
  72. data/lib/puppet/file_system/file19windows.rb +18 -23
  73. data/lib/puppet/file_system/file_impl.rb +145 -0
  74. data/lib/puppet/file_system/memory_file.rb +23 -9
  75. data/lib/puppet/file_system/memory_impl.rb +64 -0
  76. data/lib/puppet/forge.rb +4 -3
  77. data/lib/puppet/forge/repository.rb +0 -1
  78. data/lib/puppet/graph/relationship_graph.rb +7 -7
  79. data/lib/puppet/indirector.rb +1 -0
  80. data/lib/puppet/indirector/catalog/compiler.rb +3 -30
  81. data/lib/puppet/indirector/catalog/msgpack.rb +6 -0
  82. data/lib/puppet/indirector/catalog/static_compiler.rb +3 -7
  83. data/lib/puppet/indirector/data_binding/hiera.rb +1 -1
  84. data/lib/puppet/indirector/direct_file_server.rb +2 -2
  85. data/lib/puppet/indirector/exec.rb +1 -1
  86. data/lib/puppet/indirector/face.rb +3 -2
  87. data/lib/puppet/indirector/facts/facter.rb +1 -1
  88. data/lib/puppet/indirector/file_bucket_file/file.rb +25 -15
  89. data/lib/puppet/indirector/file_metadata/file.rb +1 -1
  90. data/lib/puppet/indirector/file_server.rb +1 -1
  91. data/lib/puppet/indirector/indirection.rb +1 -1
  92. data/lib/puppet/indirector/json.rb +4 -4
  93. data/lib/puppet/indirector/key/file.rb +8 -5
  94. data/lib/puppet/indirector/ldap.rb +1 -1
  95. data/lib/puppet/indirector/memory.rb +4 -0
  96. data/lib/puppet/indirector/msgpack.rb +82 -0
  97. data/lib/puppet/indirector/node/exec.rb +1 -1
  98. data/lib/puppet/indirector/node/ldap.rb +3 -3
  99. data/lib/puppet/indirector/node/msgpack.rb +7 -0
  100. data/lib/puppet/indirector/node/yaml.rb +15 -0
  101. data/lib/puppet/indirector/queue.rb +3 -2
  102. data/lib/puppet/indirector/report/msgpack.rb +11 -0
  103. data/lib/puppet/indirector/request.rb +17 -20
  104. data/lib/puppet/indirector/resource/rest.rb +1 -1
  105. data/lib/puppet/indirector/resource_type/parser.rb +3 -13
  106. data/lib/puppet/indirector/rest.rb +6 -7
  107. data/lib/puppet/indirector/ssl_file.rb +7 -7
  108. data/lib/puppet/indirector/yaml.rb +9 -13
  109. data/lib/puppet/metatype/manager.rb +12 -7
  110. data/lib/puppet/module.rb +14 -9
  111. data/lib/puppet/module_tool.rb +21 -26
  112. data/lib/puppet/module_tool/applications/application.rb +1 -1
  113. data/lib/puppet/module_tool/applications/generator.rb +2 -1
  114. data/lib/puppet/module_tool/applications/installer.rb +9 -4
  115. data/lib/puppet/module_tool/applications/uninstaller.rb +10 -7
  116. data/lib/puppet/module_tool/applications/unpacker.rb +1 -1
  117. data/lib/puppet/module_tool/applications/upgrader.rb +11 -8
  118. data/lib/puppet/module_tool/checksums.rb +1 -1
  119. data/lib/puppet/module_tool/contents_description.rb +2 -0
  120. data/lib/puppet/module_tool/dependency.rb +4 -5
  121. data/lib/puppet/module_tool/errors.rb +2 -0
  122. data/lib/puppet/module_tool/install_directory.rb +3 -0
  123. data/lib/puppet/module_tool/metadata.rb +3 -5
  124. data/lib/puppet/module_tool/modulefile.rb +3 -0
  125. data/lib/puppet/module_tool/shared_behaviors.rb +6 -1
  126. data/lib/puppet/module_tool/skeleton.rb +3 -0
  127. data/lib/puppet/module_tool/tar.rb +3 -0
  128. data/lib/puppet/network/auth_config_parser.rb +1 -1
  129. data/lib/puppet/network/authconfig.rb +5 -2
  130. data/lib/puppet/network/authentication.rb +7 -2
  131. data/lib/puppet/network/authorization.rb +2 -2
  132. data/lib/puppet/network/format_support.rb +4 -0
  133. data/lib/puppet/network/formats.rb +9 -14
  134. data/lib/puppet/network/http.rb +11 -0
  135. data/lib/puppet/network/http/api.rb +0 -2
  136. data/lib/puppet/network/http/api/v1.rb +146 -11
  137. data/lib/puppet/network/http/api/v2.rb +32 -0
  138. data/lib/puppet/network/http/api/v2/authorization.rb +13 -0
  139. data/lib/puppet/network/http/api/v2/environments.rb +21 -0
  140. data/lib/puppet/network/http/connection.rb +94 -37
  141. data/lib/puppet/network/http/error.rb +69 -0
  142. data/lib/puppet/network/http/handler.rb +28 -196
  143. data/lib/puppet/network/http/issues.rb +9 -0
  144. data/lib/puppet/network/http/memory_response.rb +13 -0
  145. data/lib/puppet/network/http/rack/rest.rb +10 -18
  146. data/lib/puppet/network/http/request.rb +56 -0
  147. data/lib/puppet/network/http/response.rb +11 -0
  148. data/lib/puppet/network/http/route.rb +91 -0
  149. data/lib/puppet/network/http/webrick.rb +1 -1
  150. data/lib/puppet/network/http/webrick/rest.rb +7 -12
  151. data/lib/puppet/network/http_pool.rb +3 -3
  152. data/lib/puppet/network/rights.rb +4 -4
  153. data/lib/puppet/node.rb +23 -14
  154. data/lib/puppet/node/environment.rb +149 -125
  155. data/lib/puppet/node/facts.rb +6 -5
  156. data/lib/puppet/parameter.rb +1 -1
  157. data/lib/puppet/parser/ast.rb +1 -1
  158. data/lib/puppet/parser/ast/block_expression.rb +1 -6
  159. data/lib/puppet/parser/ast/collexpr.rb +54 -2
  160. data/lib/puppet/parser/ast/lambda.rb +9 -0
  161. data/lib/puppet/parser/ast/leaf.rb +15 -0
  162. data/lib/puppet/parser/ast/pops_bridge.rb +168 -0
  163. data/lib/puppet/parser/code_merger.rb +13 -0
  164. data/lib/puppet/parser/collector.rb +1 -1
  165. data/lib/puppet/parser/compiler.rb +28 -30
  166. data/lib/puppet/parser/e4_parser_adapter.rb +81 -0
  167. data/lib/puppet/parser/e_parser_adapter.rb +0 -1
  168. data/lib/puppet/parser/files.rb +12 -7
  169. data/lib/puppet/parser/functions.rb +36 -29
  170. data/lib/puppet/parser/functions/collect.rb +1 -1
  171. data/lib/puppet/parser/functions/defined.rb +40 -16
  172. data/lib/puppet/parser/functions/each.rb +55 -41
  173. data/lib/puppet/parser/functions/epp.rb +41 -0
  174. data/lib/puppet/parser/functions/extlookup.rb +2 -2
  175. data/lib/puppet/parser/functions/file.rb +1 -1
  176. data/lib/puppet/parser/functions/filter.rb +68 -16
  177. data/lib/puppet/parser/functions/generate.rb +1 -1
  178. data/lib/puppet/parser/functions/include.rb +3 -2
  179. data/lib/puppet/parser/functions/inline_epp.rb +79 -0
  180. data/lib/puppet/parser/functions/inline_template.rb +1 -1
  181. data/lib/puppet/parser/functions/lookup.rb +127 -27
  182. data/lib/puppet/parser/functions/map.rb +64 -12
  183. data/lib/puppet/parser/functions/reduce.rb +40 -16
  184. data/lib/puppet/parser/functions/select.rb +1 -1
  185. data/lib/puppet/parser/functions/slice.rb +42 -23
  186. data/lib/puppet/parser/grammar.ra +3 -0
  187. data/lib/puppet/parser/lexer.rb +10 -9
  188. data/lib/puppet/parser/parser.rb +15 -12
  189. data/lib/puppet/parser/parser_factory.rb +26 -1
  190. data/lib/puppet/parser/parser_support.rb +13 -4
  191. data/lib/puppet/parser/resource.rb +1 -1
  192. data/lib/puppet/parser/scope.rb +246 -97
  193. data/lib/puppet/parser/templatewrapper.rb +1 -1
  194. data/lib/puppet/parser/type_loader.rb +13 -2
  195. data/lib/puppet/pops.rb +15 -1
  196. data/lib/puppet/pops/adapters.rb +64 -32
  197. data/lib/puppet/pops/binder/binder.rb +122 -150
  198. data/lib/puppet/pops/binder/binder_issues.rb +1 -21
  199. data/lib/puppet/pops/binder/bindings_checker.rb +0 -20
  200. data/lib/puppet/pops/binder/bindings_composer.rb +4 -70
  201. data/lib/puppet/pops/binder/bindings_factory.rb +16 -58
  202. data/lib/puppet/pops/binder/bindings_label_provider.rb +0 -3
  203. data/lib/puppet/pops/binder/bindings_loader.rb +13 -4
  204. data/lib/puppet/pops/binder/bindings_model.rb +17 -31
  205. data/lib/puppet/pops/binder/bindings_model_dumper.rb +2 -20
  206. data/lib/puppet/pops/binder/config/binder_config.rb +8 -40
  207. data/lib/puppet/pops/binder/config/binder_config_checker.rb +2 -43
  208. data/lib/puppet/pops/binder/config/issues.rb +1 -21
  209. data/lib/puppet/pops/binder/injector.rb +86 -7
  210. data/lib/puppet/pops/binder/injector_entry.rb +6 -2
  211. data/lib/puppet/pops/binder/key_factory.rb +7 -1
  212. data/lib/puppet/pops/binder/lookup.rb +191 -0
  213. data/lib/puppet/pops/binder/producers.rb +5 -5
  214. data/lib/puppet/pops/binder/scheme_handler/symbolic_scheme.rb +2 -3
  215. data/lib/puppet/pops/binder/system_bindings.rb +4 -16
  216. data/lib/puppet/pops/containment.rb +72 -5
  217. data/lib/puppet/pops/evaluator/access_operator.rb +548 -0
  218. data/lib/puppet/pops/evaluator/closure.rb +57 -0
  219. data/lib/puppet/pops/evaluator/compare_operator.rb +168 -0
  220. data/lib/puppet/pops/evaluator/epp_evaluator.rb +87 -0
  221. data/lib/puppet/pops/evaluator/evaluator_impl.rb +1069 -0
  222. data/lib/puppet/pops/evaluator/external_syntax_support.rb +49 -0
  223. data/lib/puppet/pops/evaluator/relationship_operator.rb +156 -0
  224. data/lib/puppet/pops/evaluator/runtime3_support.rb +489 -0
  225. data/lib/puppet/pops/issue_reporter.rb +8 -4
  226. data/lib/puppet/pops/issues.rb +199 -4
  227. data/lib/puppet/pops/label_provider.rb +5 -0
  228. data/lib/puppet/pops/model/ast_transformer.rb +55 -31
  229. data/lib/puppet/pops/model/ast_tree_dumper.rb +9 -1
  230. data/lib/puppet/pops/model/factory.rb +265 -111
  231. data/lib/puppet/pops/model/model.rb +179 -140
  232. data/lib/puppet/pops/model/model_label_provider.rb +38 -9
  233. data/lib/puppet/pops/model/model_tree_dumper.rb +38 -13
  234. data/lib/puppet/pops/parser/code_merger.rb +17 -0
  235. data/lib/puppet/pops/parser/egrammar.ra +110 -61
  236. data/lib/puppet/pops/parser/eparser.rb +1415 -1092
  237. data/lib/puppet/pops/parser/epp_parser.rb +51 -0
  238. data/lib/puppet/pops/parser/epp_support.rb +247 -0
  239. data/lib/puppet/pops/parser/evaluating_parser.rb +53 -15
  240. data/lib/puppet/pops/parser/heredoc_support.rb +139 -0
  241. data/lib/puppet/pops/parser/interpolation_support.rb +227 -0
  242. data/lib/puppet/pops/parser/lexer.rb +83 -192
  243. data/lib/puppet/pops/parser/lexer2.rb +684 -0
  244. data/lib/puppet/pops/parser/lexer_support.rb +107 -0
  245. data/lib/puppet/pops/parser/locatable.rb +23 -0
  246. data/lib/puppet/pops/parser/locator.rb +291 -0
  247. data/lib/puppet/pops/parser/makefile +1 -8
  248. data/lib/puppet/pops/parser/parser_support.rb +76 -48
  249. data/lib/puppet/pops/parser/slurp_support.rb +95 -0
  250. data/lib/puppet/pops/patterns.rb +13 -4
  251. data/lib/puppet/pops/types/class_loader.rb +2 -2
  252. data/lib/puppet/pops/types/enumeration.rb +34 -0
  253. data/lib/puppet/pops/types/type_calculator.rb +983 -58
  254. data/lib/puppet/pops/types/type_factory.rb +203 -15
  255. data/lib/puppet/pops/types/type_parser.rb +355 -12
  256. data/lib/puppet/pops/types/types.rb +314 -24
  257. data/lib/puppet/pops/utils.rb +23 -7
  258. data/lib/puppet/pops/validation.rb +14 -8
  259. data/lib/puppet/pops/validation/checker3_1.rb +17 -12
  260. data/lib/puppet/pops/validation/checker4_0.rb +514 -0
  261. data/lib/puppet/pops/validation/validator_factory_4_0.rb +31 -0
  262. data/lib/puppet/pops/visitor.rb +146 -4
  263. data/lib/puppet/property.rb +1 -1
  264. data/lib/puppet/property/ensure.rb +1 -1
  265. data/lib/puppet/provider.rb +47 -26
  266. data/lib/puppet/provider/aixobject.rb +3 -3
  267. data/lib/puppet/provider/augeas/augeas.rb +11 -11
  268. data/lib/puppet/provider/cron/crontab.rb +10 -1
  269. data/lib/puppet/provider/exec.rb +1 -1
  270. data/lib/puppet/provider/exec/posix.rb +1 -1
  271. data/lib/puppet/provider/exec/windows.rb +1 -1
  272. data/lib/puppet/provider/file/posix.rb +2 -2
  273. data/lib/puppet/provider/file/windows.rb +15 -9
  274. data/lib/puppet/provider/group/aix.rb +2 -2
  275. data/lib/puppet/provider/macauthorization/macauthorization.rb +3 -3
  276. data/lib/puppet/provider/mount.rb +7 -0
  277. data/lib/puppet/provider/mount/parsed.rb +0 -1
  278. data/lib/puppet/provider/naginator.rb +1 -1
  279. data/lib/puppet/provider/nameservice.rb +3 -3
  280. data/lib/puppet/provider/nameservice/directoryservice.rb +3 -3
  281. data/lib/puppet/provider/package/aix.rb +1 -1
  282. data/lib/puppet/provider/package/appdmg.rb +1 -4
  283. data/lib/puppet/provider/package/apple.rb +1 -1
  284. data/lib/puppet/provider/package/apt.rb +1 -1
  285. data/lib/puppet/provider/package/blastwave.rb +1 -1
  286. data/lib/puppet/provider/package/fink.rb +1 -1
  287. data/lib/puppet/provider/package/gem.rb +3 -3
  288. data/lib/puppet/provider/package/openbsd.rb +6 -4
  289. data/lib/puppet/provider/package/pacman.rb +58 -5
  290. data/lib/puppet/provider/package/pip.rb +2 -2
  291. data/lib/puppet/provider/package/pkgdmg.rb +25 -10
  292. data/lib/puppet/provider/package/pkgin.rb +48 -23
  293. data/lib/puppet/provider/package/pkgutil.rb +1 -1
  294. data/lib/puppet/provider/package/ports.rb +1 -1
  295. data/lib/puppet/provider/package/portupgrade.rb +7 -7
  296. data/lib/puppet/provider/package/rpm.rb +16 -8
  297. data/lib/puppet/provider/package/windows.rb +1 -1
  298. data/lib/puppet/provider/package/windows/package.rb +1 -1
  299. data/lib/puppet/provider/parsedfile.rb +1 -1
  300. data/lib/puppet/provider/selboolean/getsetsebool.rb +1 -1
  301. data/lib/puppet/provider/selmodule/semodule.rb +5 -5
  302. data/lib/puppet/provider/service/base.rb +1 -1
  303. data/lib/puppet/provider/service/bsd.rb +3 -3
  304. data/lib/puppet/provider/service/daemontools.rb +20 -20
  305. data/lib/puppet/provider/service/debian.rb +1 -1
  306. data/lib/puppet/provider/service/freebsd.rb +3 -3
  307. data/lib/puppet/provider/service/gentoo.rb +2 -2
  308. data/lib/puppet/provider/service/init.rb +5 -5
  309. data/lib/puppet/provider/service/launchd.rb +4 -4
  310. data/lib/puppet/provider/service/redhat.rb +2 -2
  311. data/lib/puppet/provider/service/runit.rb +4 -4
  312. data/lib/puppet/provider/service/service.rb +3 -4
  313. data/lib/puppet/provider/service/smf.rb +1 -1
  314. data/lib/puppet/provider/service/src.rb +3 -3
  315. data/lib/puppet/provider/service/systemd.rb +4 -4
  316. data/lib/puppet/provider/service/upstart.rb +22 -7
  317. data/lib/puppet/provider/service/windows.rb +7 -7
  318. data/lib/puppet/provider/ssh_authorized_key/parsed.rb +3 -3
  319. data/lib/puppet/provider/user/aix.rb +5 -5
  320. data/lib/puppet/provider/user/directoryservice.rb +8 -5
  321. data/lib/puppet/provider/user/ldap.rb +1 -1
  322. data/lib/puppet/provider/user/pw.rb +1 -1
  323. data/lib/puppet/provider/user/user_role_add.rb +2 -2
  324. data/lib/puppet/provider/user/useradd.rb +19 -5
  325. data/lib/puppet/provider/yumrepo/inifile.rb +187 -0
  326. data/lib/puppet/provider/zone/solaris.rb +4 -4
  327. data/lib/puppet/rails.rb +16 -11
  328. data/lib/puppet/rails/benchmark.rb +1 -1
  329. data/lib/puppet/rails/resource.rb +5 -1
  330. data/lib/puppet/reference/configuration.rb +1 -1
  331. data/lib/puppet/reference/report.rb +1 -1
  332. data/lib/puppet/relationship.rb +10 -5
  333. data/lib/puppet/reports/http.rb +8 -2
  334. data/lib/puppet/reports/rrdgraph.rb +1 -1
  335. data/lib/puppet/reports/store.rb +3 -3
  336. data/lib/puppet/reports/tagmail.rb +4 -4
  337. data/lib/puppet/resource.rb +37 -44
  338. data/lib/puppet/resource/catalog.rb +18 -20
  339. data/lib/puppet/resource/status.rb +7 -6
  340. data/lib/puppet/resource/type.rb +6 -5
  341. data/lib/puppet/resource/type_collection.rb +2 -2
  342. data/lib/puppet/run.rb +9 -8
  343. data/lib/puppet/settings.rb +395 -244
  344. data/lib/puppet/settings/base_setting.rb +10 -4
  345. data/lib/puppet/settings/config_file.rb +81 -44
  346. data/lib/puppet/settings/directory_setting.rb +1 -2
  347. data/lib/puppet/settings/file_setting.rb +12 -5
  348. data/lib/puppet/settings/ini_file.rb +171 -0
  349. data/lib/puppet/ssl/base.rb +4 -0
  350. data/lib/puppet/ssl/certificate_authority.rb +16 -11
  351. data/lib/puppet/ssl/certificate_authority/interface.rb +3 -2
  352. data/lib/puppet/ssl/certificate_factory.rb +50 -5
  353. data/lib/puppet/ssl/certificate_request.rb +2 -2
  354. data/lib/puppet/ssl/certificate_request_attributes.rb +1 -1
  355. data/lib/puppet/ssl/certificate_revocation_list.rb +3 -1
  356. data/lib/puppet/ssl/host.rb +9 -8
  357. data/lib/puppet/ssl/inventory.rb +1 -1
  358. data/lib/puppet/ssl/key.rb +1 -1
  359. data/lib/puppet/ssl/validator/default_validator.rb +1 -1
  360. data/lib/puppet/status.rb +8 -7
  361. data/lib/puppet/test/test_helper.rb +35 -4
  362. data/lib/puppet/transaction/event.rb +6 -5
  363. data/lib/puppet/transaction/report.rb +10 -10
  364. data/lib/puppet/type.rb +1 -3
  365. data/lib/puppet/type/augeas.rb +2 -1
  366. data/lib/puppet/type/cron.rb +41 -11
  367. data/lib/puppet/type/exec.rb +5 -5
  368. data/lib/puppet/type/file.rb +42 -4
  369. data/lib/puppet/type/file/content.rb +5 -6
  370. data/lib/puppet/type/file/ensure.rb +3 -3
  371. data/lib/puppet/type/file/source.rb +12 -6
  372. data/lib/puppet/type/file/target.rb +5 -5
  373. data/lib/puppet/type/k5login.rb +4 -4
  374. data/lib/puppet/type/mount.rb +1 -1
  375. data/lib/puppet/type/package.rb +79 -3
  376. data/lib/puppet/type/resources.rb +34 -5
  377. data/lib/puppet/type/selboolean.rb +1 -1
  378. data/lib/puppet/type/selmodule.rb +1 -1
  379. data/lib/puppet/type/ssh_authorized_key.rb +2 -1
  380. data/lib/puppet/type/sshkey.rb +2 -1
  381. data/lib/puppet/type/tidy.rb +1 -1
  382. data/lib/puppet/type/user.rb +4 -1
  383. data/lib/puppet/type/yumrepo.rb +219 -344
  384. data/lib/puppet/type/zone.rb +15 -5
  385. data/lib/puppet/util.rb +14 -13
  386. data/lib/puppet/util/adsi.rb +19 -3
  387. data/lib/puppet/util/autoload.rb +27 -24
  388. data/lib/puppet/util/backups.rb +6 -6
  389. data/lib/puppet/util/checksums.rb +2 -2
  390. data/lib/puppet/util/classgen.rb +1 -1
  391. data/lib/puppet/util/colors.rb +4 -12
  392. data/lib/puppet/util/command_line.rb +2 -2
  393. data/lib/puppet/util/command_line/trollop.rb +3 -3
  394. data/lib/puppet/util/docs.rb +2 -2
  395. data/lib/puppet/util/errors.rb +8 -1
  396. data/lib/puppet/util/execution.rb +12 -5
  397. data/lib/puppet/util/filetype.rb +5 -5
  398. data/lib/puppet/util/inifile.rb +19 -4
  399. data/lib/puppet/util/instrumentation/data.rb +5 -0
  400. data/lib/puppet/util/instrumentation/indirection_probe.rb +6 -1
  401. data/lib/puppet/util/instrumentation/listener.rb +6 -1
  402. data/lib/puppet/util/json_lockfile.rb +4 -1
  403. data/lib/puppet/util/ldap/connection.rb +1 -1
  404. data/lib/puppet/util/lockfile.rb +10 -6
  405. data/lib/puppet/util/log.rb +6 -1
  406. data/lib/puppet/util/log/destinations.rb +2 -2
  407. data/lib/puppet/util/metric.rb +9 -4
  408. data/lib/puppet/util/nagios_maker.rb +26 -1
  409. data/lib/puppet/util/network_device.rb +1 -1
  410. data/lib/puppet/util/network_device/config.rb +1 -1
  411. data/lib/puppet/util/network_device/transport/ssh.rb +3 -3
  412. data/lib/puppet/util/plugins.rb +1 -1
  413. data/lib/puppet/util/profiler.rb +13 -1
  414. data/lib/puppet/util/pson.rb +1 -1
  415. data/lib/puppet/util/queue/stomp.rb +2 -2
  416. data/lib/puppet/util/rdoc.rb +1 -1
  417. data/lib/puppet/util/rdoc/generators/puppet_generator.rb +1 -1
  418. data/lib/puppet/util/rdoc/parser/puppet_parser_core.rb +19 -19
  419. data/lib/puppet/util/reference.rb +1 -1
  420. data/lib/puppet/util/resource_template.rb +1 -1
  421. data/lib/puppet/util/retryaction.rb +1 -1
  422. data/lib/puppet/util/selinux.rb +2 -2
  423. data/lib/puppet/util/storage.rb +3 -3
  424. data/lib/puppet/util/symbolic_file_mode.rb +1 -1
  425. data/lib/puppet/util/tag_set.rb +15 -3
  426. data/lib/puppet/util/tagging.rb +12 -17
  427. data/lib/puppet/util/watched_file.rb +1 -1
  428. data/lib/puppet/util/watcher.rb +1 -1
  429. data/lib/puppet/util/windows/error.rb +2 -2
  430. data/lib/puppet/util/windows/file.rb +20 -4
  431. data/lib/puppet/util/windows/registry.rb +2 -2
  432. data/lib/puppet/vendor/safe_yaml/CHANGES.md +1 -1
  433. data/lib/puppet/version.rb +1 -1
  434. data/lib/puppetx.rb +1 -21
  435. data/lib/puppetx/puppet/syntax_checker.rb +1 -1
  436. data/lib/puppetx/puppetlabs/syntax_checkers/json.rb +9 -11
  437. data/spec/fixtures/integration/node/environment/sitedir/00_a.pp +2 -0
  438. data/spec/fixtures/integration/node/environment/sitedir/01_b.pp +6 -0
  439. data/spec/fixtures/{unit/pops/binder/hiera2/yaml_backend/empty/common.yaml → integration/node/environment/sitedir/03_empty.pp} +0 -0
  440. data/spec/fixtures/integration/node/environment/sitedir/04_include.pp +2 -0
  441. data/spec/fixtures/integration/provider/cron/crontab/purged +8 -0
  442. data/spec/fixtures/releases/jamtur01-apache/lib/puppet/provider/a2mod/debian.rb +1 -1
  443. data/spec/fixtures/unit/pops/binder/bindings_composer/ok/binder_config.yaml +3 -12
  444. data/spec/fixtures/unit/pops/binder/bindings_composer/ok/lib/puppet/bindings/confdirtest.rb +10 -0
  445. data/spec/fixtures/unit/pops/binder/bindings_composer/ok/modules/awesome2/lib/puppet/bindings/awesome2/default.rb +20 -0
  446. data/spec/fixtures/unit/pops/binder/bindings_composer/ok/modules/{awesome/lib/puppetx/awesome → awesome2/lib/puppetx/awesome2}/echo_scheme_handler.rb +2 -2
  447. data/spec/fixtures/unit/pops/binder/bindings_composer/ok/modules/bad/lib/puppet/bindings/bad/default.rb +5 -0
  448. data/spec/fixtures/unit/pops/binder/bindings_composer/ok/modules/good/lib/puppet/bindings/good/default.rb +6 -0
  449. data/spec/fixtures/unit/pops/binder/config/binder_config/ok/binder_config.yaml +2 -2
  450. data/spec/fixtures/unit/provider/service/systemd/{list_units → list_units_services} +0 -1
  451. data/spec/integration/agent/logging_spec.rb +1 -1
  452. data/spec/integration/application/apply_spec.rb +78 -3
  453. data/spec/integration/application/doc_spec.rb +3 -2
  454. data/spec/integration/configurer_spec.rb +5 -3
  455. data/spec/integration/directory_environments_spec.rb +50 -0
  456. data/spec/integration/indirector/direct_file_server_spec.rb +1 -1
  457. data/spec/integration/indirector/file_content/file_server_spec.rb +4 -5
  458. data/spec/integration/network/authconfig_spec.rb +4 -4
  459. data/spec/integration/network/formats_spec.rb +1 -1
  460. data/spec/integration/node/environment_spec.rb +67 -15
  461. data/spec/integration/node/facts_spec.rb +1 -1
  462. data/spec/integration/node_spec.rb +1 -1
  463. data/spec/integration/parser/catalog_spec.rb +100 -60
  464. data/spec/integration/parser/compiler_spec.rb +102 -13
  465. data/spec/integration/parser/future_compiler_spec.rb +416 -0
  466. data/spec/integration/parser/parser_spec.rb +44 -105
  467. data/spec/integration/parser/scope_spec.rb +614 -528
  468. data/spec/integration/provider/cron/crontab_spec.rb +21 -0
  469. data/spec/integration/provider/mount_spec.rb +15 -2
  470. data/spec/integration/resource/catalog_spec.rb +1 -1
  471. data/spec/integration/resource/type_collection_spec.rb +3 -4
  472. data/spec/integration/ssl/autosign_spec.rb +1 -1
  473. data/spec/integration/ssl/certificate_revocation_list_spec.rb +1 -1
  474. data/spec/integration/ssl/host_spec.rb +1 -1
  475. data/spec/integration/transaction_spec.rb +13 -13
  476. data/spec/integration/type/exec_spec.rb +2 -2
  477. data/spec/integration/type/file_spec.rb +114 -41
  478. data/spec/integration/type/nagios_spec.rb +80 -0
  479. data/spec/integration/type/tidy_spec.rb +2 -2
  480. data/spec/integration/util/execution_spec.rb +17 -0
  481. data/spec/integration/util/rdoc/parser_spec.rb +1 -1
  482. data/spec/integration/util/settings_spec.rb +1 -1
  483. data/spec/integration/util/windows/security_spec.rb +27 -2
  484. data/spec/lib/matchers/include.rb +27 -0
  485. data/spec/lib/matchers/include_spec.rb +32 -0
  486. data/spec/lib/matchers/json.rb +135 -79
  487. data/spec/lib/matchers/match_tokens2.rb +74 -0
  488. data/spec/lib/matchers/resource.rb +35 -0
  489. data/spec/lib/puppet/indirector/indirector_testing/memory.rb +7 -0
  490. data/spec/lib/puppet/indirector/indirector_testing/msgpack.rb +6 -0
  491. data/spec/lib/puppet/indirector_testing.rb +12 -2
  492. data/spec/lib/puppet_spec/files.rb +1 -0
  493. data/spec/lib/puppet_spec/matchers.rb +5 -0
  494. data/spec/lib/puppet_spec/modules.rb +1 -1
  495. data/spec/lib/puppet_spec/scope.rb +14 -0
  496. data/spec/shared_behaviours/file_server_terminus.rb +2 -2
  497. data/spec/spec_helper.rb +47 -17
  498. data/spec/unit/agent_spec.rb +8 -1
  499. data/spec/unit/application/agent_spec.rb +5 -4
  500. data/spec/unit/application/apply_spec.rb +34 -15
  501. data/spec/unit/application/device_spec.rb +27 -32
  502. data/spec/unit/application/doc_spec.rb +4 -4
  503. data/spec/unit/application/filebucket_spec.rb +1 -1
  504. data/spec/unit/application/master_spec.rb +2 -2
  505. data/spec/unit/application_spec.rb +1 -1
  506. data/spec/unit/configurer/downloader_spec.rb +1 -1
  507. data/spec/unit/configurer/fact_handler_spec.rb +5 -16
  508. data/spec/unit/configurer_spec.rb +2 -2
  509. data/spec/unit/confine/exists_spec.rb +5 -5
  510. data/spec/unit/context/trusted_information_spec.rb +124 -0
  511. data/spec/unit/context_spec.rb +74 -0
  512. data/spec/unit/environments_spec.rb +126 -0
  513. data/spec/unit/face/config_spec.rb +31 -16
  514. data/spec/unit/face/module/build_spec.rb +1 -0
  515. data/spec/unit/face/module/install_spec.rb +21 -104
  516. data/spec/unit/face/module/list_spec.rb +52 -36
  517. data/spec/unit/face/module/uninstall_spec.rb +18 -25
  518. data/spec/unit/face/parser_spec.rb +39 -23
  519. data/spec/unit/file_bucket/dipper_spec.rb +2 -2
  520. data/spec/unit/file_serving/base_spec.rb +9 -13
  521. data/spec/unit/file_serving/configuration/parser_spec.rb +8 -2
  522. data/spec/unit/file_serving/configuration_spec.rb +7 -7
  523. data/spec/unit/file_serving/content_spec.rb +7 -12
  524. data/spec/unit/file_serving/fileset_spec.rb +49 -53
  525. data/spec/unit/file_serving/metadata_spec.rb +83 -32
  526. data/spec/unit/file_serving/mount/file_spec.rb +10 -10
  527. data/spec/unit/file_system/tempfile_spec.rb +3 -3
  528. data/spec/unit/file_system_spec.rb +508 -0
  529. data/spec/unit/forge/errors_spec.rb +1 -1
  530. data/spec/unit/forge/repository_spec.rb +1 -3
  531. data/spec/unit/hiera/scope_spec.rb +6 -2
  532. data/spec/unit/hiera_puppet_spec.rb +13 -6
  533. data/spec/unit/indirector/catalog/msgpack_spec.rb +12 -0
  534. data/spec/unit/indirector/catalog/static_compiler_spec.rb +42 -11
  535. data/spec/unit/indirector/direct_file_server_spec.rb +6 -6
  536. data/spec/unit/indirector/facts/facter_spec.rb +5 -5
  537. data/spec/unit/indirector/file_bucket_file/file_spec.rb +4 -4
  538. data/spec/unit/indirector/file_metadata/file_spec.rb +2 -2
  539. data/spec/unit/indirector/file_server_spec.rb +4 -4
  540. data/spec/unit/indirector/json_spec.rb +6 -6
  541. data/spec/unit/indirector/key/file_spec.rb +8 -8
  542. data/spec/unit/indirector/msgpack_spec.rb +191 -0
  543. data/spec/unit/indirector/node/active_record_spec.rb +1 -1
  544. data/spec/unit/indirector/node/ldap_spec.rb +16 -7
  545. data/spec/unit/indirector/node/msgpack_spec.rb +24 -0
  546. data/spec/unit/indirector/node/plain_spec.rb +1 -1
  547. data/spec/unit/indirector/queue_spec.rb +1 -1
  548. data/spec/unit/indirector/report/msgpack_spec.rb +28 -0
  549. data/spec/unit/indirector/request_spec.rb +16 -8
  550. data/spec/unit/indirector/rest_spec.rb +0 -4
  551. data/spec/unit/indirector/ssl_file_spec.rb +12 -11
  552. data/spec/unit/indirector/yaml_spec.rb +4 -4
  553. data/spec/unit/man_spec.rb +32 -0
  554. data/spec/unit/module_spec.rb +60 -46
  555. data/spec/unit/module_tool/applications/checksummer_spec.rb +1 -1
  556. data/spec/unit/module_tool/applications/installer_spec.rb +53 -16
  557. data/spec/unit/module_tool/applications/uninstaller_spec.rb +26 -25
  558. data/spec/unit/module_tool/tar_spec.rb +1 -1
  559. data/spec/unit/module_tool_spec.rb +17 -90
  560. data/spec/unit/network/authconfig_spec.rb +3 -4
  561. data/spec/unit/network/authentication_spec.rb +20 -6
  562. data/spec/unit/network/authorization_spec.rb +11 -1
  563. data/spec/unit/network/formats_spec.rb +32 -9
  564. data/spec/unit/network/http/api/v1_spec.rb +365 -62
  565. data/spec/unit/network/http/api/v2/authorization_spec.rb +57 -0
  566. data/spec/unit/network/http/api/v2/environments_spec.rb +42 -0
  567. data/spec/unit/network/http/api/v2_spec.rb +14 -0
  568. data/spec/unit/network/http/connection_spec.rb +39 -5
  569. data/spec/unit/network/http/error_spec.rb +30 -0
  570. data/spec/unit/network/http/handler_spec.rb +69 -419
  571. data/spec/unit/network/http/rack/rest_spec.rb +20 -28
  572. data/spec/unit/network/http/route_spec.rb +75 -0
  573. data/spec/unit/network/http/webrick/rest_spec.rb +21 -58
  574. data/spec/unit/network/http_pool_spec.rb +3 -3
  575. data/spec/unit/network/rights_spec.rb +2 -2
  576. data/spec/unit/node/environment_spec.rb +108 -89
  577. data/spec/unit/node/facts_spec.rb +5 -12
  578. data/spec/unit/node_spec.rb +22 -22
  579. data/spec/unit/parser/ast/collection_spec.rb +1 -1
  580. data/spec/unit/parser/ast/leaf_spec.rb +2 -0
  581. data/spec/unit/parser/ast/resource_spec.rb +1 -1
  582. data/spec/unit/parser/compiler_spec.rb +5 -3
  583. data/spec/unit/parser/files_spec.rb +40 -50
  584. data/spec/unit/parser/functions/defined_spec.rb +80 -18
  585. data/spec/unit/parser/functions/epp_spec.rb +88 -0
  586. data/spec/unit/parser/functions/fqdn_rand_spec.rb +4 -1
  587. data/spec/unit/parser/functions/generate_spec.rb +6 -2
  588. data/spec/unit/parser/functions/hiera_array_spec.rb +5 -2
  589. data/spec/unit/parser/functions/hiera_hash_spec.rb +4 -1
  590. data/spec/unit/parser/functions/hiera_include_spec.rb +6 -3
  591. data/spec/unit/parser/functions/hiera_spec.rb +5 -2
  592. data/spec/unit/parser/functions/include_spec.rb +0 -1
  593. data/spec/unit/parser/functions/inline_epp_spec.rb +82 -0
  594. data/spec/unit/parser/functions/lookup_spec.rb +66 -16
  595. data/spec/unit/parser/functions_spec.rb +25 -91
  596. data/spec/unit/parser/lexer_spec.rb +1 -1
  597. data/spec/unit/parser/methods/filter_spec.rb +56 -0
  598. data/spec/unit/parser/methods/map_spec.rb +94 -5
  599. data/spec/unit/parser/methods/reduce_spec.rb +10 -0
  600. data/spec/unit/parser/methods/shared.rb +2 -18
  601. data/spec/unit/parser/methods/slice_spec.rb +39 -1
  602. data/spec/unit/parser/parser_spec.rb +14 -10
  603. data/spec/unit/parser/resource_spec.rb +3 -9
  604. data/spec/unit/parser/scope_spec.rb +81 -78
  605. data/spec/unit/parser/type_loader_spec.rb +0 -4
  606. data/spec/unit/pops/benchmark_spec.rb +142 -0
  607. data/spec/unit/pops/binder/binder_spec.rb +15 -34
  608. data/spec/unit/pops/binder/bindings_checker_spec.rb +0 -41
  609. data/spec/unit/pops/binder/bindings_composer_spec.rb +6 -31
  610. data/spec/unit/pops/binder/config/binder_config_spec.rb +5 -18
  611. data/spec/unit/pops/binder/injector_spec.rb +76 -81
  612. data/spec/unit/pops/evaluator/access_ops_spec.rb +376 -0
  613. data/spec/unit/pops/evaluator/arithmetic_ops_spec.rb +77 -0
  614. data/spec/unit/pops/evaluator/basic_expressions_spec.rb +103 -0
  615. data/spec/unit/pops/evaluator/collections_ops_spec.rb +111 -0
  616. data/spec/unit/pops/evaluator/comparison_ops_spec.rb +256 -0
  617. data/spec/unit/pops/evaluator/conditionals_spec.rb +190 -0
  618. data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +1045 -0
  619. data/spec/unit/pops/evaluator/evaluator_rspec_helper.rb +75 -0
  620. data/spec/unit/pops/evaluator/logical_ops_spec.rb +90 -0
  621. data/spec/unit/pops/evaluator/string_interpolation_spec.rb +44 -0
  622. data/spec/unit/pops/evaluator/variables_spec.rb +194 -0
  623. data/spec/unit/pops/factory_spec.rb +6 -29
  624. data/spec/unit/pops/issues_spec.rb +1 -1
  625. data/spec/unit/pops/model/ast_transformer_spec.rb +6 -9
  626. data/spec/unit/pops/model/model_spec.rb +2 -2
  627. data/spec/unit/pops/parser/epp_parser_spec.rb +86 -0
  628. data/spec/unit/pops/parser/evaluating_parser_spec.rb +4 -2
  629. data/spec/unit/pops/parser/lexer2_spec.rb +428 -0
  630. data/spec/unit/pops/parser/lexer_spec.rb +25 -86
  631. data/spec/unit/pops/parser/parse_basic_expressions_spec.rb +29 -4
  632. data/spec/unit/pops/parser/parse_calls_spec.rb +10 -6
  633. data/spec/unit/pops/parser/parse_conditionals_spec.rb +0 -9
  634. data/spec/unit/pops/parser/parse_containers_spec.rb +43 -12
  635. data/spec/unit/pops/parser/parse_heredoc_spec.rb +73 -0
  636. data/spec/unit/pops/parser/parse_resource_spec.rb +14 -0
  637. data/spec/unit/pops/parser/parser_spec.rb +3 -1
  638. data/spec/unit/pops/transformer/transform_basic_expressions_spec.rb +4 -4
  639. data/spec/unit/pops/transformer/transform_calls_spec.rb +41 -6
  640. data/spec/unit/pops/transformer/transform_conditionals_spec.rb +0 -9
  641. data/spec/unit/pops/transformer/transform_containers_spec.rb +12 -4
  642. data/spec/unit/pops/types/enumeration_spec.rb +50 -0
  643. data/spec/unit/pops/types/type_calculator_spec.rb +1171 -196
  644. data/spec/unit/pops/types/type_factory_spec.rb +108 -4
  645. data/spec/unit/pops/types/type_parser_spec.rb +114 -10
  646. data/spec/unit/pops/validator/validator_spec.rb +36 -1
  647. data/spec/unit/provider/augeas/augeas_spec.rb +39 -16
  648. data/spec/unit/provider/cron/parsed_spec.rb +27 -31
  649. data/spec/unit/provider/file/posix_spec.rb +2 -2
  650. data/spec/unit/provider/group/windows_adsi_spec.rb +1 -0
  651. data/spec/unit/provider/mount_spec.rb +12 -1
  652. data/spec/unit/provider/nameservice/directoryservice_spec.rb +3 -3
  653. data/spec/unit/provider/package/apt_spec.rb +1 -1
  654. data/spec/unit/provider/package/aptrpm_spec.rb +1 -1
  655. data/spec/unit/provider/package/gem_spec.rb +12 -0
  656. data/spec/unit/provider/package/msi_spec.rb +4 -0
  657. data/spec/unit/provider/package/openbsd_spec.rb +10 -10
  658. data/spec/unit/provider/package/pacman_spec.rb +36 -7
  659. data/spec/unit/provider/package/pkgin_spec.rb +57 -55
  660. data/spec/unit/provider/package/rpm_spec.rb +51 -6
  661. data/spec/unit/provider/service/base_spec.rb +4 -4
  662. data/spec/unit/provider/service/daemontools_spec.rb +8 -13
  663. data/spec/unit/provider/service/freebsd_spec.rb +3 -3
  664. data/spec/unit/provider/service/gentoo_spec.rb +24 -24
  665. data/spec/unit/provider/service/init_spec.rb +15 -15
  666. data/spec/unit/provider/service/openbsd_spec.rb +16 -16
  667. data/spec/unit/provider/service/openrc_spec.rb +20 -20
  668. data/spec/unit/provider/service/openwrt_spec.rb +1 -1
  669. data/spec/unit/provider/service/runit_spec.rb +5 -8
  670. data/spec/unit/provider/service/src_spec.rb +4 -4
  671. data/spec/unit/provider/service/systemd_spec.rb +24 -14
  672. data/spec/unit/provider/service/upstart_spec.rb +12 -4
  673. data/spec/unit/provider/service/windows_spec.rb +1 -1
  674. data/spec/unit/provider/ssh_authorized_key/parsed_spec.rb +21 -23
  675. data/spec/unit/provider/user/directoryservice_spec.rb +7 -7
  676. data/spec/unit/provider/user/useradd_spec.rb +43 -15
  677. data/spec/unit/provider/user/windows_adsi_spec.rb +1 -0
  678. data/spec/unit/provider/yumrepo/inifile_spec.rb +105 -0
  679. data/spec/unit/provider/zone/solaris_spec.rb +1 -1
  680. data/spec/unit/provider_spec.rb +120 -62
  681. data/spec/unit/rails/host_spec.rb +1 -1
  682. data/spec/unit/rails/param_value_spec.rb +4 -0
  683. data/spec/unit/relationship_spec.rb +4 -4
  684. data/spec/unit/reports/http_spec.rb +14 -3
  685. data/spec/unit/reports/rrdgraph_spec.rb +0 -1
  686. data/spec/unit/reports/store_spec.rb +2 -2
  687. data/spec/unit/resource/catalog_spec.rb +17 -29
  688. data/spec/unit/resource/status_spec.rb +1 -1
  689. data/spec/unit/resource/type_collection_spec.rb +28 -47
  690. data/spec/unit/resource/type_spec.rb +12 -23
  691. data/spec/unit/resource_spec.rb +54 -93
  692. data/spec/unit/run_spec.rb +3 -3
  693. data/spec/unit/settings/autosign_setting_spec.rb +1 -1
  694. data/spec/unit/settings/config_file_spec.rb +68 -15
  695. data/spec/unit/settings/file_setting_spec.rb +2 -2
  696. data/spec/unit/settings/ini_file_spec.rb +184 -0
  697. data/spec/unit/settings_spec.rb +137 -79
  698. data/spec/unit/ssl/certificate_authority/interface_spec.rb +3 -1
  699. data/spec/unit/ssl/certificate_authority_spec.rb +11 -9
  700. data/spec/unit/ssl/certificate_factory_spec.rb +19 -4
  701. data/spec/unit/ssl/certificate_request_attributes_spec.rb +1 -1
  702. data/spec/unit/ssl/certificate_revocation_list_spec.rb +101 -72
  703. data/spec/unit/ssl/host_spec.rb +8 -20
  704. data/spec/unit/ssl/inventory_spec.rb +2 -2
  705. data/spec/unit/ssl/key_spec.rb +4 -4
  706. data/spec/unit/status_spec.rb +6 -4
  707. data/spec/unit/transaction/additional_resource_generator_spec.rb +3 -11
  708. data/spec/unit/transaction/event_spec.rb +2 -2
  709. data/spec/unit/transaction/report_spec.rb +24 -15
  710. data/spec/unit/transaction/resource_harness_spec.rb +1 -1
  711. data/spec/unit/type/cron_spec.rb +39 -1
  712. data/spec/unit/type/file/content_spec.rb +4 -5
  713. data/spec/unit/type/file/ctime_spec.rb +1 -1
  714. data/spec/unit/type/file/mode_spec.rb +5 -4
  715. data/spec/unit/type/file/mtime_spec.rb +1 -1
  716. data/spec/unit/type/file/source_spec.rb +30 -7
  717. data/spec/unit/type/file_spec.rb +8 -8
  718. data/spec/unit/type/k5login_spec.rb +3 -3
  719. data/spec/unit/type/nagios_spec.rb +6 -0
  720. data/spec/unit/type/package/package_settings_spec.rb +135 -0
  721. data/spec/unit/type/package_spec.rb +13 -1
  722. data/spec/unit/type/resources_spec.rb +155 -0
  723. data/spec/unit/type/service_spec.rb +3 -3
  724. data/spec/unit/type/ssh_authorized_key_spec.rb +96 -93
  725. data/spec/unit/type/sshkey_spec.rb +39 -30
  726. data/spec/unit/type/tidy_spec.rb +19 -12
  727. data/spec/unit/type/user_spec.rb +47 -2
  728. data/spec/unit/type/whit_spec.rb +2 -2
  729. data/spec/unit/type/yumrepo_spec.rb +32 -177
  730. data/spec/unit/type/zone_spec.rb +2 -2
  731. data/spec/unit/type_spec.rb +11 -0
  732. data/spec/unit/util/adsi_spec.rb +48 -1
  733. data/spec/unit/util/autoload_spec.rb +24 -39
  734. data/spec/unit/util/backups_spec.rb +25 -28
  735. data/spec/unit/util/checksums_spec.rb +1 -3
  736. data/spec/unit/util/colors_spec.rb +14 -0
  737. data/spec/unit/util/docs_spec.rb +9 -0
  738. data/spec/unit/util/execution_spec.rb +1 -1
  739. data/spec/unit/util/filetype_spec.rb +7 -7
  740. data/spec/unit/util/instrumentation/data_spec.rb +3 -1
  741. data/spec/unit/util/instrumentation/indirection_probe_spec.rb +2 -0
  742. data/spec/unit/util/instrumentation/listener_spec.rb +3 -2
  743. data/spec/unit/util/json_lockfile_spec.rb +25 -4
  744. data/spec/unit/util/lockfile_spec.rb +49 -7
  745. data/spec/unit/util/log/destinations_spec.rb +1 -0
  746. data/spec/unit/util/log_spec.rb +1 -1
  747. data/spec/unit/util/metric_spec.rb +1 -1
  748. data/spec/unit/util/pidlock_spec.rb +6 -6
  749. data/spec/unit/util/pson_spec.rb +2 -2
  750. data/spec/unit/util/rdoc/parser_spec.rb +32 -29
  751. data/spec/unit/util/resource_template_spec.rb +3 -3
  752. data/spec/unit/util/selinux_spec.rb +5 -5
  753. data/spec/unit/util/storage_spec.rb +4 -4
  754. data/spec/unit/util/tag_set_spec.rb +1 -1
  755. data/spec/unit/util/watcher_spec.rb +1 -4
  756. data/spec/unit/util/yaml_spec.rb +2 -2
  757. data/spec/unit/util_spec.rb +7 -7
  758. data/tasks/benchmark.rake +0 -1
  759. data/tasks/parallel.rake +408 -0
  760. data/tasks/yard.rake +59 -0
  761. metadata +2889 -2782
  762. checksums.yaml +0 -7
  763. data/README_DEVELOPER.md +0 -809
  764. data/lib/puppet/file_system/file.rb +0 -271
  765. data/lib/puppet/network/http/rack/httphandler.rb +0 -13
  766. data/lib/puppet/pops/binder/hiera2.rb +0 -10
  767. data/lib/puppet/pops/binder/hiera2/bindings_provider.rb +0 -148
  768. data/lib/puppet/pops/binder/hiera2/config.rb +0 -69
  769. data/lib/puppet/pops/binder/hiera2/config_checker.rb +0 -68
  770. data/lib/puppet/pops/binder/hiera2/diagnostic_producer.rb +0 -36
  771. data/lib/puppet/pops/binder/hiera2/issues.rb +0 -67
  772. data/lib/puppet/pops/binder/hiera2/json_backend.rb +0 -18
  773. data/lib/puppet/pops/binder/hiera2/yaml_backend.rb +0 -21
  774. data/lib/puppet/pops/binder/scheme_handler/confdir_hiera_scheme.rb +0 -67
  775. data/lib/puppet/pops/binder/scheme_handler/module_hiera_scheme.rb +0 -92
  776. data/lib/puppet/pops/parser/grammar.ra +0 -746
  777. data/lib/puppet/provider/port/parsed.rb +0 -173
  778. data/lib/puppet/type/port.rb +0 -119
  779. data/lib/puppetx/puppet/hiera2_backend.rb +0 -31
  780. data/spec/fixtures/unit/pops/binder/bindings_composer/hiera1config/binder_config.yaml +0 -18
  781. data/spec/fixtures/unit/pops/binder/bindings_composer/hiera1config/hiera.yaml +0 -8
  782. data/spec/fixtures/unit/pops/binder/bindings_composer/hiera1config/modules/good/common.yaml +0 -1
  783. data/spec/fixtures/unit/pops/binder/bindings_composer/hiera1config/modules/good/hiera.yaml +0 -10
  784. data/spec/fixtures/unit/pops/binder/bindings_composer/ok/common.yaml +0 -1
  785. data/spec/fixtures/unit/pops/binder/bindings_composer/ok/hiera.yaml +0 -11
  786. data/spec/fixtures/unit/pops/binder/bindings_composer/ok/localhost.yaml +0 -1
  787. data/spec/fixtures/unit/pops/binder/bindings_composer/ok/modules/awesome/common.yaml +0 -3
  788. data/spec/fixtures/unit/pops/binder/bindings_composer/ok/modules/awesome/hiera.yaml +0 -13
  789. data/spec/fixtures/unit/pops/binder/bindings_composer/ok/modules/awesome/lib/puppet/bindings/awesome/default.rb +0 -4
  790. data/spec/fixtures/unit/pops/binder/bindings_composer/ok/modules/awesome/lib/puppetx/awesome/echo_backend.rb +0 -11
  791. data/spec/fixtures/unit/pops/binder/bindings_composer/ok/modules/awesome/localhost.yaml +0 -1
  792. data/spec/fixtures/unit/pops/binder/bindings_composer/ok/modules/bad/common.yaml +0 -3
  793. data/spec/fixtures/unit/pops/binder/bindings_composer/ok/modules/bad/hiera_config.yaml +0 -9
  794. data/spec/fixtures/unit/pops/binder/bindings_composer/ok/modules/good/common.yaml +0 -2
  795. data/spec/fixtures/unit/pops/binder/bindings_composer/ok/modules/good/hiera.yaml +0 -11
  796. data/spec/fixtures/unit/pops/binder/hiera2/bindings_provider/ok/hiera.yaml +0 -9
  797. data/spec/fixtures/unit/pops/binder/hiera2/bindings_provider/ok/node.example.com.json +0 -9
  798. data/spec/fixtures/unit/pops/binder/hiera2/bindings_provider/ok/node.example.com.yaml +0 -5
  799. data/spec/fixtures/unit/pops/binder/hiera2/config/bad_syntax/hiera.yaml +0 -10
  800. data/spec/fixtures/unit/pops/binder/hiera2/config/malformed_hierarchy/hiera.yaml +0 -8
  801. data/spec/fixtures/unit/pops/binder/hiera2/config/missing/foo.txt +0 -1
  802. data/spec/fixtures/unit/pops/binder/hiera2/config/no_backends/hiera.yaml +0 -7
  803. data/spec/fixtures/unit/pops/binder/hiera2/config/no_hierarchy/hiera.yaml +0 -4
  804. data/spec/fixtures/unit/pops/binder/hiera2/config/not_a_hash/hiera.yaml +0 -2
  805. data/spec/fixtures/unit/pops/binder/hiera2/config/ok/hiera.yaml +0 -8
  806. data/spec/fixtures/unit/pops/binder/hiera2/yaml_backend/invalid/common.yaml +0 -1
  807. data/spec/fixtures/unit/pops/binder/hiera2/yaml_backend/ok/common.yaml +0 -2
  808. data/spec/unit/file_system/file_spec.rb +0 -486
  809. data/spec/unit/pops/binder/hiera2/bindings_provider_spec.rb +0 -74
  810. data/spec/unit/pops/binder/hiera2/config_spec.rb +0 -61
  811. data/spec/unit/pops/binder/hiera2/yaml_backend_spec.rb +0 -33
@@ -0,0 +1,57 @@
1
+ require 'spec_helper'
2
+
3
+ require 'puppet/network/http'
4
+
5
+ describe Puppet::Network::HTTP::API::V2::Authorization do
6
+ HTTP = Puppet::Network::HTTP
7
+
8
+ let(:response) { HTTP::MemoryResponse.new }
9
+ let(:authz) { HTTP::API::V2::Authorization.new }
10
+
11
+ it "only authorizes GET requests" do
12
+ request = HTTP::Request.from_hash({
13
+ :method => "POST"
14
+ })
15
+
16
+ expect do
17
+ authz.call(request, response)
18
+ end.to raise_error(HTTP::Error::HTTPNotAuthorizedError)
19
+ end
20
+
21
+ it "accepts v2 api requests that match allowed authconfig entries" do
22
+ request = HTTP::Request.from_hash({
23
+ :path => "/v2.0/environments",
24
+ :method => "GET",
25
+ :params => { :authenticated => true, :node => "testing", :ip => "127.0.0.1" }
26
+ })
27
+
28
+ authz.stubs(:authconfig).returns(Puppet::Network::AuthConfigParser.new(<<-AUTH).parse)
29
+ path /v2.0/environments
30
+ method find
31
+ allow *
32
+ AUTH
33
+
34
+ expect do
35
+ authz.call(request, response)
36
+ end.to_not raise_error
37
+ end
38
+
39
+ it "rejects v2 api requests that are disallowed by authconfig entries" do
40
+ request = HTTP::Request.from_hash({
41
+ :path => "/v2.0/environments",
42
+ :method => "GET",
43
+ :params => { :node => "testing", :ip => "127.0.0.1" }
44
+ })
45
+
46
+ authz.stubs(:authconfig).returns(Puppet::Network::AuthConfigParser.new(<<-AUTH).parse)
47
+ path /v2.0/environments
48
+ method find
49
+ auth any
50
+ deny testing
51
+ AUTH
52
+
53
+ expect do
54
+ authz.call(request, response)
55
+ end.to raise_error(HTTP::Error::HTTPNotAuthorizedError, /Forbidden request/)
56
+ end
57
+ end
@@ -0,0 +1,42 @@
1
+ require 'spec_helper'
2
+
3
+ require 'puppet/node/environment'
4
+ require 'puppet/network/http'
5
+ require 'matchers/json'
6
+
7
+ describe Puppet::Network::HTTP::API::V2::Environments do
8
+ include JSONMatchers
9
+
10
+ it "responds with all of the available environments" do
11
+ environment = Puppet::Node::Environment.create(:production, ["/first", "/second"], '/manifests')
12
+ loader = Puppet::Environments::Static.new(environment)
13
+ handler = Puppet::Network::HTTP::API::V2::Environments.new(loader)
14
+ response = Puppet::Network::HTTP::MemoryResponse.new
15
+
16
+ handler.call(Puppet::Network::HTTP::Request.from_hash(:headers => { 'accept' => 'application/json' }), response)
17
+
18
+ expect(response.code).to eq(200)
19
+ expect(response.type).to eq("application/json")
20
+ expect(JSON.parse(response.body)).to eq({
21
+ "search_paths" => loader.search_paths,
22
+ "environments" => {
23
+ "production" => {
24
+ "settings" => {
25
+ "modulepath" => [File.expand_path("/first"), File.expand_path("/second")],
26
+ "manifest" => File.expand_path("/manifests")
27
+ }
28
+ }
29
+ }
30
+ })
31
+ end
32
+
33
+ it "the response conforms to the environments schema" do
34
+ environment = Puppet::Node::Environment.create(:production, [], '')
35
+ handler = Puppet::Network::HTTP::API::V2::Environments.new(Puppet::Environments::Static.new(environment))
36
+ response = Puppet::Network::HTTP::MemoryResponse.new
37
+
38
+ handler.call(Puppet::Network::HTTP::Request.from_hash(:headers => { 'accept' => 'application/json' }), response)
39
+
40
+ expect(response.body).to validate_against('api/schemas/environments.json')
41
+ end
42
+ end
@@ -0,0 +1,14 @@
1
+ require 'spec_helper'
2
+
3
+ require 'puppet/network/http'
4
+
5
+ describe Puppet::Network::HTTP::API::V2 do
6
+ it "responds to unknown paths with a 404" do
7
+ response = Puppet::Network::HTTP::MemoryResponse.new
8
+ request = Puppet::Network::HTTP::Request.from_hash(:path => "/v2.0/unknown")
9
+
10
+ expect do
11
+ Puppet::Network::HTTP::API::V2.routes.process(request, response)
12
+ end.to raise_error(Puppet::Network::HTTP::Error::HTTPNotFoundError)
13
+ end
14
+ end
@@ -8,6 +8,7 @@ describe Puppet::Network::HTTP::Connection do
8
8
  let (:host) { "me" }
9
9
  let (:port) { 54321 }
10
10
  subject { Puppet::Network::HTTP::Connection.new(host, port, :verify => Puppet::SSL::Validator.no_validator) }
11
+ let (:httpok) { Net::HTTPOK.new('1.1', 200, '') }
11
12
 
12
13
  context "when providing HTTP connections" do
13
14
  after do
@@ -66,7 +67,6 @@ describe Puppet::Network::HTTP::Connection do
66
67
  let (:host) { "my_server" }
67
68
  let (:port) { 8140 }
68
69
  let (:subject) { Puppet::Network::HTTP::Connection.new(host, port, :use_ssl => false, :verify => Puppet::SSL::Validator.no_validator) }
69
- let (:httpok) { Net::HTTPOK.new('1.1', 200, '') }
70
70
 
71
71
  before :each do
72
72
  httpok.stubs(:body).returns ""
@@ -101,7 +101,6 @@ describe Puppet::Network::HTTP::Connection do
101
101
 
102
102
  let (:host) { "my_server" }
103
103
  let (:port) { 8140 }
104
- let (:httpok) { Net::HTTPOK.new('1.1', 200, '') }
105
104
 
106
105
  it "should provide a useful error message when one is available and certificate validation fails", :unless => Puppet.features.microsoft_windows? do
107
106
  connection = Puppet::Network::HTTP::Connection.new(
@@ -151,7 +150,7 @@ describe Puppet::Network::HTTP::Connection do
151
150
  host, port,
152
151
  :verify => NoProblemsValidator.new(cert))
153
152
 
154
- Net::HTTP.any_instance.stubs(:get).returns(httpok)
153
+ Net::HTTP.any_instance.stubs(:request).returns(httpok)
155
154
 
156
155
  connection.expects(:warn_if_near_expiration).with(cert)
157
156
 
@@ -166,7 +165,7 @@ describe Puppet::Network::HTTP::Connection do
166
165
  end
167
166
 
168
167
  def setup_connection(connection)
169
- connection.stubs(:get).with do
168
+ connection.stubs(:request).with do
170
169
  true
171
170
  end.raises(OpenSSL::SSL::SSLError.new(@fails_with))
172
171
  end
@@ -204,7 +203,6 @@ describe Puppet::Network::HTTP::Connection do
204
203
  let (:other_path) { "other-path" }
205
204
  let (:subject) { Puppet::Network::HTTP::Connection.new("my_server", 8140, :use_ssl => false, :verify => Puppet::SSL::Validator.no_validator) }
206
205
  let (:httpredirection) { Net::HTTPFound.new('1.1', 302, 'Moved Temporarily') }
207
- let (:httpok) { Net::HTTPOK.new('1.1', 200, '') }
208
206
 
209
207
  before :each do
210
208
  httpredirection['location'] = "http://#{other_host}:#{other_port}/#{other_path}"
@@ -234,4 +232,40 @@ describe Puppet::Network::HTTP::Connection do
234
232
  }.to raise_error(Puppet::Network::HTTP::RedirectionLimitExceededException)
235
233
  end
236
234
  end
235
+
236
+ it "allows setting basic auth on get requests" do
237
+ expect_request_with_basic_auth
238
+
239
+ subject.get('/path', nil, :basic_auth => { :user => 'user', :password => 'password' })
240
+ end
241
+
242
+ it "allows setting basic auth on post requests" do
243
+ expect_request_with_basic_auth
244
+
245
+ subject.post('/path', 'data', nil, :basic_auth => { :user => 'user', :password => 'password' })
246
+ end
247
+
248
+ it "allows setting basic auth on head requests" do
249
+ expect_request_with_basic_auth
250
+
251
+ subject.head('/path', nil, :basic_auth => { :user => 'user', :password => 'password' })
252
+ end
253
+
254
+ it "allows setting basic auth on delete requests" do
255
+ expect_request_with_basic_auth
256
+
257
+ subject.delete('/path', nil, :basic_auth => { :user => 'user', :password => 'password' })
258
+ end
259
+
260
+ it "allows setting basic auth on put requests" do
261
+ expect_request_with_basic_auth
262
+
263
+ subject.put('/path', 'data', nil, :basic_auth => { :user => 'user', :password => 'password' })
264
+ end
265
+
266
+ def expect_request_with_basic_auth
267
+ Net::HTTP.any_instance.expects(:request).with do |request|
268
+ expect(request['authorization']).to match(/^Basic/)
269
+ end.returns(httpok)
270
+ end
237
271
  end
@@ -0,0 +1,30 @@
1
+ require 'spec_helper'
2
+ require 'matchers/json'
3
+
4
+ require 'puppet/network/http'
5
+
6
+ describe Puppet::Network::HTTP::Error do
7
+ include JSONMatchers
8
+
9
+ describe Puppet::Network::HTTP::Error::HTTPError do
10
+ it "should serialize to JSON that matches the error schema" do
11
+ error = Puppet::Network::HTTP::Error::HTTPError.new("I don't like the looks of you", 400, :SHIFTY_USER)
12
+
13
+ expect(error.to_json).to validate_against('api/schemas/error.json')
14
+ end
15
+ end
16
+
17
+ describe Puppet::Network::HTTP::Error::HTTPServerError do
18
+ it "should serialize to JSON that matches the error schema and has the optional stacktrace property" do
19
+ begin
20
+ raise Exception, "a wild Exception appeared!"
21
+ rescue Exception => e
22
+ culpable = e
23
+ end
24
+ error = Puppet::Network::HTTP::Error::HTTPServerError.new(culpable)
25
+
26
+ expect(error.to_json).to validate_against('api/schemas/error.json')
27
+ end
28
+ end
29
+
30
+ end
@@ -1,68 +1,25 @@
1
1
  #! /usr/bin/env ruby
2
2
  require 'spec_helper'
3
- require 'puppet/network/http'
4
- require 'puppet/network/http/handler'
3
+ require 'puppet/indirector_testing'
4
+
5
5
  require 'puppet/network/authorization'
6
6
  require 'puppet/network/authentication'
7
- require 'puppet/indirector/memory'
7
+
8
+ require 'puppet/network/http'
8
9
 
9
10
  describe Puppet::Network::HTTP::Handler do
10
11
  before :each do
11
- class Puppet::TestModel
12
- extend Puppet::Indirector
13
- indirects :test_model
14
- attr_accessor :name, :data
15
- def initialize(name = "name", data = '')
16
- @name = name
17
- @data = data
18
- end
19
-
20
- def self.from_raw(raw)
21
- new(nil, raw)
22
- end
23
-
24
- def self.from_pson(pson)
25
- new(pson["name"], pson["data"])
26
- end
27
-
28
- def to_pson
29
- {
30
- "name" => @name,
31
- "data" => @data
32
- }.to_pson
33
- end
34
-
35
- def ==(other)
36
- other.is_a? Puppet::TestModel and other.name == name and other.data == data
37
- end
38
- end
39
-
40
- class Puppet::TestModel::Memory < Puppet::Indirector::Memory
41
- def supports_remote_requests?
42
- true
43
- end
44
- end
45
-
46
- Puppet::TestModel.indirection.terminus_class = :memory
47
- end
48
-
49
- after :each do
50
- Puppet::TestModel.indirection.delete
51
- # Remove the class, unlinking it from the rest of the system.
52
- Puppet.send(:remove_const, :TestModel)
12
+ Puppet::IndirectorTesting.indirection.terminus_class = :memory
53
13
  end
54
14
 
55
- let(:terminus_class) { Puppet::TestModel::Memory }
56
- let(:terminus) { Puppet::TestModel.indirection.terminus(:memory) }
57
- let(:indirection) { Puppet::TestModel.indirection }
58
- let(:model) { Puppet::TestModel }
15
+ let(:indirection) { Puppet::IndirectorTesting.indirection }
59
16
 
60
- def a_request
17
+ def a_request(method = "HEAD", path = "/production/#{indirection.name}/unknown")
61
18
  {
62
19
  :accept_header => "pson",
63
20
  :content_type_header => "text/yaml",
64
- :http_method => "HEAD",
65
- :path => "/production/#{indirection.name}/unknown",
21
+ :http_method => method,
22
+ :path => path,
66
23
  :params => {},
67
24
  :client_cert => nil,
68
25
  :headers => {},
@@ -70,85 +27,70 @@ describe Puppet::Network::HTTP::Handler do
70
27
  }
71
28
  end
72
29
 
73
- def a_request_that_heads(data, request = {})
74
- {
75
- :accept_header => request[:accept_header],
76
- :content_type_header => "text/yaml",
77
- :http_method => "HEAD",
78
- :path => "/production/#{indirection.name}/#{data.name}",
79
- :params => {},
80
- :client_cert => nil,
81
- :body => nil
82
- }
83
- end
30
+ let(:handler) { TestingHandler.new() }
84
31
 
85
- def a_request_that_submits(data, request = {})
86
- {
87
- :accept_header => request[:accept_header],
88
- :content_type_header => "text/yaml",
89
- :http_method => "PUT",
90
- :path => "/production/#{indirection.name}/#{data.name}",
91
- :params => {},
92
- :client_cert => nil,
93
- :body => data.render("text/yaml")
94
- }
95
- end
32
+ describe "the HTTP Handler" do
33
+ def respond(text)
34
+ lambda { |req, res| res.respond_with(200, "text/plain", text) }
35
+ end
96
36
 
97
- def a_request_that_destroys(data, request = {})
98
- {
99
- :accept_header => request[:accept_header],
100
- :content_type_header => "text/yaml",
101
- :http_method => "DELETE",
102
- :path => "/production/#{indirection.name}/#{data.name}",
103
- :params => {},
104
- :client_cert => nil,
105
- :body => ''
106
- }
107
- end
37
+ it "hands the request to the first route that matches the request path" do
38
+ handler = TestingHandler.new(
39
+ Puppet::Network::HTTP::Route.path(%r{^/foo}).get(respond("skipped")),
40
+ Puppet::Network::HTTP::Route.path(%r{^/vtest}).get(respond("used")),
41
+ Puppet::Network::HTTP::Route.path(%r{^/vtest/foo}).get(respond("ignored")))
108
42
 
109
- def a_request_that_finds(data, request = {})
110
- {
111
- :accept_header => request[:accept_header],
112
- :content_type_header => "text/yaml",
113
- :http_method => "GET",
114
- :path => "/production/#{indirection.name}/#{data.name}",
115
- :params => {},
116
- :client_cert => nil,
117
- :body => ''
118
- }
119
- end
43
+ req = a_request("GET", "/vtest/foo")
44
+ res = {}
120
45
 
121
- def a_request_that_searches(key, request = {})
122
- {
123
- :accept_header => request[:accept_header],
124
- :content_type_header => "text/yaml",
125
- :http_method => "GET",
126
- :path => "/production/#{indirection.name}s/#{key}",
127
- :params => {},
128
- :client_cert => nil,
129
- :body => ''
130
- }
131
- end
46
+ handler.process(req, res)
47
+
48
+ expect(res[:body]).to eq("used")
49
+ end
132
50
 
133
- let(:handler) { TestingHandler.new }
51
+ it "raises an error if multiple routes with the same path regex are registered" do
52
+ expect do
53
+ handler = TestingHandler.new(
54
+ Puppet::Network::HTTP::Route.path(%r{^/foo}).get(respond("ignored")),
55
+ Puppet::Network::HTTP::Route.path(%r{^/foo}).post(respond("also ignored")))
56
+ end.to raise_error(ArgumentError)
57
+ end
134
58
 
135
- it "should include the v1 REST API" do
136
- Puppet::Network::HTTP::Handler.ancestors.should be_include(Puppet::Network::HTTP::API::V1)
137
- end
59
+ it "raises an HTTP not found error if no routes match" do
60
+ handler = TestingHandler.new
138
61
 
139
- it "should include the Rest Authorization system" do
140
- Puppet::Network::HTTP::Handler.ancestors.should be_include(Puppet::Network::Authorization)
141
- end
62
+ req = a_request("GET", "/vtest/foo")
63
+ res = {}
64
+
65
+ handler.process(req, res)
142
66
 
143
- describe "when initializing" do
144
- it "should fail when no server type has been provided" do
145
- lambda { handler.initialize_for_puppet }.should raise_error(ArgumentError)
67
+ res_body = JSON(res[:body])
68
+
69
+ expect(res[:content_type_header]).to eq("application/json")
70
+ expect(res_body["issue_kind"]).to eq("HANDLER_NOT_FOUND")
71
+ expect(res_body["message"]).to eq("Not Found: No route for GET /vtest/foo")
72
+ expect(res[:status]).to eq(404)
146
73
  end
147
74
 
148
- it "should set server type" do
149
- handler.initialize_for_puppet("foo")
150
- handler.server.should == "foo"
75
+ it "returns a structured error response with a stacktrace when the server encounters an internal error" do
76
+ handler = TestingHandler.new(
77
+ Puppet::Network::HTTP::Route.path(/.*/).get(lambda { |_, _| raise Exception.new("the sky is falling!")}))
78
+
79
+ req = a_request("GET", "/vtest/foo")
80
+ res = {}
81
+
82
+ handler.process(req, res)
83
+
84
+ res_body = JSON(res[:body])
85
+
86
+ expect(res[:content_type_header]).to eq("application/json")
87
+ expect(res_body["issue_kind"]).to eq(Puppet::Network::HTTP::Issues::RUNTIME_ERROR.to_s)
88
+ expect(res_body["message"]).to eq("Server Error: the sky is falling!")
89
+ expect(res_body["stacktrace"].is_a?(Array) && !res_body["stacktrace"].empty?).to be_true
90
+ expect(res_body["stacktrace"][0]).to match("spec/unit/network/http/handler_spec.rb")
91
+ expect(res[:status]).to eq(500)
151
92
  end
93
+
152
94
  end
153
95
 
154
96
  describe "when processing a request" do
@@ -188,91 +130,15 @@ describe Puppet::Network::HTTP::Handler do
188
130
  Puppet::Util::Profiler.current.should == Puppet::Util::Profiler::NONE
189
131
  end
190
132
 
191
- it "should create an indirection request from the path, parameters, and http method" do
192
- request = a_request
193
- request[:path] = "mypath"
194
- request[:http_method] = "mymethod"
195
- request[:params] = { :params => "mine" }
196
-
197
- handler.expects(:uri2indirection).with("mymethod", "mypath", { :params => "mine" }).returns stub("request", :method => :find)
198
-
199
- handler.stubs(:do_find)
200
-
201
- handler.process(request, response)
202
- end
203
-
204
- it "should return 403 if the request is not authorized" do
205
- request = a_request
206
- handler.expects(:uri2indirection).returns(["facts", :mymethod, "key", {:node => "name"}])
207
-
208
- handler.expects(:do_mymethod).never
209
-
210
- handler.expects(:check_authorization).with("facts", :mymethod, "key", {:node => "name"}).raises(Puppet::Network::AuthorizationError.new("forbidden"))
211
-
212
- handler.expects(:set_response).with(anything, anything, 403)
213
-
214
- handler.process(request, response)
215
- end
216
-
217
- it "should return an error code if the indirection does not support remote requests" do
218
- request = a_request
219
-
220
- indirection.expects(:allow_remote_requests?).returns(false)
221
-
222
- handler.process(request, response)
223
-
224
- expect(response[:status]).to eq 404
225
- end
226
-
227
- it "should serialize a controller exception when an exception is thrown while finding the model instance" do
228
- request = a_request_that_finds(Puppet::TestModel.new("key"))
229
-
230
- handler.expects(:do_find).raises(ArgumentError, "The exception")
231
- handler.expects(:set_response).with(anything, "The exception", 400)
232
- handler.process(request, response)
233
- end
234
-
235
- it "should set the format to text/plain when serializing an exception" do
236
- handler.expects(:set_content_type).with(response, "text/plain")
237
-
238
- handler.do_exception(response, Exception.new("A test"), 404)
239
- end
240
-
241
- it "sends an exception string with the given status" do
242
- handler.expects(:set_response).with(response, "A test", 404)
243
-
244
- handler.do_exception(response, Exception.new("A test"), 404)
245
- end
246
-
247
- it "sends an exception error with the exception's status" do
248
- data = Puppet::TestModel.new("not_found", "not found")
249
- request = a_request_that_finds(data, :accept_header => "pson")
250
-
251
- error = Puppet::Network::HTTP::Handler::HTTPNotFoundError.new("Could not find test_model not_found")
252
- handler.expects(:set_response).with(response, error.to_s, error.status)
253
-
254
- handler.process(request, response)
255
- end
256
-
257
- it "logs an HTTP response exception at info level (most are harmless)" do
258
- data = Puppet::TestModel.new("not_found", "not found")
259
- error = Puppet::Network::HTTP::Handler::HTTPNotFoundError.new("Could not find test_model not_found")
260
-
261
- request = a_request_that_finds(data, :accept_header => "pson")
262
- Puppet.expects(:info).with(error.message)
263
-
264
- handler.process(request, response)
265
- end
266
-
267
133
  it "should raise an error if the request is formatted in an unknown format" do
268
134
  handler.stubs(:content_type_header).returns "unknown format"
269
135
  lambda { handler.request_format(request) }.should raise_error
270
136
  end
271
137
 
272
138
  it "should still find the correct format if content type contains charset information" do
273
- request = a_request
274
- handler.stubs(:content_type_header).returns "text/plain; charset=UTF-8"
275
- handler.request_format(request).should == "s"
139
+ request = Puppet::Network::HTTP::Request.new({ 'content-type' => "text/plain; charset=UTF-8" },
140
+ {}, 'GET', '/', nil)
141
+ request.format.should == "s"
276
142
  end
277
143
 
278
144
  it "should deserialize YAML parameters" do
@@ -290,221 +156,9 @@ describe Puppet::Network::HTTP::Handler do
290
156
 
291
157
  decoded_params[:my_param].should be_a(Hash)
292
158
  end
293
-
294
- describe "when finding a model instance" do
295
- it "uses the first supported format for the response" do
296
- data = Puppet::TestModel.new("my data", "some data")
297
- indirection.save(data, "my data")
298
- request = a_request_that_finds(data, :accept_header => "unknown, pson, yaml")
299
-
300
- handler.expects(:set_response).with(response, data.render(:pson))
301
- handler.expects(:set_content_type).with(response, Puppet::Network::FormatHandler.format(:pson))
302
-
303
- handler.do_find(indirection, "my data", {}, request, response)
304
- end
305
-
306
- it "responds with a 406 error when no accept header is provided" do
307
- data = Puppet::TestModel.new("my data", "some data")
308
- indirection.save(data, "my data")
309
- request = a_request_that_finds(data, :accept_header => nil)
310
-
311
- expect do
312
- handler.do_find(indirection, "my data", {}, request, response)
313
- end.to raise_error(Puppet::Network::HTTP::Handler::HTTPNotAcceptableError)
314
- end
315
-
316
- it "raises an error when no accepted formats are known" do
317
- data = Puppet::TestModel.new("my data", "some data")
318
- indirection.save(data, "my data")
319
- request = a_request_that_finds(data, :accept_header => "unknown, also/unknown")
320
-
321
- expect do
322
- handler.do_find(indirection, "my data", {}, request, response)
323
- end.to raise_error(Puppet::Network::HTTP::Handler::HTTPNotAcceptableError)
324
- end
325
-
326
- it "should pass the result through without rendering it if the result is a string" do
327
- data = Puppet::TestModel.new("my data", "some data")
328
- data_string = "my data string"
329
- request = a_request_that_finds(data, :accept_header => "pson")
330
- indirection.expects(:find).returns(data_string)
331
-
332
- handler.expects(:set_response).with(response, data_string)
333
- handler.expects(:set_content_type).with(response, Puppet::Network::FormatHandler.format(:pson))
334
-
335
- handler.do_find(indirection, "my data", {}, request, response)
336
- end
337
-
338
- it "should return a 404 when no model instance can be found" do
339
- data = Puppet::TestModel.new("my data", "some data")
340
- request = a_request_that_finds(data, :accept_header => "unknown, pson, yaml")
341
-
342
- expect do
343
- handler.do_find(indirection, "my data", {}, request, response)
344
- end.to raise_error(Puppet::Network::HTTP::Handler::HTTPNotFoundError)
345
- end
346
- end
347
-
348
- describe "when performing head operation" do
349
- it "should not generate a response when a model head call succeeds" do
350
- data = Puppet::TestModel.new("my data", "some data")
351
- indirection.save(data, "my data")
352
- request = a_request_that_heads(data)
353
-
354
- handler.expects(:set_response).never
355
-
356
- handler.process(request, response)
357
- end
358
-
359
- it "should return a 404 when the model head call returns false" do
360
- data = Puppet::TestModel.new("my data", "data not there")
361
- request = a_request_that_heads(data)
362
-
363
- handler.expects(:set_response).with(response, "Not Found: Could not find test_model my data", 404)
364
-
365
- handler.process(request, response)
366
- end
367
- end
368
-
369
- describe "when searching for model instances" do
370
- it "uses the first supported format for the response" do
371
- data = Puppet::TestModel.new("my data", "some data")
372
- indirection.save(data, "my data")
373
- request = a_request_that_searches("my", :accept_header => "unknown, pson, yaml")
374
-
375
- handler.expects(:set_response).with(response, Puppet::TestModel.render_multiple(:pson, [data]))
376
- handler.expects(:set_content_type).with(response, Puppet::Network::FormatHandler.format(:pson))
377
-
378
- handler.do_search(indirection, "my", {}, request, response)
379
- end
380
-
381
- it "should return [] when searching returns an empty array" do
382
- request = a_request_that_searches("nothing", :accept_header => "unknown, pson, yaml")
383
-
384
- handler.expects(:set_response).with(response, Puppet::TestModel.render_multiple(:pson, []))
385
- handler.expects(:set_content_type).with(response, Puppet::Network::FormatHandler.format(:pson))
386
-
387
- handler.do_search(indirection, "nothing", {}, request, response)
388
- end
389
-
390
- it "should return a 404 when searching returns nil" do
391
- request = a_request_that_searches("nothing", :accept_header => "unknown, pson, yaml")
392
- indirection.expects(:search).returns(nil)
393
-
394
- expect do
395
- handler.do_search(indirection, "nothing", {}, request, response)
396
- end.to raise_error(Puppet::Network::HTTP::Handler::HTTPNotFoundError)
397
- end
398
- end
399
-
400
- describe "when destroying a model instance" do
401
- it "destroys the data indicated in the request" do
402
- data = Puppet::TestModel.new("my data", "some data")
403
- indirection.save(data, "my data")
404
- request = a_request_that_destroys(data)
405
-
406
- handler.do_destroy(indirection, "my data", {}, request, response)
407
-
408
- Puppet::TestModel.indirection.find("my data").should be_nil
409
- end
410
-
411
- it "responds with yaml when no Accept header is given" do
412
- data = Puppet::TestModel.new("my data", "some data")
413
- indirection.save(data, "my data")
414
- request = a_request_that_destroys(data, :accept_header => nil)
415
-
416
- handler.expects(:set_response).with(response, data.render(:yaml))
417
- handler.expects(:set_content_type).with(response, Puppet::Network::FormatHandler.format(:yaml))
418
-
419
- handler.do_destroy(indirection, "my data", {}, request, response)
420
- end
421
-
422
- it "uses the first supported format for the response" do
423
- data = Puppet::TestModel.new("my data", "some data")
424
- indirection.save(data, "my data")
425
- request = a_request_that_destroys(data, :accept_header => "unknown, pson, yaml")
426
-
427
- handler.expects(:set_response).with(response, data.render(:pson))
428
- handler.expects(:set_content_type).with(response, Puppet::Network::FormatHandler.format(:pson))
429
-
430
- handler.do_destroy(indirection, "my data", {}, request, response)
431
- end
432
-
433
- it "raises an error and does not destory when no accepted formats are known" do
434
- data = Puppet::TestModel.new("my data", "some data")
435
- indirection.save(data, "my data")
436
- request = a_request_that_submits(data, :accept_header => "unknown, also/unknown")
437
-
438
- expect do
439
- handler.do_destroy(indirection, "my data", {}, request, response)
440
- end.to raise_error(Puppet::Network::HTTP::Handler::HTTPNotAcceptableError)
441
-
442
- Puppet::TestModel.indirection.find("my data").should_not be_nil
443
- end
444
- end
445
-
446
- describe "when saving a model instance" do
447
- it "allows an empty body when the format supports it" do
448
- class Puppet::TestModel::Nonvalidatingmemory < Puppet::TestModel::Memory
449
- def validate_key(_)
450
- # nothing
451
- end
452
- end
453
-
454
- indirection.terminus_class = :nonvalidatingmemory
455
-
456
- data = Puppet::TestModel.new("test", '')
457
- request = a_request_that_submits(data)
458
- request[:content_type_header] = "application/x-raw"
459
- request[:body] = ''
460
-
461
- handler.do_save(indirection, "test", {}, request, response)
462
-
463
- Puppet::TestModel.indirection.find("test").data.should == ''
464
- end
465
-
466
- it "saves the data sent in the request" do
467
- data = Puppet::TestModel.new("my data", "some data")
468
- request = a_request_that_submits(data)
469
-
470
- handler.do_save(indirection, "my data", {}, request, response)
471
-
472
- Puppet::TestModel.indirection.find("my data").should == data
473
- end
474
-
475
- it "responds with yaml when no Accept header is given" do
476
- data = Puppet::TestModel.new("my data", "some data")
477
- request = a_request_that_submits(data, :accept_header => nil)
478
-
479
- handler.expects(:set_response).with(response, data.render(:yaml))
480
- handler.expects(:set_content_type).with(response, Puppet::Network::FormatHandler.format(:yaml))
481
-
482
- handler.do_save(indirection, "my data", {}, request, response)
483
- end
484
-
485
- it "uses the first supported format for the response" do
486
- data = Puppet::TestModel.new("my data", "some data")
487
- request = a_request_that_submits(data, :accept_header => "unknown, pson, yaml")
488
-
489
- handler.expects(:set_response).with(response, data.render(:pson))
490
- handler.expects(:set_content_type).with(response, Puppet::Network::FormatHandler.format(:pson))
491
-
492
- handler.do_save(indirection, "my data", {}, request, response)
493
- end
494
-
495
- it "raises an error and does not save when no accepted formats are known" do
496
- data = Puppet::TestModel.new("my data", "some data")
497
- request = a_request_that_submits(data, :accept_header => "unknown, also/unknown")
498
-
499
- expect do
500
- handler.do_save(indirection, "my data", {}, request, response)
501
- end.to raise_error(Puppet::Network::HTTP::Handler::HTTPNotAcceptableError)
502
-
503
- Puppet::TestModel.indirection.find("my data").should be_nil
504
- end
505
- end
506
159
  end
507
160
 
161
+
508
162
  describe "when resolving node" do
509
163
  it "should use a look-up from the ip address" do
510
164
  Resolv.expects(:getname).with("1.2.3.4").returns("host.domain.com")
@@ -528,16 +182,12 @@ describe Puppet::Network::HTTP::Handler do
528
182
  class TestingHandler
529
183
  include Puppet::Network::HTTP::Handler
530
184
 
531
- def accept_header(request)
532
- request[:accept_header]
533
- end
534
-
535
- def content_type_header(request)
536
- request[:content_type_header]
185
+ def initialize(* routes)
186
+ register(routes)
537
187
  end
538
188
 
539
189
  def set_content_type(response, format)
540
- "my_result"
190
+ response[:content_type_header] = format
541
191
  end
542
192
 
543
193
  def set_response(response, body, status = 200)