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,9 @@
1
+ module Puppet::Network::HTTP::Issues
2
+ NO_INDIRECTION_REMOTE_REQUESTS = :NO_INDIRECTION_REMOTE_REQUESTS
3
+ HANDLER_NOT_FOUND = :HANDLER_NOT_FOUND
4
+ RESOURCE_NOT_FOUND = :RESOURCE_NOT_FOUND
5
+ RUNTIME_ERROR = :RUNTIME_ERROR
6
+ MISSING_HEADER_FIELD = :MISSING_HEADER_FIELD
7
+ UNSUPPORTED_FORMAT = :UNSUPPORTED_FORMAT
8
+ UNSUPPORTED_METHOD = :UNSUPPORTED_METHOD
9
+ end
@@ -0,0 +1,13 @@
1
+ class Puppet::Network::HTTP::MemoryResponse
2
+ attr_reader :code, :type, :body
3
+
4
+ def initialize
5
+ @body = ""
6
+ end
7
+
8
+ def respond_with(code, type, body)
9
+ @code = code
10
+ @type = type
11
+ @body += body
12
+ end
13
+ end
@@ -1,14 +1,11 @@
1
1
  require 'openssl'
2
2
  require 'cgi'
3
3
  require 'puppet/network/http/handler'
4
- require 'puppet/network/http/rack/httphandler'
5
4
  require 'puppet/util/ssl'
6
5
 
7
- class Puppet::Network::HTTP::RackREST < Puppet::Network::HTTP::RackHttpHandler
8
-
6
+ class Puppet::Network::HTTP::RackREST
9
7
  include Puppet::Network::HTTP::Handler
10
8
 
11
- HEADER_ACCEPT = 'HTTP_ACCEPT'.freeze
12
9
  ContentType = 'Content-Type'.freeze
13
10
 
14
11
  CHUNK_SIZE = 8192
@@ -31,7 +28,7 @@ class Puppet::Network::HTTP::RackREST < Puppet::Network::HTTP::RackHttpHandler
31
28
 
32
29
  def initialize(args={})
33
30
  super()
34
- initialize_for_puppet(args)
31
+ register([Puppet::Network::HTTP::API::V2.routes, Puppet::Network::HTTP::API::V1.routes])
35
32
  end
36
33
 
37
34
  def set_content_type(response, format)
@@ -51,20 +48,12 @@ class Puppet::Network::HTTP::RackREST < Puppet::Network::HTTP::RackHttpHandler
51
48
 
52
49
  # Retrieve all headers from the http request, as a map.
53
50
  def headers(request)
54
- request.env.select {|k,v| k.start_with? 'HTTP_'}.inject({}) do |m, (k,v)|
51
+ headers = request.env.select {|k,v| k.start_with? 'HTTP_'}.inject({}) do |m, (k,v)|
55
52
  m[k.sub(/^HTTP_/, '').gsub('_','-').downcase] = v
56
53
  m
57
54
  end
58
- end
59
-
60
- # Retrieve the accept header from the http request.
61
- def accept_header(request)
62
- request.env[HEADER_ACCEPT]
63
- end
64
-
65
- # Retrieve the accept header from the http request.
66
- def content_type_header(request)
67
- request.content_type
55
+ headers['content-type'] = request.content_type
56
+ headers
68
57
  end
69
58
 
70
59
  # Return which HTTP verb was used in this request.
@@ -102,8 +91,11 @@ class Puppet::Network::HTTP::RackREST < Puppet::Network::HTTP::RackHttpHandler
102
91
  cert = request.env['SSL_CLIENT_CERT']
103
92
  # NOTE: The SSL_CLIENT_CERT environment variable will be the empty string
104
93
  # when Puppet agent nodes have not yet obtained a signed certificate.
105
- return nil if cert.nil? or cert.empty?
106
- OpenSSL::X509::Certificate.new(cert)
94
+ if cert.nil? || cert.empty?
95
+ nil
96
+ else
97
+ Puppet::SSL::Certificate.from_instance(OpenSSL::X509::Certificate.new(cert))
98
+ end
107
99
  end
108
100
 
109
101
  # Passenger freaks out if we finish handling the request without reading any
@@ -0,0 +1,56 @@
1
+ Puppet::Network::HTTP::Request = Struct.new(:headers, :params, :method, :path, :routing_path, :client_cert, :body) do
2
+ def self.from_hash(hash)
3
+ symbol_members = members.collect(&:intern)
4
+ unknown = hash.keys - symbol_members
5
+ if unknown.empty?
6
+ new(hash[:headers] || {},
7
+ hash[:params] || {},
8
+ hash[:method] || "GET",
9
+ hash[:path],
10
+ hash[:routing_path] || hash[:path],
11
+ hash[:client_cert],
12
+ hash[:body])
13
+ else
14
+ raise ArgumentError, "Unknown arguments: #{unknown.collect(&:inspect).join(', ')}"
15
+ end
16
+ end
17
+
18
+ def route_into(prefix)
19
+ self.class.new(headers, params, method, path, routing_path.sub(prefix, ''), client_cert, body)
20
+ end
21
+
22
+ def format
23
+ if header = headers['content-type']
24
+ header.gsub!(/\s*;.*$/,'') # strip any charset
25
+ format = Puppet::Network::FormatHandler.mime(header)
26
+ if format.nil?
27
+ raise "Client sent a mime-type (#{header}) that doesn't correspond to a format we support"
28
+ else
29
+ report_if_deprecated(format)
30
+ return format.name.to_s if format.suitable?
31
+ end
32
+ end
33
+
34
+ raise "No Content-Type header was received, it isn't possible to unserialize the request"
35
+ end
36
+
37
+ def response_formatter_for(supported_formats, accepted_formats = headers['accept'])
38
+ formatter = Puppet::Network::FormatHandler.most_suitable_format_for(
39
+ accepted_formats.split(/\s*,\s*/),
40
+ supported_formats)
41
+
42
+ if formatter.nil?
43
+ raise Puppet::Network::HTTP::Error::HTTPNotAcceptableError.new("No supported formats are acceptable (Accept: #{accepted_formats})", Puppet::Network::HTTP::Issues::UNSUPPORTED_FORMAT)
44
+ end
45
+
46
+ report_if_deprecated(formatter)
47
+
48
+ formatter
49
+ end
50
+
51
+ def report_if_deprecated(format)
52
+ if format.name == :yaml || format.name == :b64_zlib_yaml
53
+ Puppet.deprecation_warning("YAML in network requests is deprecated and will be removed in a future version. See http://links.puppetlabs.com/deprecate_yaml_on_network")
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,11 @@
1
+ class Puppet::Network::HTTP::Response
2
+ def initialize(handler, response)
3
+ @handler = handler
4
+ @response = response
5
+ end
6
+
7
+ def respond_with(code, type, body)
8
+ @handler.set_content_type(@response, type)
9
+ @handler.set_response(@response, body, code)
10
+ end
11
+ end
@@ -0,0 +1,91 @@
1
+ class Puppet::Network::HTTP::Route
2
+ MethodNotAllowedHandler = lambda do |req, res|
3
+ raise Puppet::Network::HTTP::Error::HTTPMethodNotAllowedError.new("method #{req.method} not allowed for route #{req.path}", Puppet::Network::HTTP::Issues::UNSUPPORTED_METHOD)
4
+ end
5
+
6
+ attr_reader :path_matcher
7
+
8
+ def self.path(path_matcher)
9
+ new(path_matcher)
10
+ end
11
+
12
+ def initialize(path_matcher)
13
+ @path_matcher = path_matcher
14
+ @method_handlers = {
15
+ :GET => [MethodNotAllowedHandler],
16
+ :HEAD => [MethodNotAllowedHandler],
17
+ :OPTIONS => [MethodNotAllowedHandler],
18
+ :POST => [MethodNotAllowedHandler],
19
+ :PUT => [MethodNotAllowedHandler]
20
+ }
21
+ @chained = []
22
+ end
23
+
24
+ def get(*handlers)
25
+ @method_handlers[:GET] = handlers
26
+ return self
27
+ end
28
+
29
+ def head(*handlers)
30
+ @method_handlers[:HEAD] = handlers
31
+ return self
32
+ end
33
+
34
+ def options(*handlers)
35
+ @method_handlers[:OPTIONS] = handlers
36
+ return self
37
+ end
38
+
39
+ def post(*handlers)
40
+ @method_handlers[:POST] = handlers
41
+ return self
42
+ end
43
+
44
+ def put(*handlers)
45
+ @method_handlers[:PUT] = handlers
46
+ return self
47
+ end
48
+
49
+ def any(*handlers)
50
+ @method_handlers.each do |method, registered_handlers|
51
+ @method_handlers[method] = handlers
52
+ end
53
+ return self
54
+ end
55
+
56
+ def chain(*routes)
57
+ @chained = routes
58
+ self
59
+ end
60
+
61
+ def matches?(request)
62
+ Puppet.debug("Evaluating match for #{self.inspect}")
63
+ if match(request.routing_path)
64
+ return true
65
+ else
66
+ Puppet.debug("Did not match path (#{request.routing_path.inspect})")
67
+ end
68
+ return false
69
+ end
70
+
71
+ def process(request, response)
72
+ @method_handlers[request.method.upcase.intern].each do |handler|
73
+ handler.call(request, response)
74
+ end
75
+
76
+ subrequest = request.route_into(match(request.routing_path).to_s)
77
+ if chained_route = @chained.find { |route| route.matches?(subrequest) }
78
+ chained_route.process(subrequest, response)
79
+ end
80
+ end
81
+
82
+ def inspect
83
+ "Route #{@path_matcher.inspect}"
84
+ end
85
+
86
+ private
87
+
88
+ def match(path)
89
+ @path_matcher.match(path)
90
+ end
91
+ end
@@ -22,7 +22,7 @@ class Puppet::Network::HTTP::WEBrick
22
22
  @server = WEBrick::HTTPServer.new(arguments)
23
23
  @server.listeners.each { |l| l.start_immediately = false }
24
24
 
25
- @server.mount('/', Puppet::Network::HTTP::WEBrickREST, :this_value_is_apparently_necessary_but_unused)
25
+ @server.mount('/', Puppet::Network::HTTP::WEBrickREST)
26
26
 
27
27
  raise "WEBrick server is already listening" if @listening
28
28
  @listening = true
@@ -7,10 +7,10 @@ class Puppet::Network::HTTP::WEBrickREST < WEBrick::HTTPServlet::AbstractServlet
7
7
 
8
8
  include Puppet::Network::HTTP::Handler
9
9
 
10
- def initialize(server, handler)
10
+ def initialize(server)
11
11
  raise ArgumentError, "server is required" unless server
12
+ register([Puppet::Network::HTTP::API::V2.routes, Puppet::Network::HTTP::API::V1.routes])
12
13
  super(server)
13
- initialize_for_puppet(:server => server, :handler => handler)
14
14
  end
15
15
 
16
16
  # Retrieve the request parameters, including authentication information.
@@ -39,14 +39,6 @@ class Puppet::Network::HTTP::WEBrickREST < WEBrick::HTTPServlet::AbstractServlet
39
39
  result
40
40
  end
41
41
 
42
- def accept_header(request)
43
- request["accept"]
44
- end
45
-
46
- def content_type_header(request)
47
- request["content-type"]
48
- end
49
-
50
42
  def http_method(request)
51
43
  request.request_method
52
44
  end
@@ -60,7 +52,11 @@ class Puppet::Network::HTTP::WEBrickREST < WEBrick::HTTPServlet::AbstractServlet
60
52
  end
61
53
 
62
54
  def client_cert(request)
63
- request.client_cert
55
+ if cert = request.client_cert
56
+ Puppet::SSL::Certificate.from_instance(cert)
57
+ else
58
+ nil
59
+ end
64
60
  end
65
61
 
66
62
  # Set the specified format as the content type of the response.
@@ -74,7 +70,6 @@ class Puppet::Network::HTTP::WEBrickREST < WEBrick::HTTPServlet::AbstractServlet
74
70
  response.body = result
75
71
  response["content-length"] = result.stat.size if result.is_a?(File)
76
72
  end
77
- response.reason_phrase = result if status < 200 or status >= 300
78
73
  end
79
74
 
80
75
  # Retrieve node/cert/ip information from the request object.
@@ -3,10 +3,10 @@ require 'puppet/network/http/connection'
3
3
  module Puppet::Network; end
4
4
 
5
5
  # This module contains the factory methods that should be used for getting a
6
- # Puppet::Network::HTTP::Connection instance.
6
+ # {Puppet::Network::HTTP::Connection} instance.
7
7
  #
8
- # The name "HttpPool" is a misnomer, and a leftover of history, but we would
9
- # like to make this cache connections in the future.
8
+ # @note The name "HttpPool" is a misnomer, and a leftover of history, but we would
9
+ # like to make this cache connections in the future.
10
10
  #
11
11
  # @api public
12
12
  #
@@ -13,7 +13,7 @@ class Rights
13
13
  !is_forbidden_and_why?(name, :node => args[0], :ip => args[1])
14
14
  end
15
15
 
16
- def is_request_forbidden_and_why?(indirection, method, key, params)
16
+ def is_request_forbidden_and_why?(method, path, params)
17
17
  methods_to_check = if method == :head
18
18
  # :head is ok if either :find or :save is ok.
19
19
  [:find, :save]
@@ -21,7 +21,7 @@ class Rights
21
21
  [method]
22
22
  end
23
23
  authorization_failure_exceptions = methods_to_check.map do |method|
24
- is_forbidden_and_why?("/#{indirection}/#{key}", params.merge({:method => method}))
24
+ is_forbidden_and_why?(path, params.merge({:method => method}))
25
25
  end
26
26
  if authorization_failure_exceptions.include? nil
27
27
  # One of the methods we checked is ok, therefore this request is ok.
@@ -187,8 +187,8 @@ class Rights
187
187
  @methods << m
188
188
  end
189
189
 
190
- def restrict_environment(env)
191
- env = Puppet::Node::Environment.new(env)
190
+ def restrict_environment(environment)
191
+ env = Puppet.lookup(:environments).get(environment)
192
192
  raise ArgumentError, "'#{env}' is already in the '#{name}' ACL" if @environment.include?(env)
193
193
 
194
194
  @environment << env
@@ -9,9 +9,6 @@ class Puppet::Node
9
9
  # the node sources.
10
10
  extend Puppet::Indirector
11
11
 
12
- # Adds the environment getter and setter, with some instance/string conversion
13
- include Puppet::Node::Environment::Helper
14
-
15
12
  # Use the node source as the indirection terminus.
16
13
  indirects :node, :terminus_setting => :node_terminus, :doc => "Where to find node information.
17
14
  A node is composed of its name, its facts, and its environment."
@@ -21,16 +18,21 @@ class Puppet::Node
21
18
 
22
19
  ::PSON.register_document_type('Node',self)
23
20
 
24
- def self.from_pson(pson)
25
- raise ArgumentError, "No name provided in serialized data" unless name = pson['name']
21
+ def self.from_data_hash(data)
22
+ raise ArgumentError, "No name provided in serialized data" unless name = data['name']
26
23
 
27
24
  node = new(name)
28
- node.classes = pson['classes']
29
- node.parameters = pson['parameters']
30
- node.environment = pson['environment']
25
+ node.classes = data['classes']
26
+ node.parameters = data['parameters']
27
+ node.environment = data['environment']
31
28
  node
32
29
  end
33
30
 
31
+ def self.from_pson(pson)
32
+ Puppet.deprecation_warning("from_pson is being removed in favour of from_data_hash.")
33
+ self.from_data_hash(pson)
34
+ end
35
+
34
36
  def to_data_hash
35
37
  result = {
36
38
  'name' => name,
@@ -53,15 +55,22 @@ class Puppet::Node
53
55
  end
54
56
 
55
57
  def environment
56
- return super if @environment
57
-
58
- if env = parameters["environment"]
58
+ if @environment
59
+ @environment
60
+ elsif env = parameters["environment"]
59
61
  self.environment = env
60
- return super
62
+ @environment
63
+ else
64
+ Puppet.lookup(:environments).get(Puppet[:environment])
61
65
  end
66
+ end
62
67
 
63
- # Else, return the default
64
- Puppet::Node::Environment.new
68
+ def environment=(env)
69
+ if env.is_a?(String) or env.is_a?(Symbol)
70
+ @environment = Puppet.lookup(:environments).get(env)
71
+ else
72
+ @environment = env
73
+ end
65
74
  end
66
75
 
67
76
  def initialize(name, options = {})
@@ -10,59 +10,25 @@ end
10
10
  # Puppet::Node::Environment acts as a container for all configuration
11
11
  # that is expected to vary between environments.
12
12
  #
13
- # ## Global variables
14
- #
15
- # The Puppet::Node::Environment uses a number of global variables.
16
- #
17
- # ### `$environment`
18
- #
19
- # The 'environment' global variable represents the current environment that's
20
- # being used in the compiler.
21
- #
22
13
  # ## The root environment
23
14
  #
24
15
  # In addition to normal environments that are defined by the user,there is a
25
16
  # special 'root' environment. It is defined as an instance variable on the
26
17
  # Puppet::Node::Environment metaclass. The environment name is `*root*` and can
27
- # be accessed by calling {Puppet::Node::Environment.root}.
18
+ # be accessed by looking up the `:root_environment` using {Puppet.lookup}.
28
19
  #
29
20
  # The primary purpose of the root environment is to contain parser functions
30
21
  # that are not bound to a specific environment. The main case for this is for
31
22
  # logging functions. Logging functions are attached to the 'root' environment
32
23
  # when {Puppet::Parser::Functions.reset} is called.
33
- #
34
- # The root environment is also used as a fallback environment when the
35
- # current environment has been requested by {Puppet::Node::Environment.current}
36
- # requested and no environment was set by {Puppet::Node::Environment.current=}
37
24
  class Puppet::Node::Environment
38
25
 
39
- # This defines a mixin for classes that have an environment. It implements
40
- # `environment` and `environment=` that respects the semantics of the
41
- # Puppet::Node::Environment class
42
- #
43
- # @api public
44
- module Helper
45
-
46
- def environment
47
- Puppet::Node::Environment.new(@environment)
48
- end
49
-
50
- def environment=(env)
51
- if env.is_a?(String) or env.is_a?(Symbol)
52
- @environment = env
53
- else
54
- @environment = env.name
55
- end
56
- end
57
- end
58
-
59
26
  include Puppet::Util::Cacher
60
27
 
61
- # @!attribute seen
62
- # @scope class
63
- # @api private
64
- # @return [Hash<Symbol, Puppet::Node::Environment>] All memoized environments
65
- @seen = {}
28
+ # @api private
29
+ def self.seen
30
+ @seen ||= {}
31
+ end
66
32
 
67
33
  # Create a new environment with the given name, or return an existing one
68
34
  #
@@ -94,58 +60,100 @@ class Puppet::Node::Environment
94
60
 
95
61
  symbol = name.to_sym
96
62
 
97
- return @seen[symbol] if @seen[symbol]
63
+ return seen[symbol] if seen[symbol]
98
64
 
99
- obj = self.allocate
100
- obj.send :initialize, symbol
101
- @seen[symbol] = obj
65
+ obj = self.create(symbol,
66
+ split_path(Puppet.settings.value(:modulepath, symbol)),
67
+ Puppet.settings.value(:manifest, symbol))
68
+ seen[symbol] = obj
102
69
  end
103
70
 
104
- # Retrieve the environment for the current thread
105
- #
106
- # @note This should only used when a catalog is being compiled.
71
+ # Create a new environment with the given name
107
72
  #
108
- # @api private
73
+ # @param name [Symbol] the name of the
74
+ # @param modulepath [Array<String>] the list of paths from which to load modules
75
+ # @param manifest [String] the path to the manifest for the environment
76
+ # @return [Puppet::Node::Environment]
109
77
  #
110
- # @return [Puppet::Node::Environment] the currently set environment if one
111
- # has been explicitly set, else it will return the '*root*' environment
112
- def self.current
113
- $environment || root
78
+ # @api public
79
+ def self.create(name, modulepath, manifest)
80
+ obj = self.allocate
81
+ obj.send(:initialize,
82
+ name,
83
+ expand_dirs(extralibs() + modulepath),
84
+ File.expand_path(manifest))
85
+ obj
114
86
  end
115
87
 
116
- # Set the environment for the current thread
117
- #
118
- # @note This should only set when a catalog is being compiled. Under normal
119
- # This value is initially set in {Puppet::Parser::Compiler#environment}
88
+ # Instantiate a new environment
120
89
  #
121
- # @note Setting this affects global state during catalog compilation, and
122
- # changing the current environment during compilation can cause unexpected
123
- # and generally very bad behaviors.
90
+ # @note {Puppet::Node::Environment.new} is overridden to return memoized
91
+ # objects, so this will not be invoked with the normal Ruby initialization
92
+ # semantics.
124
93
  #
125
- # @api private
94
+ # @param name [Symbol] The environment name
95
+ def initialize(name, modulepath, manifest)
96
+ @name = name
97
+ @modulepath = modulepath
98
+ @manifest = manifest
99
+ end
100
+
101
+ # Creates a new Puppet::Node::Environment instance, overriding any of the passed
102
+ # parameters.
126
103
  #
127
- # @param env [Puppet::Node::Environment]
128
- def self.current=(env)
129
- $environment = new(env)
104
+ # @param env_params [Hash<{Symbol => String,Array<String>}>] new environment
105
+ # parameters (:modulepath, :manifest)
106
+ # @return [Puppet::Node::Environment]
107
+ def override_with(env_params)
108
+ return self.class.create(name,
109
+ env_params[:modulepath] || modulepath,
110
+ env_params[:manifest] || manifest)
130
111
  end
131
112
 
113
+ # Creates a new Puppet::Node::Environment instance, overriding manfiest
114
+ # and modulepath from the passed settings if they were originally set from
115
+ # the commandline, or returns self if there is nothing to override.
116
+ #
117
+ # @param settings [Puppet::Settings] an initialized puppet settings instance
118
+ # @return [Puppet::Node::Environment] new overridden environment or self if
119
+ # there are no commandline changes from settings.
120
+ def override_from_commandline(settings)
121
+ overrides = {}
122
+ overrides[:modulepath] = self.class.split_path(settings[:modulepath]) if settings.set_by_cli?(:modulepath)
123
+ if settings.set_by_cli?(:manifest) ||
124
+ (settings.set_by_cli?(:manifestdir) && settings[:manifest].start_with?(settings[:manifestdir]))
125
+ overrides[:manifest] = settings[:manifest]
126
+ end
127
+ overrides.empty? ?
128
+ self :
129
+ self.override_with(overrides)
130
+ end
132
131
 
133
- # @return [Puppet::Node::Environment] The `*root*` environment.
132
+ # Retrieve the environment for the current process.
134
133
  #
135
- # This is only used for handling functions that are not attached to a
136
- # specific environment.
134
+ # @note This should only used when a catalog is being compiled.
137
135
  #
138
136
  # @api private
139
- def self.root
140
- @root
137
+ #
138
+ # @return [Puppet::Node::Environment] the currently set environment if one
139
+ # has been explicitly set, else it will return the '*root*' environment
140
+ def self.current
141
+ Puppet.deprecation_warning("Puppet::Node::Environment.current has been replaced by Puppet.lookup(:current_environment), see http://links.puppetlabs.com/current-env-deprecation")
142
+ Puppet.lookup(:current_environment)
143
+ end
144
+
145
+ # @param [String] name Environment name to check for valid syntax.
146
+ # @return [Boolean] true if name is valid
147
+ # @api public
148
+ def self.valid_name?(name)
149
+ !!name.match(/\A\w+\Z/)
141
150
  end
142
151
 
143
152
  # Clear all memoized environments and the 'current' environment
144
153
  #
145
154
  # @api private
146
155
  def self.clear
147
- @seen.clear
148
- $environment = nil
156
+ seen.clear
149
157
  end
150
158
 
151
159
  # @!attribute [r] name
@@ -154,6 +162,25 @@ class Puppet::Node::Environment
154
162
  # environment identifier
155
163
  attr_reader :name
156
164
 
165
+ # @api public
166
+ # @return [Array<String>] All directories present on disk in the modulepath
167
+ def modulepath
168
+ @modulepath.find_all do |p|
169
+ Puppet::FileSystem.directory?(p)
170
+ end
171
+ end
172
+
173
+ # @api public
174
+ # @return [Array<String>] All directories in the modulepath (even if they are not present on disk)
175
+ def full_modulepath
176
+ @modulepath
177
+ end
178
+
179
+ # @!attribute [r] manifest
180
+ # @api public
181
+ # @return [String] path to the manifest file or directory.
182
+ attr_reader :manifest
183
+
157
184
  # Return an environment-specific Puppet setting.
158
185
  #
159
186
  # @api public
@@ -164,26 +191,6 @@ class Puppet::Node::Environment
164
191
  Puppet.settings.value(param, self.name)
165
192
  end
166
193
 
167
- # Instantiate a new environment
168
- #
169
- # @note {Puppet::Node::Environment.new} is overridden to return memoized
170
- # objects, so this will not be invoked with the normal Ruby initialization
171
- # semantics.
172
- #
173
- # @param name [Symbol] The environment name
174
- def initialize(name)
175
- @name = name
176
- end
177
-
178
- # The current global TypeCollection
179
- #
180
- # @note The environment is loosely coupled with the {Puppet::Resource::TypeCollection}
181
- # class. While there is a 1:1 relationship between an environment and a
182
- # TypeCollection instance, there is only one TypeCollection instance
183
- # available at any given time. It is stored in `$known_resource_types`.
184
- # `$known_resource_types` is accessed as an instance method, but is global
185
- # to all environment variables.
186
- #
187
194
  # @api public
188
195
  # @return [Puppet::Resource::TypeCollection] The current global TypeCollection
189
196
  def known_resource_types
@@ -230,21 +237,6 @@ class Puppet::Node::Environment
230
237
  nil
231
238
  end
232
239
 
233
- # @!attribute [r] modulepath
234
- # Return all existent directories in the modulepath for this environment
235
- # @note This value is cached so that the filesystem doesn't have to be
236
- # re-enumerated every time this method is invoked, since that
237
- # enumeration could be a costly operation and this method is called
238
- # frequently. The cache expiry is determined by `Puppet[:filetimeout]`.
239
- # @see Puppet::Util::Cacher.cached_attr
240
- # @api public
241
- # @return [Array<String>] All directories present in the modulepath
242
- cached_attr(:modulepath, Puppet[:filetimeout]) do
243
- dirs = self[:modulepath].split(File::PATH_SEPARATOR)
244
- dirs = ENV["PUPPETLIB"].split(File::PATH_SEPARATOR) + dirs if ENV["PUPPETLIB"]
245
- validate_dirs(dirs)
246
- end
247
-
248
240
  # @!attribute [r] modules
249
241
  # Return all modules for this environment in the order they appear in the
250
242
  # modulepath.
@@ -367,9 +359,16 @@ class Puppet::Node::Environment
367
359
  deps
368
360
  end
369
361
 
362
+ # Set a periodic watcher on the file, so we can tell if it has changed.
363
+ # @param filename [File,String] File instance or filename
364
+ # @api private
365
+ def watch_file(file)
366
+ known_resource_types.watch_file(file.to_s)
367
+ end
370
368
 
371
369
  def check_for_reparse
372
- if @known_resource_types && @known_resource_types.require_reparse?
370
+ if (Puppet[:code] != @parsed_code) || (@known_resource_types && @known_resource_types.require_reparse?)
371
+ @parsed_code = nil
373
372
  @known_resource_types = nil
374
373
  end
375
374
  end
@@ -402,22 +401,37 @@ class Puppet::Node::Environment
402
401
  self.to_s.to_zaml(z)
403
402
  end
404
403
 
405
- # Validate a list of file paths and return the paths that are directories on the filesystem
406
- #
407
- # @api private
408
- #
409
- # @param dirs [Array<String>] The file paths to validate
410
- # @return [Array<String>] All file paths that exist and are directories
411
- def validate_dirs(dirs)
404
+ def self.split_path(path_string)
405
+ path_string.split(File::PATH_SEPARATOR)
406
+ end
407
+
408
+ def ==(other)
409
+ return true if other.kind_of?(Puppet::Node::Environment) &&
410
+ self.name == other.name &&
411
+ self.full_modulepath == other.full_modulepath &&
412
+ self.manifest == other.manifest
413
+ end
414
+
415
+ def hash
416
+ [self.class, name, full_modulepath, manifest].hash
417
+ end
418
+
419
+ private
420
+
421
+ def self.extralibs()
422
+ if ENV["PUPPETLIB"]
423
+ split_path(ENV["PUPPETLIB"])
424
+ else
425
+ []
426
+ end
427
+ end
428
+
429
+ def self.expand_dirs(dirs)
412
430
  dirs.collect do |dir|
413
431
  File.expand_path(dir)
414
- end.find_all do |p|
415
- FileTest.directory?(p)
416
432
  end
417
433
  end
418
434
 
419
- private
420
-
421
435
  # Reparse the manifests for the given environment
422
436
  #
423
437
  # There are two sources that can be used for the initial parse:
@@ -435,16 +449,28 @@ class Puppet::Node::Environment
435
449
  # @return [Puppet::Parser::AST::Hostclass] The AST hostclass object
436
450
  # representing the 'main' hostclass
437
451
  def perform_initial_import
438
- return empty_parse_result if Puppet.settings[:ignoreimport]
439
- # parser = Puppet::Parser::Parser.new(self)
452
+ return empty_parse_result if Puppet[:ignoreimport]
440
453
  parser = Puppet::Parser::ParserFactory.parser(self)
441
- if code = Puppet.settings.uninterpolated_value(:code, name.to_s) and code != ""
442
- parser.string = code
454
+ @parsed_code = Puppet[:code]
455
+ if @parsed_code != ""
456
+ parser.string = @parsed_code
457
+ parser.parse
443
458
  else
444
- file = Puppet.settings.value(:manifest, name.to_s)
445
- parser.file = file
459
+ file = self.manifest
460
+ # if the manifest file is a reference to a directory, parse and combine all .pp files in that
461
+ # directory
462
+ if File.directory?(file)
463
+ parse_results = Dir.entries(file).find_all { |f| f =~ /\.pp$/ }.sort.map do |pp_file|
464
+ parser.file = File.join(file, pp_file)
465
+ parser.parse
466
+ end
467
+ # Use a parser type specific merger to concatenate the results
468
+ Puppet::Parser::AST::Hostclass.new('', :code => Puppet::Parser::ParserFactory.code_merger.concatenate(parse_results))
469
+ else
470
+ parser.file = file
471
+ parser.parse
472
+ end
446
473
  end
447
- parser.parse
448
474
  rescue => detail
449
475
  @known_resource_types.parse_failed = true
450
476
 
@@ -463,6 +489,4 @@ class Puppet::Node::Environment
463
489
  def empty_parse_result
464
490
  return Puppet::Parser::AST::Hostclass.new('')
465
491
  end
466
-
467
- @root = new(:'*root*')
468
492
  end