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
@@ -1,22 +1,7 @@
1
1
  #! /usr/bin/env ruby
2
2
  require 'spec_helper'
3
-
4
3
  require 'puppet/file_serving/metadata'
5
-
6
- # the json-schema gem doesn't support windows
7
- if not Puppet.features.microsoft_windows?
8
- FILE_METADATA_SCHEMA = JSON.parse(File.read(File.join(File.dirname(__FILE__), '../../../api/schemas/file_metadata.json')))
9
-
10
- describe "catalog schema" do
11
- it "should validate against the json meta-schema" do
12
- JSON::Validator.validate!(JSON_META_SCHEMA, FILE_METADATA_SCHEMA)
13
- end
14
- end
15
-
16
- def validate_json_for_file_metadata(file_metadata)
17
- JSON::Validator.validate!(FILE_METADATA_SCHEMA, file_metadata.to_pson)
18
- end
19
- end
4
+ require 'matchers/json'
20
5
 
21
6
  describe Puppet::FileServing::Metadata do
22
7
  let(:foobar) { File.expand_path('/foo/bar') }
@@ -41,8 +26,8 @@ describe Puppet::FileServing::Metadata do
41
26
  Puppet::FileServing::Metadata.new(foobar).should respond_to(:to_pson_data_hash)
42
27
  end
43
28
 
44
- it "should support pson deserialization" do
45
- Puppet::FileServing::Metadata.should respond_to(:from_pson)
29
+ it "should support deserialization" do
30
+ Puppet::FileServing::Metadata.should respond_to(:from_data_hash)
46
31
  end
47
32
 
48
33
  describe "when serializing" do
@@ -103,6 +88,7 @@ describe Puppet::FileServing::Metadata do
103
88
  end
104
89
 
105
90
  describe Puppet::FileServing::Metadata do
91
+ include JSONMatchers
106
92
  include PuppetSpec::Files
107
93
 
108
94
  shared_examples_for "metadata collector" do
@@ -154,8 +140,8 @@ describe Puppet::FileServing::Metadata do
154
140
  end
155
141
  end
156
142
 
157
- it "should validate against the schema", :unless => Puppet.features.microsoft_windows? do
158
- validate_json_for_file_metadata(metadata)
143
+ it "should validate against the schema" do
144
+ expect(metadata.to_pson).to validate_against('api/schemas/file_metadata.json')
159
145
  end
160
146
  end
161
147
 
@@ -179,14 +165,54 @@ describe Puppet::FileServing::Metadata do
179
165
  metadata.checksum.should == "{ctime}#{time}"
180
166
  end
181
167
 
182
- it "should validate against the schema", :unless => Puppet.features.microsoft_windows? do
168
+ it "should validate against the schema" do
183
169
  metadata.collect
184
- validate_json_for_file_metadata(metadata)
170
+ expect(metadata.to_pson).to validate_against('api/schemas/file_metadata.json')
185
171
  end
186
172
  end
187
173
  end
188
174
  end
189
175
 
176
+ describe "WindowsStat", :if => Puppet.features.microsoft_windows? do
177
+ include PuppetSpec::Files
178
+
179
+ it "should return default owner, group and mode when the given path has an invalid DACL (such as a non-NTFS volume)" do
180
+ invalid_error = Puppet::Util::Windows::Error.new('Invalid DACL', 1336)
181
+ path = tmpfile('foo')
182
+ FileUtils.touch(path)
183
+
184
+ Puppet::Util::Windows::Security.stubs(:get_owner).with(path).raises(invalid_error)
185
+ Puppet::Util::Windows::Security.stubs(:get_group).with(path).raises(invalid_error)
186
+ Puppet::Util::Windows::Security.stubs(:get_mode).with(path).raises(invalid_error)
187
+
188
+ stat = Puppet::FileSystem.stat(path)
189
+
190
+ win_stat = Puppet::FileServing::Metadata::WindowsStat.new(stat, path)
191
+
192
+ win_stat.owner.should == 'S-1-5-32-544'
193
+ win_stat.group.should == 'S-1-0-0'
194
+ win_stat.mode.should == 0644
195
+ end
196
+
197
+ it "should still raise errors that are not the result of an 'Invalid DACL'" do
198
+ invalid_error = ArgumentError.new('bar')
199
+ path = tmpfile('bar')
200
+ FileUtils.touch(path)
201
+
202
+ Puppet::Util::Windows::Security.stubs(:get_owner).with(path).raises(invalid_error)
203
+ Puppet::Util::Windows::Security.stubs(:get_group).with(path).raises(invalid_error)
204
+ Puppet::Util::Windows::Security.stubs(:get_mode).with(path).raises(invalid_error)
205
+
206
+ stat = Puppet::FileSystem.stat(path)
207
+
208
+ win_stat = Puppet::FileServing::Metadata::WindowsStat.new(stat, path)
209
+
210
+ expect { win_stat.owner }.to raise_error(ArgumentError)
211
+ expect { win_stat.group }.to raise_error(ArgumentError)
212
+ expect { win_stat.mode }.to raise_error(ArgumentError)
213
+ end
214
+ end
215
+
190
216
  shared_examples_for "metadata collector symlinks" do
191
217
 
192
218
  let(:metadata) do
@@ -201,21 +227,21 @@ describe Puppet::FileServing::Metadata do
201
227
  let(:path) { tmpfile('file_serving_metadata_link') }
202
228
  let(:target) { tmpfile('file_serving_metadata_target') }
203
229
  let(:checksum) { Digest::MD5.hexdigest("some content\n") }
204
- let(:fmode) { Puppet::FileSystem::File.new(path).lstat.mode & 0777 }
230
+ let(:fmode) { Puppet::FileSystem.lstat(path).mode & 0777 }
205
231
 
206
232
  before :each do
207
233
  File.open(target, "wb") {|f| f.print("some content\n")}
208
234
  set_mode(0644, target)
209
235
 
210
- Puppet::FileSystem::File.new(target).symlink(path)
236
+ Puppet::FileSystem.symlink(target, path)
211
237
  end
212
238
 
213
239
  it "should read links instead of returning their checksums" do
214
240
  metadata.destination.should == target
215
241
  end
216
242
 
217
- it "should validate against the schema", :unless => Puppet.features.microsoft_windows? do
218
- validate_json_for_file_metadata(metadata)
243
+ it "should validate against the schema" do
244
+ expect(metadata.to_pson).to validate_against('api/schemas/file_metadata.json')
219
245
  end
220
246
  end
221
247
  end
@@ -248,8 +274,8 @@ describe Puppet::FileServing::Metadata do
248
274
  proc { metadata.collect}.should raise_error(Errno::ENOENT)
249
275
  end
250
276
 
251
- it "should validate against the schema", :unless => Puppet.features.microsoft_windows? do
252
- validate_json_for_file_metadata(metadata)
277
+ it "should validate against the schema" do
278
+ expect(metadata.to_pson).to validate_against('api/schemas/file_metadata.json')
253
279
  end
254
280
  end
255
281
  end
@@ -291,6 +317,9 @@ describe Puppet::FileServing::Metadata do
291
317
  data.collect
292
318
  data
293
319
  end
320
+ let (:invalid_dacl_error) do
321
+ Puppet::Util::Windows::Error.new('Invalid DACL', 1336)
322
+ end
294
323
 
295
324
  it "should default owner" do
296
325
  Puppet::Util::Windows::Security.stubs(:get_owner).returns nil
@@ -309,6 +338,28 @@ describe Puppet::FileServing::Metadata do
309
338
 
310
339
  metadata.mode.should == 0644
311
340
  end
341
+
342
+ describe "when the path raises an Invalid ACL error" do
343
+ # these simulate the behavior of a symlink file whose target does not support ACLs
344
+ it "should default owner" do
345
+ Puppet::Util::Windows::Security.stubs(:get_owner).raises(invalid_dacl_error)
346
+
347
+ metadata.owner.should == 'S-1-5-32-544'
348
+ end
349
+
350
+ it "should default group" do
351
+ Puppet::Util::Windows::Security.stubs(:get_group).raises(invalid_dacl_error)
352
+
353
+ metadata.group.should == 'S-1-0-0'
354
+ end
355
+
356
+ it "should default mode" do
357
+ Puppet::Util::Windows::Security.stubs(:get_mode).raises(invalid_dacl_error)
358
+
359
+ metadata.mode.should == 0644
360
+ end
361
+ end
362
+
312
363
  end
313
364
 
314
365
  def set_mode(mode, path)
@@ -325,7 +376,8 @@ describe Puppet::FileServing::Metadata, " when pointing to a link", :if => Puppe
325
376
  @file = Puppet::FileServing::Metadata.new(path, :links => :manage)
326
377
  stat = stub("stat", :uid => 1, :gid => 2, :ftype => "link", :mode => 0755)
327
378
  stub_file = stub(:readlink => "/some/other/path", :lstat => stat)
328
- Puppet::FileSystem::File.expects(:new).with(path).at_least_once.returns stub_file
379
+ Puppet::FileSystem.expects(:lstat).with(path).at_least_once.returns stat
380
+ Puppet::FileSystem.expects(:readlink).with(path).at_least_once.returns "/some/other/path"
329
381
  @checksum = Digest::MD5.hexdigest("some content\n") # Remove these when :managed links are no longer checksumed.
330
382
  @file.stubs(:md5_file).returns(@checksum) #
331
383
 
@@ -356,9 +408,8 @@ describe Puppet::FileServing::Metadata, " when pointing to a link", :if => Puppe
356
408
  path = "/base/path/my/file"
357
409
  @file = Puppet::FileServing::Metadata.new(path, :links => :follow)
358
410
  stat = stub("stat", :uid => 1, :gid => 2, :ftype => "file", :mode => 0755)
359
- mocked_file = mock(path, :stat => stat)
360
- Puppet::FileSystem::File.expects(:new).with(path).at_least_once.returns mocked_file
361
- mocked_file.expects(:readlink).never
411
+ Puppet::FileSystem.expects(:stat).with(path).at_least_once.returns stat
412
+ Puppet::FileSystem.expects(:readlink).never
362
413
 
363
414
  if Puppet.features.microsoft_windows?
364
415
  win_stat = stub('win_stat', :owner => 'snarf', :group => 'thundercats',
@@ -85,7 +85,7 @@ describe Puppet::FileServing::Mount::File do
85
85
  include FileServingMountTesting
86
86
 
87
87
  before do
88
- Puppet::FileSystem::File.stubs(:exist?).returns(true)
88
+ Puppet::FileSystem.stubs(:exist?).returns(true)
89
89
  FileTest.stubs(:directory?).returns(true)
90
90
  FileTest.stubs(:readable?).returns(true)
91
91
  @mount = Puppet::FileServing::Mount::File.new("test")
@@ -95,12 +95,12 @@ describe Puppet::FileServing::Mount::File do
95
95
  end
96
96
 
97
97
  it "should return nil if the file is absent" do
98
- Puppet::FileSystem::File.stubs(:exist?).returns(false)
98
+ Puppet::FileSystem.stubs(:exist?).returns(false)
99
99
  @mount.complete_path("/my/path", nil).should be_nil
100
100
  end
101
101
 
102
102
  it "should write a log message if the file is absent" do
103
- Puppet::FileSystem::File.stubs(:exist?).returns(false)
103
+ Puppet::FileSystem.stubs(:exist?).returns(false)
104
104
 
105
105
  Puppet.expects(:info).with("File does not exist or is not accessible: /mount/my/path")
106
106
 
@@ -108,12 +108,12 @@ describe Puppet::FileServing::Mount::File do
108
108
  end
109
109
 
110
110
  it "should return the file path if the file is present" do
111
- Puppet::FileSystem::File.stubs(:exist?).with("/my/path").returns(true)
111
+ Puppet::FileSystem.stubs(:exist?).with("/my/path").returns(true)
112
112
  @mount.complete_path("/my/path", nil).should == "/mount/my/path"
113
113
  end
114
114
 
115
115
  it "should treat a nil file name as the path to the mount itself" do
116
- Puppet::FileSystem::File.stubs(:exist?).returns(true)
116
+ Puppet::FileSystem.stubs(:exist?).returns(true)
117
117
  @mount.complete_path(nil, nil).should == "/mount"
118
118
  end
119
119
 
@@ -141,7 +141,7 @@ describe Puppet::FileServing::Mount::File do
141
141
  include FileServingMountTesting
142
142
 
143
143
  before do
144
- Puppet::FileSystem::File.stubs(:exist?).returns(true)
144
+ Puppet::FileSystem.stubs(:exist?).returns(true)
145
145
  FileTest.stubs(:directory?).returns(true)
146
146
  FileTest.stubs(:readable?).returns(true)
147
147
  @mount = Puppet::FileServing::Mount::File.new("test")
@@ -153,7 +153,7 @@ describe Puppet::FileServing::Mount::File do
153
153
  end
154
154
 
155
155
  it "should return the results of the complete file path" do
156
- Puppet::FileSystem::File.stubs(:exist?).returns(false)
156
+ Puppet::FileSystem.stubs(:exist?).returns(false)
157
157
  @mount.expects(:complete_path).with("/my/path", "foo").returns "eh"
158
158
  @mount.find("/my/path", @request).should == "eh"
159
159
  end
@@ -163,7 +163,7 @@ describe Puppet::FileServing::Mount::File do
163
163
  include FileServingMountTesting
164
164
 
165
165
  before do
166
- Puppet::FileSystem::File.stubs(:exist?).returns(true)
166
+ Puppet::FileSystem.stubs(:exist?).returns(true)
167
167
  FileTest.stubs(:directory?).returns(true)
168
168
  FileTest.stubs(:readable?).returns(true)
169
169
  @mount = Puppet::FileServing::Mount::File.new("test")
@@ -175,13 +175,13 @@ describe Puppet::FileServing::Mount::File do
175
175
  end
176
176
 
177
177
  it "should return the results of the complete file path as an array" do
178
- Puppet::FileSystem::File.stubs(:exist?).returns(false)
178
+ Puppet::FileSystem.stubs(:exist?).returns(false)
179
179
  @mount.expects(:complete_path).with("/my/path", "foo").returns "eh"
180
180
  @mount.search("/my/path", @request).should == ["eh"]
181
181
  end
182
182
 
183
183
  it "should return nil if the complete path is nil" do
184
- Puppet::FileSystem::File.stubs(:exist?).returns(false)
184
+ Puppet::FileSystem.stubs(:exist?).returns(false)
185
185
  @mount.expects(:complete_path).with("/my/path", "foo").returns nil
186
186
  @mount.search("/my/path", @request).should be_nil
187
187
  end
@@ -12,7 +12,7 @@ describe Puppet::FileSystem::Tempfile do
12
12
  file.write("stuff")
13
13
  file.flush
14
14
 
15
- expect(Puppet::FileSystem::File.new(file.path).read).to eq("stuff")
15
+ expect(Puppet::FileSystem.read(file.path)).to eq("stuff")
16
16
  end
17
17
  end
18
18
 
@@ -29,7 +29,7 @@ describe Puppet::FileSystem::Tempfile do
29
29
  file.path
30
30
  end
31
31
 
32
- expect(Puppet::FileSystem::File.new(filename).exist?).to be_false
32
+ expect(Puppet::FileSystem.exist?(filename)).to be_false
33
33
  end
34
34
 
35
35
  it "unlinks the temporary file even if the block raises an error" do
@@ -43,6 +43,6 @@ describe Puppet::FileSystem::Tempfile do
43
43
  rescue
44
44
  end
45
45
 
46
- expect(Puppet::FileSystem::File.new(filename).exist?).to be_false
46
+ expect(Puppet::FileSystem.exist?(filename)).to be_false
47
47
  end
48
48
  end
@@ -0,0 +1,508 @@
1
+ require 'spec_helper'
2
+ require 'puppet/file_system'
3
+ require 'puppet/util/platform'
4
+
5
+ describe "Puppet::FileSystem" do
6
+ include PuppetSpec::Files
7
+
8
+ context "#exclusive_open" do
9
+ it "opens ands allows updating of an existing file" do
10
+ file = file_containing("file_to_update", "the contents")
11
+
12
+ Puppet::FileSystem.exclusive_open(file, 0660, 'r+') do |fh|
13
+ old = fh.read
14
+ fh.truncate(0)
15
+ fh.rewind
16
+ fh.write("updated #{old}")
17
+ end
18
+
19
+ expect(Puppet::FileSystem.read(file)).to eq("updated the contents")
20
+ end
21
+
22
+ it "opens, creates ands allows updating of a new file" do
23
+ file = tmpfile("file_to_update")
24
+
25
+ Puppet::FileSystem.exclusive_open(file, 0660, 'w') do |fh|
26
+ fh.write("updated new file")
27
+ end
28
+
29
+ expect(Puppet::FileSystem.read(file)).to eq("updated new file")
30
+ end
31
+
32
+ it "excludes other processes from updating at the same time", :unless => Puppet::Util::Platform.windows? do
33
+ file = file_containing("file_to_update", "0")
34
+
35
+ increment_counter_in_multiple_processes(file, 5, 'r+')
36
+
37
+ expect(Puppet::FileSystem.read(file)).to eq("5")
38
+ end
39
+
40
+ it "excludes other processes from updating at the same time even when creating the file", :unless => Puppet::Util::Platform.windows? do
41
+ file = tmpfile("file_to_update")
42
+
43
+ increment_counter_in_multiple_processes(file, 5, 'a+')
44
+
45
+ expect(Puppet::FileSystem.read(file)).to eq("5")
46
+ end
47
+
48
+ it "times out if the lock cannot be aquired in a specified amount of time", :unless => Puppet::Util::Platform.windows? do
49
+ file = tmpfile("file_to_update")
50
+
51
+ child = spawn_process_that_locks(file)
52
+
53
+ expect do
54
+ Puppet::FileSystem.exclusive_open(file, 0666, 'a', 0.1) do |f|
55
+ end
56
+ end.to raise_error(Timeout::Error)
57
+
58
+ Process.kill(9, child)
59
+ end
60
+
61
+ def spawn_process_that_locks(file)
62
+ read, write = IO.pipe
63
+
64
+ child = Kernel.fork do
65
+ read.close
66
+ Puppet::FileSystem.exclusive_open(file, 0666, 'a') do |fh|
67
+ write.write(true)
68
+ write.close
69
+ sleep 10
70
+ end
71
+ end
72
+
73
+ write.close
74
+ read.read
75
+ read.close
76
+
77
+ child
78
+ end
79
+
80
+ def increment_counter_in_multiple_processes(file, num_procs, options)
81
+ children = []
82
+ num_procs.times do
83
+ children << Kernel.fork do
84
+ Puppet::FileSystem.exclusive_open(file, 0660, options) do |fh|
85
+ fh.rewind
86
+ contents = (fh.read || 0).to_i
87
+ fh.truncate(0)
88
+ fh.rewind
89
+ fh.write((contents + 1).to_s)
90
+ end
91
+ exit(0)
92
+ end
93
+ end
94
+
95
+ children.each { |pid| Process.wait(pid) }
96
+ end
97
+ end
98
+
99
+ describe "symlink",
100
+ :if => ! Puppet.features.manages_symlinks? &&
101
+ Puppet.features.microsoft_windows? do
102
+
103
+ let(:file) { tmpfile("somefile") }
104
+ let(:missing_file) { tmpfile("missingfile") }
105
+ let(:expected_msg) { "This version of Windows does not support symlinks. Windows Vista / 2008 or higher is required." }
106
+
107
+ before :each do
108
+ FileUtils.touch(file)
109
+ end
110
+
111
+ it "should raise an error when trying to create a symlink" do
112
+ expect { Puppet::FileSystem.symlink(file, 'foo') }.to raise_error(Puppet::Util::Windows::Error)
113
+ end
114
+
115
+ it "should return false when trying to check if a path is a symlink" do
116
+ Puppet::FileSystem.symlink?(file).should be_false
117
+ end
118
+
119
+ it "should raise an error when trying to read a symlink" do
120
+ expect { Puppet::FileSystem.readlink(file) }.to raise_error(Puppet::Util::Windows::Error)
121
+ end
122
+
123
+ it "should return a File::Stat instance when calling stat on an existing file" do
124
+ Puppet::FileSystem.stat(file).should be_instance_of(File::Stat)
125
+ end
126
+
127
+ it "should raise Errno::ENOENT when calling stat on a missing file" do
128
+ expect { Puppet::FileSystem.stat(missing_file) }.to raise_error(Errno::ENOENT)
129
+ end
130
+
131
+ it "should fall back to stat when trying to lstat a file" do
132
+ Puppet::Util::Windows::File.expects(:stat).with(Puppet::FileSystem.assert_path(file))
133
+
134
+ Puppet::FileSystem.lstat(file)
135
+ end
136
+ end
137
+
138
+ describe "symlink", :if => Puppet.features.manages_symlinks? do
139
+
140
+ let(:file) { tmpfile("somefile") }
141
+ let(:missing_file) { tmpfile("missingfile") }
142
+ let(:dir) { tmpdir("somedir") }
143
+
144
+ before :each do
145
+ FileUtils.touch(file)
146
+ end
147
+
148
+ it "should return true for exist? on a present file" do
149
+ Puppet::FileSystem.exist?(file).should be_true
150
+ end
151
+
152
+ it "should return true for file? on a present file" do
153
+ Puppet::FileSystem.file?(file).should be_true
154
+ end
155
+
156
+ it "should return false for exist? on a non-existant file" do
157
+ Puppet::FileSystem.exist?(missing_file).should be_false
158
+ end
159
+
160
+ it "should return true for exist? on a present directory" do
161
+ Puppet::FileSystem.exist?(dir).should be_true
162
+ end
163
+
164
+ it "should return false for exist? on a dangling symlink" do
165
+ symlink = tmpfile("somefile_link")
166
+ Puppet::FileSystem.symlink(missing_file, symlink)
167
+
168
+ Puppet::FileSystem.exist?(missing_file).should be_false
169
+ Puppet::FileSystem.exist?(symlink).should be_false
170
+ end
171
+
172
+ it "should return true for exist? on valid symlinks" do
173
+ [file, dir].each do |target|
174
+ symlink = tmpfile("#{Puppet::FileSystem.basename(target).to_s}_link")
175
+ Puppet::FileSystem.symlink(target, symlink)
176
+
177
+ Puppet::FileSystem.exist?(target).should be_true
178
+ Puppet::FileSystem.exist?(symlink).should be_true
179
+ end
180
+ end
181
+
182
+ it "should not create a symlink when the :noop option is specified" do
183
+ [file, dir].each do |target|
184
+ symlink = tmpfile("#{Puppet::FileSystem.basename(target)}_link")
185
+ Puppet::FileSystem.symlink(target, symlink, { :noop => true })
186
+
187
+ Puppet::FileSystem.exist?(target).should be_true
188
+ Puppet::FileSystem.exist?(symlink).should be_false
189
+ end
190
+ end
191
+
192
+ it "should raise Errno::EEXIST if trying to create a file / directory symlink when the symlink path already exists as a file" do
193
+ existing_file = tmpfile("#{Puppet::FileSystem.basename(file)}_link")
194
+ FileUtils.touch(existing_file)
195
+
196
+ [file, dir].each do |target|
197
+ expect { Puppet::FileSystem.symlink(target, existing_file) }.to raise_error(Errno::EEXIST)
198
+
199
+ Puppet::FileSystem.exist?(existing_file).should be_true
200
+ Puppet::FileSystem.symlink?(existing_file).should be_false
201
+ end
202
+ end
203
+
204
+ it "should silently fail if trying to create a file / directory symlink when the symlink path already exists as a directory" do
205
+ existing_dir = tmpdir("#{Puppet::FileSystem.basename(file)}_dir")
206
+
207
+ [file, dir].each do |target|
208
+ Puppet::FileSystem.symlink(target, existing_dir).should == 0
209
+
210
+ Puppet::FileSystem.exist?(existing_dir).should be_true
211
+ File.directory?(existing_dir).should be_true
212
+ Puppet::FileSystem.symlink?(existing_dir).should be_false
213
+ end
214
+ end
215
+
216
+ it "should silently fail to modify an existing directory symlink to reference a new file or directory" do
217
+ [file, dir].each do |target|
218
+ existing_dir = tmpdir("#{Puppet::FileSystem.basename(target)}_dir")
219
+ symlink = tmpfile("#{Puppet::FileSystem.basename(existing_dir)}_link")
220
+ Puppet::FileSystem.symlink(existing_dir, symlink)
221
+
222
+ Puppet::FileSystem.readlink(symlink).should == Puppet::FileSystem.path_string(existing_dir)
223
+
224
+ # now try to point it at the new target, no error raised, but file system unchanged
225
+ Puppet::FileSystem.symlink(target, symlink).should == 0
226
+ Puppet::FileSystem.readlink(symlink).should == existing_dir.to_s
227
+ end
228
+ end
229
+
230
+ it "should raise Errno::EEXIST if trying to modify a file symlink to reference a new file or directory" do
231
+ symlink = tmpfile("#{Puppet::FileSystem.basename(file)}_link")
232
+ file_2 = tmpfile("#{Puppet::FileSystem.basename(file)}_2")
233
+ FileUtils.touch(file_2)
234
+ # symlink -> file_2
235
+ Puppet::FileSystem.symlink(file_2, symlink)
236
+
237
+ [file, dir].each do |target|
238
+ expect { Puppet::FileSystem.symlink(target, symlink) }.to raise_error(Errno::EEXIST)
239
+ Puppet::FileSystem.readlink(symlink).should == file_2.to_s
240
+ end
241
+ end
242
+
243
+ it "should delete the existing file when creating a file / directory symlink with :force when the symlink path exists as a file" do
244
+ [file, dir].each do |target|
245
+ existing_file = tmpfile("#{Puppet::FileSystem.basename(target)}_existing")
246
+ FileUtils.touch(existing_file)
247
+ Puppet::FileSystem.symlink?(existing_file).should be_false
248
+
249
+ Puppet::FileSystem.symlink(target, existing_file, { :force => true })
250
+
251
+ Puppet::FileSystem.symlink?(existing_file).should be_true
252
+ Puppet::FileSystem.readlink(existing_file).should == target.to_s
253
+ end
254
+ end
255
+
256
+ it "should modify an existing file symlink when using :force to reference a new file or directory" do
257
+ [file, dir].each do |target|
258
+ existing_file = tmpfile("#{Puppet::FileSystem.basename(target)}_existing")
259
+ FileUtils.touch(existing_file)
260
+ existing_symlink = tmpfile("#{Puppet::FileSystem.basename(existing_file)}_link")
261
+ Puppet::FileSystem.symlink(existing_file, existing_symlink)
262
+
263
+ Puppet::FileSystem.readlink(existing_symlink).should == existing_file.to_s
264
+
265
+ Puppet::FileSystem.symlink(target, existing_symlink, { :force => true })
266
+
267
+ Puppet::FileSystem.readlink(existing_symlink).should == target.to_s
268
+ end
269
+ end
270
+
271
+ it "should silently fail if trying to overwrite an existing directory with a new symlink when using :force to reference a file or directory" do
272
+ [file, dir].each do |target|
273
+ existing_dir = tmpdir("#{Puppet::FileSystem.basename(target)}_existing")
274
+
275
+ Puppet::FileSystem.symlink(target, existing_dir, { :force => true }).should == 0
276
+
277
+ Puppet::FileSystem.symlink?(existing_dir).should be_false
278
+ end
279
+ end
280
+
281
+ it "should silently fail if trying to modify an existing directory symlink when using :force to reference a new file or directory" do
282
+ [file, dir].each do |target|
283
+ existing_dir = tmpdir("#{Puppet::FileSystem.basename(target)}_existing")
284
+ existing_symlink = tmpfile("#{Puppet::FileSystem.basename(existing_dir)}_link")
285
+ Puppet::FileSystem.symlink(existing_dir, existing_symlink)
286
+
287
+ Puppet::FileSystem.readlink(existing_symlink).should == existing_dir.to_s
288
+
289
+ Puppet::FileSystem.symlink(target, existing_symlink, { :force => true }).should == 0
290
+
291
+ Puppet::FileSystem.readlink(existing_symlink).should == existing_dir.to_s
292
+ end
293
+ end
294
+
295
+ it "should accept a string, Pathname or object with to_str (Puppet::Util::WatchedFile) for exist?" do
296
+ [ tmpfile('bogus1'),
297
+ Pathname.new(tmpfile('bogus2')),
298
+ Puppet::Util::WatchedFile.new(tmpfile('bogus3'))
299
+ ].each { |f| Puppet::FileSystem.exist?(f).should be_false }
300
+ end
301
+
302
+ it "should return a File::Stat instance when calling stat on an existing file" do
303
+ Puppet::FileSystem.stat(file).should be_instance_of(File::Stat)
304
+ end
305
+
306
+ it "should raise Errno::ENOENT when calling stat on a missing file" do
307
+ expect { Puppet::FileSystem.stat(missing_file) }.to raise_error(Errno::ENOENT)
308
+ end
309
+
310
+ it "should be able to create a symlink, and verify it with symlink?" do
311
+ symlink = tmpfile("somefile_link")
312
+ Puppet::FileSystem.symlink(file, symlink)
313
+
314
+ Puppet::FileSystem.symlink?(symlink).should be_true
315
+ end
316
+
317
+ it "should report symlink? as false on file, directory and missing files" do
318
+ [file, dir, missing_file].each do |f|
319
+ Puppet::FileSystem.symlink?(f).should be_false
320
+ end
321
+ end
322
+
323
+ it "should return a File::Stat with ftype 'link' when calling lstat on a symlink pointing to existing file" do
324
+ symlink = tmpfile("somefile_link")
325
+ Puppet::FileSystem.symlink(file, symlink)
326
+
327
+ stat = Puppet::FileSystem.lstat(symlink)
328
+ stat.should be_instance_of(File::Stat)
329
+ stat.ftype.should == 'link'
330
+ end
331
+
332
+ it "should return a File::Stat of ftype 'link' when calling lstat on a symlink pointing to missing file" do
333
+ symlink = tmpfile("somefile_link")
334
+ Puppet::FileSystem.symlink(missing_file, symlink)
335
+
336
+ stat = Puppet::FileSystem.lstat(symlink)
337
+ stat.should be_instance_of(File::Stat)
338
+ stat.ftype.should == 'link'
339
+ end
340
+
341
+ it "should return a File::Stat of ftype 'file' when calling stat on a symlink pointing to existing file" do
342
+ symlink = tmpfile("somefile_link")
343
+ Puppet::FileSystem.symlink(file, symlink)
344
+
345
+ stat = Puppet::FileSystem.stat(symlink)
346
+ stat.should be_instance_of(File::Stat)
347
+ stat.ftype.should == 'file'
348
+ end
349
+
350
+ it "should return a File::Stat of ftype 'directory' when calling stat on a symlink pointing to existing directory" do
351
+ symlink = tmpfile("somefile_link")
352
+ Puppet::FileSystem.symlink(dir, symlink)
353
+
354
+ stat = Puppet::FileSystem.stat(symlink)
355
+ stat.should be_instance_of(File::Stat)
356
+ stat.ftype.should == 'directory'
357
+
358
+ # on Windows, this won't get cleaned up if still linked
359
+ Puppet::FileSystem.unlink(symlink)
360
+ end
361
+
362
+ it "should return a File::Stat of ftype 'file' when calling stat on a symlink pointing to another symlink" do
363
+ # point symlink -> file
364
+ symlink = tmpfile("somefile_link")
365
+ Puppet::FileSystem.symlink(file, symlink)
366
+
367
+ # point symlink2 -> symlink
368
+ symlink2 = tmpfile("somefile_link2")
369
+ Puppet::FileSystem.symlink(symlink, symlink2)
370
+
371
+ Puppet::FileSystem.stat(symlink2).ftype.should == 'file'
372
+ end
373
+
374
+
375
+ it "should raise Errno::ENOENT when calling stat on a dangling symlink" do
376
+ symlink = tmpfile("somefile_link")
377
+ Puppet::FileSystem.symlink(missing_file, symlink)
378
+
379
+ expect { Puppet::FileSystem.stat(symlink) }.to raise_error(Errno::ENOENT)
380
+ end
381
+
382
+ it "should be able to readlink to resolve the physical path to a symlink" do
383
+ symlink = tmpfile("somefile_link")
384
+ Puppet::FileSystem.symlink(file, symlink)
385
+
386
+ Puppet::FileSystem.exist?(file).should be_true
387
+ Puppet::FileSystem.readlink(symlink).should == file.to_s
388
+ end
389
+
390
+ it "should not resolve entire symlink chain with readlink on a symlink'd symlink" do
391
+ # point symlink -> file
392
+ symlink = tmpfile("somefile_link")
393
+ Puppet::FileSystem.symlink(file, symlink)
394
+
395
+ # point symlink2 -> symlink
396
+ symlink2 = tmpfile("somefile_link2")
397
+ Puppet::FileSystem.symlink(symlink, symlink2)
398
+
399
+ Puppet::FileSystem.exist?(file).should be_true
400
+ Puppet::FileSystem.readlink(symlink2).should == symlink.to_s
401
+ end
402
+
403
+ it "should be able to readlink to resolve the physical path to a dangling symlink" do
404
+ symlink = tmpfile("somefile_link")
405
+ Puppet::FileSystem.symlink(missing_file, symlink)
406
+
407
+ Puppet::FileSystem.exist?(missing_file).should be_false
408
+ Puppet::FileSystem.readlink(symlink).should == missing_file.to_s
409
+ end
410
+
411
+ it "should delete only the symlink and not the target when calling unlink instance method" do
412
+ [file, dir].each do |target|
413
+ symlink = tmpfile("#{Puppet::FileSystem.basename(target)}_link")
414
+ Puppet::FileSystem.symlink(target, symlink)
415
+
416
+ Puppet::FileSystem.exist?(target).should be_true
417
+ Puppet::FileSystem.readlink(symlink).should == target.to_s
418
+
419
+ Puppet::FileSystem.unlink(symlink).should == 1 # count of files
420
+
421
+ Puppet::FileSystem.exist?(target).should be_true
422
+ Puppet::FileSystem.exist?(symlink).should be_false
423
+ end
424
+ end
425
+
426
+ it "should delete only the symlink and not the target when calling unlink class method" do
427
+ [file, dir].each do |target|
428
+ symlink = tmpfile("#{Puppet::FileSystem.basename(target)}_link")
429
+ Puppet::FileSystem.symlink(target, symlink)
430
+
431
+ Puppet::FileSystem.exist?(target).should be_true
432
+ Puppet::FileSystem.readlink(symlink).should == target.to_s
433
+
434
+ Puppet::FileSystem.unlink(symlink).should == 1 # count of files
435
+
436
+ Puppet::FileSystem.exist?(target).should be_true
437
+ Puppet::FileSystem.exist?(symlink).should be_false
438
+ end
439
+ end
440
+
441
+ describe "unlink" do
442
+ it "should delete files with unlink" do
443
+ Puppet::FileSystem.exist?(file).should be_true
444
+
445
+ Puppet::FileSystem.unlink(file).should == 1 # count of files
446
+
447
+ Puppet::FileSystem.exist?(file).should be_false
448
+ end
449
+
450
+ it "should delete files with unlink class method" do
451
+ Puppet::FileSystem.exist?(file).should be_true
452
+
453
+ Puppet::FileSystem.unlink(file).should == 1 # count of files
454
+
455
+ Puppet::FileSystem.exist?(file).should be_false
456
+ end
457
+
458
+ it "should delete multiple files with unlink class method" do
459
+ paths = (1..3).collect do |i|
460
+ f = tmpfile("somefile_#{i}")
461
+ FileUtils.touch(f)
462
+ Puppet::FileSystem.exist?(f).should be_true
463
+ f.to_s
464
+ end
465
+
466
+ Puppet::FileSystem.unlink(*paths).should == 3 # count of files
467
+
468
+ paths.each { |p| Puppet::FileSystem.exist?(p).should be_false }
469
+ end
470
+
471
+ it "should raise Errno::EPERM or Errno::EISDIR when trying to delete a directory with the unlink class method" do
472
+ Puppet::FileSystem.exist?(dir).should be_true
473
+
474
+ ex = nil
475
+ begin
476
+ Puppet::FileSystem.unlink(dir)
477
+ rescue Exception => e
478
+ ex = e
479
+ end
480
+
481
+ [
482
+ Errno::EPERM, # Windows and OSX
483
+ Errno::EISDIR # Linux
484
+ ].should include(ex.class)
485
+
486
+ Puppet::FileSystem.exist?(dir).should be_true
487
+ end
488
+ end
489
+
490
+ describe "exclusive_create" do
491
+ it "should create a file that doesn't exist" do
492
+ Puppet::FileSystem.exist?(missing_file).should be_false
493
+
494
+ Puppet::FileSystem.exclusive_create(missing_file, nil) {}
495
+
496
+ Puppet::FileSystem.exist?(missing_file).should be_true
497
+ end
498
+
499
+ it "should raise Errno::EEXIST creating a file that does exist" do
500
+ Puppet::FileSystem.exist?(file).should be_true
501
+
502
+ expect do
503
+ Puppet::FileSystem.exclusive_create(file, nil) {}
504
+ end.to raise_error(Errno::EEXIST)
505
+ end
506
+ end
507
+ end
508
+ end