puppet 3.2.4 → 3.3.0.rc2

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 (562) hide show
  1. data/COMMITTERS.md +101 -42
  2. data/Gemfile +15 -4
  3. data/README.md +5 -1
  4. data/README_DEVELOPER.md +117 -54
  5. data/Rakefile +4 -0
  6. data/ext/build_defaults.yaml +3 -2
  7. data/ext/debian/puppet-common.manpages +33 -1
  8. data/ext/gentoo/init.d/puppet +1 -1
  9. data/ext/gentoo/init.d/puppetmaster +1 -1
  10. data/ext/redhat/puppet.spec.erb +0 -1
  11. data/install.rb +2 -1
  12. data/lib/hiera/backend/puppet_backend.rb +1 -1
  13. data/lib/puppet/application.rb +10 -9
  14. data/lib/puppet/application/agent.rb +87 -93
  15. data/lib/puppet/application/apply.rb +0 -2
  16. data/lib/puppet/application/device.rb +3 -3
  17. data/lib/puppet/application/kick.rb +2 -2
  18. data/lib/puppet/application/master.rb +41 -19
  19. data/lib/puppet/application/queue.rb +5 -3
  20. data/lib/puppet/bindings.rb +147 -0
  21. data/lib/puppet/configurer.rb +25 -15
  22. data/lib/puppet/configurer/fact_handler.rb +2 -9
  23. data/lib/puppet/daemon.rb +44 -33
  24. data/lib/puppet/defaults.rb +57 -26
  25. data/lib/puppet/error.rb +1 -1
  26. data/lib/puppet/external/dot.rb +2 -2
  27. data/lib/puppet/external/nagios/base.rb +1 -6
  28. data/lib/puppet/external/pson/common.rb +2 -2
  29. data/lib/puppet/external/pson/pure/generator.rb +2 -2
  30. data/lib/puppet/external/pson/pure/parser.rb +1 -1
  31. data/lib/puppet/face/ca.rb +1 -1
  32. data/lib/puppet/face/config.rb +1 -1
  33. data/lib/puppet/face/help.rb +2 -2
  34. data/lib/puppet/face/module/list.rb +2 -2
  35. data/lib/puppet/feature/rails.rb +1 -1
  36. data/lib/puppet/file_bucket/dipper.rb +0 -1
  37. data/lib/puppet/file_serving/base.rb +1 -1
  38. data/lib/puppet/file_serving/configuration/parser.rb +20 -14
  39. data/lib/puppet/forge.rb +0 -32
  40. data/lib/puppet/forge/cache.rb +1 -1
  41. data/lib/puppet/forge/errors.rb +3 -3
  42. data/lib/puppet/forge/repository.rb +7 -42
  43. data/lib/puppet/graph.rb +11 -0
  44. data/lib/puppet/graph/key.rb +26 -0
  45. data/lib/puppet/graph/prioritizer.rb +29 -0
  46. data/lib/puppet/graph/random_prioritizer.rb +16 -0
  47. data/lib/puppet/{rb_tree_map.rb → graph/rb_tree_map.rb} +3 -3
  48. data/lib/puppet/graph/relationship_graph.rb +246 -0
  49. data/lib/puppet/graph/sequential_prioritizer.rb +31 -0
  50. data/lib/puppet/{simple_graph.rb → graph/simple_graph.rb} +22 -3
  51. data/lib/puppet/graph/title_hash_prioritizer.rb +16 -0
  52. data/lib/puppet/indirector.rb +2 -2
  53. data/lib/puppet/indirector/catalog/compiler.rb +10 -7
  54. data/lib/puppet/indirector/catalog/static_compiler.rb +50 -0
  55. data/lib/puppet/indirector/certificate/rest.rb +1 -1
  56. data/lib/puppet/indirector/exec.rb +1 -1
  57. data/lib/puppet/indirector/facts/facter.rb +2 -2
  58. data/lib/puppet/indirector/facts/inventory_active_record.rb +0 -1
  59. data/lib/puppet/indirector/facts/network_device.rb +1 -1
  60. data/lib/puppet/indirector/file_bucket_file/file.rb +0 -1
  61. data/lib/puppet/indirector/indirection.rb +2 -2
  62. data/lib/puppet/indirector/memory.rb +9 -0
  63. data/lib/puppet/indirector/node/ldap.rb +2 -4
  64. data/lib/puppet/indirector/report/processor.rb +1 -2
  65. data/lib/puppet/indirector/report/rest.rb +1 -1
  66. data/lib/puppet/indirector/request.rb +32 -10
  67. data/lib/puppet/indirector/resource/rest.rb +1 -1
  68. data/lib/puppet/indirector/resource_type/parser.rb +31 -12
  69. data/lib/puppet/interface.rb +1 -1
  70. data/lib/puppet/interface/documentation.rb +7 -11
  71. data/lib/puppet/interface/option.rb +1 -1
  72. data/lib/puppet/interface/option_builder.rb +1 -1
  73. data/lib/puppet/metatype/manager.rb +2 -2
  74. data/lib/puppet/module.rb +7 -1
  75. data/lib/puppet/module_tool.rb +1 -1
  76. data/lib/puppet/module_tool/applications/application.rb +10 -0
  77. data/lib/puppet/module_tool/applications/installer.rb +6 -3
  78. data/lib/puppet/module_tool/dependency.rb +2 -0
  79. data/lib/puppet/module_tool/errors/upgrader.rb +1 -1
  80. data/lib/puppet/module_tool/metadata.rb +25 -13
  81. data/lib/puppet/module_tool/modulefile.rb +7 -7
  82. data/lib/puppet/module_tool/shared_behaviors.rb +4 -2
  83. data/lib/puppet/module_tool/skeleton.rb +1 -1
  84. data/lib/puppet/module_tool/skeleton/templates/generator/manifests/init.pp.erb +5 -5
  85. data/lib/puppet/module_tool/skeleton/templates/generator/tests/init.pp.erb +5 -4
  86. data/lib/puppet/network/auth_config_parser.rb +3 -0
  87. data/lib/puppet/network/authconfig.rb +0 -1
  88. data/lib/puppet/network/authorization.rb +1 -1
  89. data/lib/puppet/network/authstore.rb +2 -2
  90. data/lib/puppet/network/format_handler.rb +25 -114
  91. data/lib/puppet/network/format_support.rb +106 -0
  92. data/lib/puppet/network/formats.rb +10 -4
  93. data/lib/puppet/network/http/compression.rb +1 -1
  94. data/lib/puppet/network/http/connection.rb +76 -32
  95. data/lib/puppet/network/http/handler.rb +122 -61
  96. data/lib/puppet/network/http/rack/rest.rb +1 -1
  97. data/lib/puppet/network/http/webrick/rest.rb +9 -3
  98. data/lib/puppet/network/http_pool.rb +2 -2
  99. data/lib/puppet/network/resolver.rb +1 -0
  100. data/lib/puppet/network/server.rb +5 -81
  101. data/lib/puppet/node/environment.rb +256 -13
  102. data/lib/puppet/node/facts.rb +28 -2
  103. data/lib/puppet/parameter.rb +27 -18
  104. data/lib/puppet/parameter/boolean.rb +20 -0
  105. data/lib/puppet/parameter/path.rb +1 -1
  106. data/lib/puppet/parameter/value.rb +1 -1
  107. data/lib/puppet/parameter/value_collection.rb +1 -1
  108. data/lib/puppet/parser/ast/arithmetic_operator.rb +8 -0
  109. data/lib/puppet/parser/ast/casestatement.rb +0 -3
  110. data/lib/puppet/parser/ast/lambda.rb +25 -6
  111. data/lib/puppet/parser/ast/leaf.rb +10 -3
  112. data/lib/puppet/parser/ast/nop.rb +1 -1
  113. data/lib/puppet/parser/ast/resource_override.rb +0 -2
  114. data/lib/puppet/parser/compiler.rb +92 -34
  115. data/lib/puppet/parser/files.rb +0 -5
  116. data/lib/puppet/parser/functions/create_resources.rb +23 -46
  117. data/lib/puppet/parser/functions/each.rb +0 -2
  118. data/lib/puppet/parser/functions/extlookup.rb +2 -2
  119. data/lib/puppet/parser/functions/foreach.rb +0 -2
  120. data/lib/puppet/parser/functions/hiera_include.rb +1 -1
  121. data/lib/puppet/parser/functions/lookup.rb +44 -0
  122. data/lib/puppet/parser/functions/slice.rb +1 -1
  123. data/lib/puppet/parser/grammar.ra +0 -1
  124. data/lib/puppet/parser/lexer.rb +0 -1
  125. data/lib/puppet/parser/parser.rb +0 -1
  126. data/lib/puppet/parser/parser_factory.rb +3 -2
  127. data/lib/puppet/parser/parser_support.rb +1 -1
  128. data/lib/puppet/parser/relationship.rb +1 -1
  129. data/lib/puppet/parser/scope.rb +49 -24
  130. data/lib/puppet/parser/type_loader.rb +13 -18
  131. data/lib/puppet/pops.rb +45 -0
  132. data/lib/puppet/pops/adaptable.rb +2 -2
  133. data/lib/puppet/pops/adapters.rb +4 -0
  134. data/lib/puppet/pops/binder/binder.rb +421 -0
  135. data/lib/puppet/pops/binder/binder_issues.rb +142 -0
  136. data/lib/puppet/pops/binder/bindings_checker.rb +217 -0
  137. data/lib/puppet/pops/binder/bindings_composer.rb +241 -0
  138. data/lib/puppet/pops/binder/bindings_factory.rb +847 -0
  139. data/lib/puppet/pops/binder/bindings_label_provider.rb +46 -0
  140. data/lib/puppet/pops/binder/bindings_loader.rb +79 -0
  141. data/lib/puppet/pops/binder/bindings_model.rb +215 -0
  142. data/lib/puppet/pops/binder/bindings_model_dumper.rb +205 -0
  143. data/lib/puppet/pops/binder/bindings_validator_factory.rb +28 -0
  144. data/lib/puppet/pops/binder/config/binder_config.rb +139 -0
  145. data/lib/puppet/pops/binder/config/binder_config_checker.rb +183 -0
  146. data/lib/puppet/pops/binder/config/diagnostic_producer.rb +32 -0
  147. data/lib/puppet/pops/binder/config/issues.rb +106 -0
  148. data/lib/puppet/pops/binder/hiera2.rb +10 -0
  149. data/lib/puppet/pops/binder/hiera2/bindings_provider.rb +148 -0
  150. data/lib/puppet/pops/binder/hiera2/config.rb +69 -0
  151. data/lib/puppet/pops/binder/hiera2/config_checker.rb +68 -0
  152. data/lib/puppet/pops/binder/hiera2/diagnostic_producer.rb +36 -0
  153. data/lib/puppet/pops/binder/hiera2/issues.rb +67 -0
  154. data/lib/puppet/pops/binder/hiera2/json_backend.rb +18 -0
  155. data/lib/puppet/pops/binder/hiera2/yaml_backend.rb +21 -0
  156. data/lib/puppet/pops/binder/injector.rb +688 -0
  157. data/lib/puppet/pops/binder/injector_entry.rb +53 -0
  158. data/lib/puppet/pops/binder/key_factory.rb +61 -0
  159. data/lib/puppet/pops/binder/producers.rb +829 -0
  160. data/lib/puppet/pops/binder/scheme_handler/confdir_hiera_scheme.rb +67 -0
  161. data/lib/puppet/pops/binder/scheme_handler/confdir_scheme.rb +34 -0
  162. data/lib/puppet/pops/binder/scheme_handler/module_hiera_scheme.rb +92 -0
  163. data/lib/puppet/pops/binder/scheme_handler/module_scheme.rb +84 -0
  164. data/lib/puppet/pops/binder/scheme_handler/symbolic_scheme.rb +54 -0
  165. data/lib/puppet/pops/binder/system_bindings.rb +72 -0
  166. data/lib/puppet/pops/issue_reporter.rb +75 -0
  167. data/lib/puppet/pops/issues.rb +9 -5
  168. data/lib/puppet/pops/model/ast_transformer.rb +4 -4
  169. data/lib/puppet/pops/model/ast_tree_dumper.rb +1 -1
  170. data/lib/puppet/pops/model/factory.rb +25 -13
  171. data/lib/puppet/pops/model/model.rb +1 -1
  172. data/lib/puppet/pops/model/tree_dumper.rb +2 -2
  173. data/lib/puppet/pops/parser/egrammar.ra +0 -1
  174. data/lib/puppet/pops/parser/eparser.rb +1 -2
  175. data/lib/puppet/pops/parser/evaluating_parser.rb +162 -0
  176. data/lib/puppet/pops/parser/lexer.rb +8 -6
  177. data/lib/puppet/pops/types/class_loader.rb +118 -0
  178. data/lib/puppet/pops/types/type_calculator.rb +557 -0
  179. data/lib/puppet/pops/types/type_factory.rb +147 -0
  180. data/lib/puppet/pops/types/type_parser.rb +117 -0
  181. data/lib/puppet/pops/types/types.rb +132 -0
  182. data/lib/puppet/pops/validation.rb +146 -17
  183. data/lib/puppet/pops/validation/checker3_1.rb +1 -1
  184. data/lib/puppet/pops/validation/validator_factory_3_1.rb +6 -16
  185. data/lib/puppet/property.rb +3 -3
  186. data/lib/puppet/property/keyvalue.rb +1 -1
  187. data/lib/puppet/provider.rb +2 -2
  188. data/lib/puppet/provider/aixobject.rb +19 -21
  189. data/lib/puppet/provider/augeas/augeas.rb +3 -1
  190. data/lib/puppet/provider/command.rb +2 -2
  191. data/lib/puppet/provider/group/aix.rb +1 -1
  192. data/lib/puppet/provider/group/ldap.rb +1 -1
  193. data/lib/puppet/provider/macauthorization/macauthorization.rb +1 -1
  194. data/lib/puppet/provider/mailalias/aliases.rb +3 -8
  195. data/lib/puppet/provider/mcx/mcxcontent.rb +7 -1
  196. data/lib/puppet/provider/mount.rb +8 -3
  197. data/lib/puppet/provider/nameservice.rb +1 -1
  198. data/lib/puppet/provider/nameservice/directoryservice.rb +5 -5
  199. data/lib/puppet/provider/package/appdmg.rb +1 -1
  200. data/lib/puppet/provider/package/apt.rb +0 -1
  201. data/lib/puppet/provider/package/dpkg.rb +86 -32
  202. data/lib/puppet/provider/package/fink.rb +0 -2
  203. data/lib/puppet/provider/package/freebsd.rb +0 -2
  204. data/lib/puppet/provider/package/openbsd.rb +57 -10
  205. data/lib/puppet/provider/package/opkg.rb +0 -1
  206. data/lib/puppet/provider/package/pacman.rb +0 -1
  207. data/lib/puppet/provider/package/pip.rb +1 -1
  208. data/lib/puppet/provider/package/pkgdmg.rb +17 -6
  209. data/lib/puppet/provider/package/pkgutil.rb +1 -1
  210. data/lib/puppet/provider/package/portage.rb +9 -1
  211. data/lib/puppet/provider/package/ports.rb +2 -2
  212. data/lib/puppet/provider/package/rpm.rb +29 -12
  213. data/lib/puppet/provider/package/rug.rb +1 -1
  214. data/lib/puppet/provider/package/urpmi.rb +11 -15
  215. data/lib/puppet/provider/package/windows/exe_package.rb +1 -1
  216. data/lib/puppet/provider/package/windows/package.rb +1 -26
  217. data/lib/puppet/provider/package/yum.rb +1 -1
  218. data/lib/puppet/provider/package/zypper.rb +22 -3
  219. data/lib/puppet/provider/parsedfile.rb +1 -12
  220. data/lib/puppet/provider/scheduled_task/win32_taskscheduler.rb +1 -1
  221. data/lib/puppet/provider/service/base.rb +1 -1
  222. data/lib/puppet/provider/service/daemontools.rb +3 -3
  223. data/lib/puppet/provider/service/debian.rb +1 -1
  224. data/lib/puppet/provider/service/init.rb +14 -20
  225. data/lib/puppet/provider/service/openrc.rb +3 -1
  226. data/lib/puppet/provider/service/redhat.rb +5 -8
  227. data/lib/puppet/provider/service/runit.rb +3 -2
  228. data/lib/puppet/provider/service/systemd.rb +1 -1
  229. data/lib/puppet/provider/ssh_authorized_key/parsed.rb +1 -1
  230. data/lib/puppet/provider/sshkey/parsed.rb +0 -2
  231. data/lib/puppet/provider/user/aix.rb +25 -12
  232. data/lib/puppet/provider/user/directoryservice.rb +4 -7
  233. data/lib/puppet/provider/user/ldap.rb +0 -1
  234. data/lib/puppet/provider/user/user_role_add.rb +2 -0
  235. data/lib/puppet/provider/user/useradd.rb +1 -1
  236. data/lib/puppet/provider/zone/solaris.rb +1 -2
  237. data/lib/puppet/reference/metaparameter.rb +1 -1
  238. data/lib/puppet/reference/type.rb +1 -1
  239. data/lib/puppet/reports/rrdgraph.rb +1 -1
  240. data/lib/puppet/reports/tagmail.rb +1 -1
  241. data/lib/puppet/resource.rb +16 -4
  242. data/lib/puppet/resource/catalog.rb +111 -173
  243. data/lib/puppet/resource/status.rb +42 -3
  244. data/lib/puppet/resource/type.rb +33 -46
  245. data/lib/puppet/resource/type_collection.rb +19 -15
  246. data/lib/puppet/run.rb +5 -1
  247. data/lib/puppet/scheduler/scheduler.rb +14 -15
  248. data/lib/puppet/settings.rb +78 -41
  249. data/lib/puppet/settings/boolean_setting.rb +0 -2
  250. data/lib/puppet/settings/config_file.rb +0 -2
  251. data/lib/puppet/settings/directory_setting.rb +0 -2
  252. data/lib/puppet/settings/duration_setting.rb +0 -2
  253. data/lib/puppet/settings/enum_setting.rb +16 -0
  254. data/lib/puppet/settings/file_setting.rb +0 -2
  255. data/lib/puppet/settings/path_setting.rb +0 -2
  256. data/lib/puppet/settings/string_setting.rb +0 -3
  257. data/lib/puppet/settings/terminus_setting.rb +0 -2
  258. data/lib/puppet/ssl/certificate_authority.rb +102 -9
  259. data/lib/puppet/test/test_helper.rb +1 -0
  260. data/lib/puppet/transaction.rb +130 -292
  261. data/lib/puppet/transaction/additional_resource_generator.rb +126 -0
  262. data/lib/puppet/transaction/event.rb +16 -1
  263. data/lib/puppet/transaction/report.rb +34 -14
  264. data/lib/puppet/transaction/resource_harness.rb +16 -19
  265. data/lib/puppet/type.rb +59 -53
  266. data/lib/puppet/type/component.rb +0 -2
  267. data/lib/puppet/type/cron.rb +13 -2
  268. data/lib/puppet/type/exec.rb +5 -7
  269. data/lib/puppet/type/file.rb +9 -32
  270. data/lib/puppet/type/file/content.rb +4 -1
  271. data/lib/puppet/type/file/ctime.rb +3 -1
  272. data/lib/puppet/type/file/ensure.rb +1 -1
  273. data/lib/puppet/type/file/mode.rb +0 -1
  274. data/lib/puppet/type/file/mtime.rb +2 -1
  275. data/lib/puppet/type/group.rb +7 -9
  276. data/lib/puppet/type/host.rb +1 -2
  277. data/lib/puppet/type/mcx.rb +0 -1
  278. data/lib/puppet/type/mount.rb +38 -6
  279. data/lib/puppet/type/package.rb +2 -2
  280. data/lib/puppet/type/resources.rb +5 -4
  281. data/lib/puppet/type/schedule.rb +1 -4
  282. data/lib/puppet/type/selmodule.rb +1 -1
  283. data/lib/puppet/type/service.rb +1 -3
  284. data/lib/puppet/type/tidy.rb +3 -3
  285. data/lib/puppet/type/user.rb +9 -13
  286. data/lib/puppet/type/yumrepo.rb +11 -7
  287. data/lib/puppet/util.rb +14 -7
  288. data/lib/puppet/util/autoload.rb +0 -1
  289. data/lib/puppet/util/backups.rb +1 -3
  290. data/lib/puppet/util/classgen.rb +1 -1
  291. data/lib/puppet/util/command_line/puppet_option_parser.rb +1 -3
  292. data/lib/puppet/util/command_line/trollop.rb +1 -1
  293. data/lib/puppet/util/constant_inflector.rb +1 -2
  294. data/lib/puppet/util/errors.rb +1 -0
  295. data/lib/puppet/util/file_watcher.rb +28 -0
  296. data/lib/puppet/util/fileparsing.rb +1 -3
  297. data/lib/puppet/util/filetype.rb +0 -1
  298. data/lib/puppet/util/http_proxy.rb +38 -0
  299. data/lib/puppet/util/ldap/manager.rb +1 -2
  300. data/lib/puppet/util/log.rb +31 -10
  301. data/lib/puppet/util/log/destinations.rb +0 -50
  302. data/lib/puppet/util/metric.rb +8 -1
  303. data/lib/puppet/util/monkey_patches.rb +14 -148
  304. data/lib/puppet/util/network_device/cisco/facts.rb +1 -1
  305. data/lib/puppet/util/network_device/config.rb +6 -9
  306. data/lib/puppet/util/network_device/transport/ssh.rb +1 -1
  307. data/lib/puppet/util/pidlock.rb +3 -0
  308. data/lib/puppet/util/posix.rb +1 -1
  309. data/lib/puppet/util/profiler.rb +1 -1
  310. data/lib/puppet/util/rdoc.rb +1 -1
  311. data/lib/puppet/util/rdoc/generators/puppet_generator.rb +0 -1
  312. data/lib/puppet/util/rdoc/generators/template/puppet/puppet.rb +50 -42
  313. data/lib/puppet/util/retryaction.rb +0 -1
  314. data/lib/puppet/util/symbolic_file_mode.rb +5 -1
  315. data/lib/puppet/util/tagging.rb +0 -2
  316. data/lib/puppet/util/warnings.rb +3 -0
  317. data/lib/puppet/util/watched_file.rb +37 -0
  318. data/lib/puppet/util/watcher.rb +17 -0
  319. data/lib/puppet/util/watcher/change_watcher.rb +33 -0
  320. data/lib/puppet/util/watcher/periodic_watcher.rb +37 -0
  321. data/lib/puppet/util/watcher/timer.rb +19 -0
  322. data/lib/puppet/util/windows/user.rb +1 -1
  323. data/lib/puppet/version.rb +1 -1
  324. data/lib/puppetx.rb +109 -0
  325. data/lib/puppetx/puppet/bindings_scheme_handler.rb +130 -0
  326. data/lib/puppetx/puppet/hiera2_backend.rb +31 -0
  327. data/lib/puppetx/puppet/syntax_checker.rb +91 -0
  328. data/lib/puppetx/puppetlabs/syntax_checkers/json.rb +39 -0
  329. data/lib/semver.rb +1 -1
  330. data/man/man8/puppet-kick.8 +1 -1
  331. data/spec/fixtures/integration/provider/cron/crontab/unspecialized +15 -0
  332. data/spec/fixtures/unit/pops/binder/bindings_composer/hiera1config/binder_config.yaml +18 -0
  333. data/spec/fixtures/unit/pops/binder/bindings_composer/hiera1config/hiera.yaml +8 -0
  334. data/spec/fixtures/unit/pops/binder/bindings_composer/hiera1config/modules/good/common.yaml +1 -0
  335. data/spec/fixtures/unit/pops/binder/bindings_composer/hiera1config/modules/good/hiera.yaml +10 -0
  336. data/spec/fixtures/unit/pops/binder/bindings_composer/ok/binder_config.yaml +19 -0
  337. data/spec/fixtures/unit/pops/binder/bindings_composer/ok/common.yaml +1 -0
  338. data/spec/fixtures/unit/pops/binder/bindings_composer/ok/hiera.yaml +11 -0
  339. data/spec/fixtures/unit/pops/binder/bindings_composer/ok/localhost.yaml +1 -0
  340. data/spec/fixtures/unit/pops/binder/bindings_composer/ok/modules/awesome/common.yaml +3 -0
  341. data/spec/fixtures/unit/pops/binder/bindings_composer/ok/modules/awesome/hiera.yaml +13 -0
  342. data/spec/fixtures/unit/pops/binder/bindings_composer/ok/modules/awesome/lib/puppet/bindings/awesome/default.rb +4 -0
  343. data/spec/fixtures/unit/pops/binder/bindings_composer/ok/modules/awesome/lib/puppetx/awesome/echo_backend.rb +11 -0
  344. data/spec/fixtures/unit/pops/binder/bindings_composer/ok/modules/awesome/lib/puppetx/awesome/echo_scheme_handler.rb +18 -0
  345. data/spec/fixtures/unit/pops/binder/bindings_composer/ok/modules/awesome/localhost.yaml +1 -0
  346. data/spec/fixtures/unit/pops/binder/bindings_composer/ok/modules/bad/common.yaml +3 -0
  347. data/spec/fixtures/unit/pops/binder/bindings_composer/ok/modules/bad/hiera_config.yaml +9 -0
  348. data/spec/fixtures/unit/pops/binder/bindings_composer/ok/modules/good/common.yaml +2 -0
  349. data/spec/fixtures/unit/pops/binder/bindings_composer/ok/modules/good/hiera.yaml +11 -0
  350. data/spec/fixtures/unit/pops/binder/config/binder_config/ok/binder_config.yaml +9 -0
  351. data/spec/fixtures/unit/pops/binder/hiera2/bindings_provider/ok/hiera.yaml +9 -0
  352. data/spec/fixtures/unit/pops/binder/hiera2/bindings_provider/ok/node.example.com.json +9 -0
  353. data/spec/fixtures/unit/pops/binder/hiera2/bindings_provider/ok/node.example.com.yaml +5 -0
  354. data/spec/fixtures/unit/pops/binder/hiera2/config/bad_syntax/hiera.yaml +10 -0
  355. data/spec/fixtures/unit/pops/binder/hiera2/config/malformed_hierarchy/hiera.yaml +8 -0
  356. data/spec/fixtures/unit/pops/binder/hiera2/config/missing/foo.txt +1 -0
  357. data/spec/fixtures/unit/pops/binder/hiera2/config/no_backends/hiera.yaml +7 -0
  358. data/spec/fixtures/unit/pops/binder/hiera2/config/no_hierarchy/hiera.yaml +4 -0
  359. data/spec/fixtures/unit/pops/binder/hiera2/config/not_a_hash/hiera.yaml +2 -0
  360. data/spec/fixtures/unit/pops/binder/hiera2/config/ok/hiera.yaml +8 -0
  361. data/spec/fixtures/unit/pops/binder/hiera2/yaml_backend/empty/common.yaml +0 -0
  362. data/spec/fixtures/unit/pops/binder/hiera2/yaml_backend/invalid/common.yaml +1 -0
  363. data/spec/fixtures/unit/pops/binder/hiera2/yaml_backend/ok/common.yaml +2 -0
  364. data/spec/fixtures/unit/provider/package/openbsd/pkginfo_flavors.list +2 -0
  365. data/spec/integration/agent/logging_spec.rb +178 -0
  366. data/spec/integration/configurer_spec.rb +1 -1
  367. data/spec/integration/defaults_spec.rb +0 -6
  368. data/spec/integration/network/authconfig_spec.rb +19 -0
  369. data/spec/integration/network/server/webrick_spec.rb +10 -11
  370. data/spec/integration/parser/catalog_spec.rb +85 -0
  371. data/spec/integration/provider/cron/crontab_spec.rb +11 -0
  372. data/spec/integration/provider/mount_spec.rb +1 -0
  373. data/spec/integration/transaction_spec.rb +8 -8
  374. data/spec/integration/type/file_spec.rb +1 -1
  375. data/spec/integration/util/settings_spec.rb +58 -11
  376. data/spec/lib/matchers/include_in_order.rb +21 -0
  377. data/spec/lib/matchers/include_in_order_spec.rb +30 -0
  378. data/spec/lib/matchers/relationship_graph_matchers.rb +48 -0
  379. data/spec/lib/puppet_spec/compiler.rb +24 -0
  380. data/spec/lib/puppet_spec/pops.rb +16 -0
  381. data/spec/spec_helper.rb +0 -1
  382. data/spec/unit/application/agent_spec.rb +145 -145
  383. data/spec/unit/application/apply_spec.rb +1 -1
  384. data/spec/unit/application/doc_spec.rb +1 -1
  385. data/spec/unit/application/face_base_spec.rb +3 -3
  386. data/spec/unit/application/facts_spec.rb +1 -0
  387. data/spec/unit/application/master_spec.rb +0 -15
  388. data/spec/unit/application/queue_spec.rb +6 -12
  389. data/spec/unit/application/resource_spec.rb +1 -1
  390. data/spec/unit/configurer/fact_handler_spec.rb +19 -50
  391. data/spec/unit/configurer_spec.rb +23 -7
  392. data/spec/unit/daemon_spec.rb +97 -121
  393. data/spec/unit/defaults_spec.rb +44 -0
  394. data/spec/unit/face/node_spec.rb +2 -2
  395. data/spec/unit/file_serving/configuration/parser_spec.rb +23 -33
  396. data/spec/unit/file_serving/configuration_spec.rb +2 -2
  397. data/spec/unit/file_serving/mount/file_spec.rb +4 -4
  398. data/spec/unit/forge/repository_spec.rb +9 -29
  399. data/spec/unit/graph/key_spec.rb +41 -0
  400. data/spec/unit/{rb_tree_map_spec.rb → graph/rb_tree_map_spec.rb} +7 -7
  401. data/spec/unit/graph/relationship_graph_spec.rb +393 -0
  402. data/spec/unit/graph/sequential_prioritizer_spec.rb +32 -0
  403. data/spec/unit/{simple_graph_spec.rb → graph/simple_graph.rb} +42 -254
  404. data/spec/unit/graph/title_hash_prioritizer_spec.rb +49 -0
  405. data/spec/unit/hiera_puppet_spec.rb +1 -1
  406. data/spec/unit/indirector/catalog/active_record_spec.rb +4 -2
  407. data/spec/unit/indirector/catalog/compiler_spec.rb +20 -26
  408. data/spec/unit/indirector/face_spec.rb +1 -1
  409. data/spec/unit/indirector/facts/facter_spec.rb +11 -1
  410. data/spec/unit/indirector/facts/network_device_spec.rb +11 -1
  411. data/spec/unit/indirector/hiera_spec.rb +1 -1
  412. data/spec/unit/indirector/instrumentation_data/local_spec.rb +1 -1
  413. data/spec/unit/indirector/instrumentation_listener/local_spec.rb +1 -1
  414. data/spec/unit/indirector/request_spec.rb +92 -39
  415. data/spec/unit/indirector/rest_spec.rb +1 -0
  416. data/spec/unit/indirector_spec.rb +2 -2
  417. data/spec/unit/interface/option_builder_spec.rb +1 -0
  418. data/spec/unit/interface/option_spec.rb +1 -0
  419. data/spec/unit/interface_spec.rb +2 -2
  420. data/spec/unit/module_tool/applications/installer_spec.rb +49 -2
  421. data/spec/unit/module_tool/metadata_spec.rb +13 -0
  422. data/spec/unit/network/authstore_spec.rb +1 -1
  423. data/spec/unit/network/format_handler_spec.rb +33 -282
  424. data/spec/unit/network/format_support_spec.rb +199 -0
  425. data/spec/unit/network/formats_spec.rb +2 -2
  426. data/spec/unit/network/http/connection_spec.rb +88 -7
  427. data/spec/unit/network/http/handler_spec.rb +271 -249
  428. data/spec/unit/network/http/rack/rest_spec.rb +1 -1
  429. data/spec/unit/network/http/webrick/rest_spec.rb +73 -22
  430. data/spec/unit/network/http_pool_spec.rb +40 -0
  431. data/spec/unit/network/server_spec.rb +18 -207
  432. data/spec/unit/node/facts_spec.rb +68 -17
  433. data/spec/unit/other/selinux_spec.rb +24 -20
  434. data/spec/unit/parameter/boolean_spec.rb +25 -0
  435. data/spec/unit/parameter/value_collection_spec.rb +7 -7
  436. data/spec/unit/parameter_spec.rb +10 -13
  437. data/spec/unit/parser/ast/function_spec.rb +4 -4
  438. data/spec/unit/parser/ast/leaf_spec.rb +45 -6
  439. data/spec/unit/parser/collector_spec.rb +3 -3
  440. data/spec/unit/parser/compiler_spec.rb +4 -3
  441. data/spec/unit/parser/functions/create_resources_spec.rb +9 -25
  442. data/spec/unit/parser/functions/extlookup_spec.rb +2 -2
  443. data/spec/unit/parser/functions/hiera_include_spec.rb +12 -0
  444. data/spec/unit/parser/functions/lookup_spec.rb +96 -0
  445. data/spec/unit/parser/functions/regsubst_spec.rb +2 -2
  446. data/spec/unit/parser/functions/split_spec.rb +2 -2
  447. data/spec/unit/parser/functions/sprintf_spec.rb +1 -1
  448. data/spec/unit/parser/functions/versioncmp_spec.rb +2 -2
  449. data/spec/unit/parser/functions_spec.rb +7 -7
  450. data/spec/unit/parser/lexer_spec.rb +1 -1
  451. data/spec/unit/parser/methods/collect_spec.rb +43 -0
  452. data/spec/unit/parser/resource_spec.rb +9 -9
  453. data/spec/unit/parser/scope_spec.rb +45 -2
  454. data/spec/unit/parser/type_loader_spec.rb +159 -175
  455. data/spec/unit/pops/binder/binder_spec.rb +62 -0
  456. data/spec/unit/pops/binder/bindings_checker_spec.rb +196 -0
  457. data/spec/unit/pops/binder/bindings_composer_spec.rb +89 -0
  458. data/spec/unit/pops/binder/bindings_validator_factory_spec.rb +18 -0
  459. data/spec/unit/pops/binder/config/binder_config_spec.rb +48 -0
  460. data/spec/unit/pops/binder/hiera2/bindings_provider_spec.rb +74 -0
  461. data/spec/unit/pops/binder/hiera2/config_spec.rb +61 -0
  462. data/spec/unit/pops/binder/hiera2/yaml_backend_spec.rb +33 -0
  463. data/spec/unit/pops/binder/injector_spec.rb +789 -0
  464. data/spec/unit/pops/containment_spec.rb +1 -0
  465. data/spec/unit/pops/issues_spec.rb +1 -1
  466. data/spec/unit/pops/parser/evaluating_parser_spec.rb +88 -0
  467. data/spec/unit/pops/parser/lexer_spec.rb +1 -1
  468. data/spec/unit/pops/parser/parse_calls_spec.rb +4 -0
  469. data/spec/unit/pops/parser/parser_spec.rb +1 -1
  470. data/spec/unit/pops/types/type_calculator_spec.rb +484 -0
  471. data/spec/unit/pops/types/type_factory_spec.rb +65 -0
  472. data/spec/unit/pops/types/type_parser_spec.rb +93 -0
  473. data/spec/unit/property/list_spec.rb +1 -1
  474. data/spec/unit/property/ordered_list_spec.rb +1 -1
  475. data/spec/unit/provider/aixobject_spec.rb +101 -0
  476. data/spec/unit/provider/augeas/augeas_spec.rb +14 -3
  477. data/spec/unit/provider/mcx/mcxcontent_spec.rb +52 -16
  478. data/spec/unit/provider/mount/parsed_spec.rb +44 -56
  479. data/spec/unit/provider/mount_spec.rb +11 -2
  480. data/spec/unit/provider/naginator_spec.rb +8 -0
  481. data/spec/unit/provider/package/apt_spec.rb +5 -1
  482. data/spec/unit/provider/package/aptitude_spec.rb +9 -5
  483. data/spec/unit/provider/package/aptrpm_spec.rb +2 -2
  484. data/spec/unit/provider/package/dpkg_spec.rb +274 -99
  485. data/spec/unit/provider/package/openbsd_spec.rb +84 -1
  486. data/spec/unit/provider/package/opkg_spec.rb +3 -3
  487. data/spec/unit/provider/package/pip_spec.rb +16 -0
  488. data/spec/unit/provider/package/pkgdmg_spec.rb +62 -7
  489. data/spec/unit/provider/package/rpm_spec.rb +112 -21
  490. data/spec/unit/provider/package/urpmi.rb +80 -0
  491. data/spec/unit/provider/package/windows/exe_package_spec.rb +1 -1
  492. data/spec/unit/provider/package/yum_spec.rb +85 -0
  493. data/spec/unit/provider/package/zypper_spec.rb +25 -6
  494. data/spec/unit/provider/parsedfile_spec.rb +3 -2
  495. data/spec/unit/provider/service/init_spec.rb +10 -10
  496. data/spec/unit/provider/service/openrc_spec.rb +16 -0
  497. data/spec/unit/provider/service/openwrt_spec.rb +1 -1
  498. data/spec/unit/provider/service/redhat_spec.rb +7 -0
  499. data/spec/unit/provider/ssh_authorized_key/parsed_spec.rb +2 -2
  500. data/spec/unit/provider/user/aix_spec.rb +89 -0
  501. data/spec/unit/provider/user/directoryservice_spec.rb +11 -4
  502. data/spec/unit/provider/user/user_role_add_spec.rb +18 -0
  503. data/spec/unit/provider_spec.rb +2 -13
  504. data/spec/unit/reports/http_spec.rb +1 -1
  505. data/spec/unit/resource/catalog_spec.rb +23 -97
  506. data/spec/unit/resource/resource_type.json +34 -0
  507. data/spec/unit/resource/status_spec.rb +56 -0
  508. data/spec/unit/resource/type_collection_spec.rb +6 -6
  509. data/spec/unit/resource/type_spec.rb +25 -5
  510. data/spec/unit/resource_spec.rb +68 -24
  511. data/spec/unit/run_spec.rb +16 -0
  512. data/spec/unit/scheduler/scheduler_spec.rb +14 -27
  513. data/spec/unit/semver_spec.rb +5 -0
  514. data/spec/unit/settings/enum_setting_spec.rb +27 -0
  515. data/spec/unit/settings_spec.rb +53 -44
  516. data/spec/unit/ssl/certificate_authority_spec.rb +155 -19
  517. data/spec/unit/transaction/additional_resource_generator_spec.rb +419 -0
  518. data/spec/unit/transaction/event_manager_spec.rb +2 -2
  519. data/spec/unit/transaction/event_spec.rb +57 -0
  520. data/spec/unit/transaction/report_spec.rb +66 -0
  521. data/spec/unit/transaction/resource_harness_spec.rb +27 -20
  522. data/spec/unit/transaction_spec.rb +182 -390
  523. data/spec/unit/type/augeas_spec.rb +3 -3
  524. data/spec/unit/type/component_spec.rb +0 -9
  525. data/spec/unit/type/computer_spec.rb +1 -1
  526. data/spec/unit/type/cron_spec.rb +2 -2
  527. data/spec/unit/type/exec_spec.rb +4 -2
  528. data/spec/unit/type/file/content_spec.rb +11 -0
  529. data/spec/unit/type/file/group_spec.rb +1 -1
  530. data/spec/unit/type/file_spec.rb +16 -8
  531. data/spec/unit/type/mount_spec.rb +445 -259
  532. data/spec/unit/type/package_spec.rb +4 -4
  533. data/spec/unit/type/resources_spec.rb +30 -1
  534. data/spec/unit/type/user_spec.rb +26 -3
  535. data/spec/unit/type/yumrepo_spec.rb +7 -27
  536. data/spec/unit/type/zone_spec.rb +4 -1
  537. data/spec/unit/type_spec.rb +66 -33
  538. data/spec/unit/util/backups_spec.rb +3 -3
  539. data/spec/unit/util/http_proxy_spec.rb +83 -0
  540. data/spec/unit/util/log_spec.rb +79 -8
  541. data/spec/unit/util/metric_spec.rb +12 -0
  542. data/spec/unit/util/monkey_patches_spec.rb +6 -0
  543. data/spec/unit/util/network_device/config_spec.rb +26 -64
  544. data/spec/unit/util/pidlock_spec.rb +4 -1
  545. data/spec/unit/util/tagging_spec.rb +5 -9
  546. data/spec/unit/util/warnings_spec.rb +1 -1
  547. data/spec/unit/util/watched_file_spec.rb +52 -0
  548. data/spec/unit/util/watcher/periodic_watcher_spec.rb +52 -0
  549. data/spec/unit/util/watcher_spec.rb +56 -0
  550. data/spec/unit/util_spec.rb +16 -0
  551. metadata +2767 -2576
  552. data/ext/debian/puppet.manpages +0 -32
  553. data/ext/osx/PackageInfo.plist +0 -36
  554. data/ext/osx/createpackage.sh +0 -187
  555. data/ext/redhat/rundir-perms.patch +0 -28
  556. data/lib/puppet/external/base64.rb +0 -19
  557. data/lib/puppet/util/graph.rb +0 -27
  558. data/lib/puppet/util/loadedfile.rb +0 -61
  559. data/lib/puppet/util/log_paths.rb +0 -22
  560. data/lib/puppet/util/subclass_loader.rb +0 -78
  561. data/spec/monkey_patches/publicize_methods.rb +0 -11
  562. data/spec/unit/util/loadedfile_spec.rb +0 -71
@@ -333,7 +333,7 @@ describe Puppet::SSL::CertificateAuthority do
333
333
 
334
334
  expect do
335
335
  @ca.sign(@name, false, @request)
336
- end.not_to raise_error(Puppet::SSL::CertificateAuthority::CertificateSigningError)
336
+ end.not_to raise_error
337
337
  end
338
338
 
339
339
  it "should save the resulting certificate" do
@@ -748,6 +748,13 @@ describe Puppet::SSL::CertificateAuthority do
748
748
  @ca.list.should == %w{cert1 cert2}
749
749
  end
750
750
 
751
+ it "should list the full certificates" do
752
+ cert1 = stub 'cert1', :name => "cert1"
753
+ cert2 = stub 'cert2', :name => "cert2"
754
+ Puppet::SSL::Certificate.indirection.expects(:search).with("*").returns [cert1, cert2]
755
+ @ca.list_certificates.should == [cert1, cert2]
756
+ end
757
+
751
758
  describe "and printing certificates" do
752
759
  it "should return nil if the certificate cannot be found" do
753
760
  Puppet::SSL::Certificate.indirection.expects(:find).with("myhost").returns nil
@@ -860,6 +867,35 @@ describe Puppet::SSL::CertificateAuthority do
860
867
 
861
868
  expect { @ca.verify("me") }.to raise_error
862
869
  end
870
+
871
+ describe "certificate_is_alive?" do
872
+ it "should return false if verification fails" do
873
+ @cert.expects(:content).returns "mycert"
874
+
875
+ @store.expects(:verify).with("mycert").returns false
876
+
877
+ @ca.certificate_is_alive?(@cert).should be_false
878
+ end
879
+
880
+ it "should return true if verification passes" do
881
+ @cert.expects(:content).returns "mycert"
882
+
883
+ @store.expects(:verify).with("mycert").returns true
884
+
885
+ @ca.certificate_is_alive?(@cert).should be_true
886
+ end
887
+
888
+ it "should used a cached instance of the x509 store" do
889
+ OpenSSL::X509::Store.stubs(:new).returns(@store).once
890
+
891
+ @cert.expects(:content).returns "mycert"
892
+
893
+ @store.expects(:verify).with("mycert").returns true
894
+
895
+ @ca.certificate_is_alive?(@cert)
896
+ @ca.certificate_is_alive?(@cert)
897
+ end
898
+ end
863
899
  end
864
900
 
865
901
  describe "and revoking certificates" do
@@ -935,37 +971,137 @@ describe Puppet::SSL::CertificateAuthority do
935
971
  it "should be able to generate a complete new SSL host" do
936
972
  @ca.should respond_to(:generate)
937
973
  end
974
+ end
975
+ end
938
976
 
939
- describe "and generating certificates" do
940
- before do
941
- @host = stub 'host', :generate_certificate_request => nil
942
- Puppet::SSL::Host.stubs(:new).returns @host
943
- Puppet::SSL::Certificate.indirection.stubs(:find).returns nil
977
+ require 'puppet/indirector/memory'
978
+
979
+ describe "CertificateAuthority.generate" do
980
+
981
+ def expect_to_increment_serial_file
982
+ Puppet.settings.expects(:readwritelock).with(:serial)
983
+ end
984
+
985
+ def expect_to_sign_a_cert
986
+ expect_to_increment_serial_file
987
+ Puppet.settings.expects(:write).with(:cert_inventory, "a")
988
+ end
989
+
990
+ def expect_to_write_the_ca_password
991
+ Puppet.settings.expects(:write).with(:capass)
992
+ end
993
+
994
+ def expect_ca_initialization
995
+ expect_to_write_the_ca_password
996
+ expect_to_sign_a_cert
997
+ end
998
+
999
+ def avoid_rebuilding_inventory_for_every_cert
1000
+ Puppet::SSL::Inventory.any_instance.stubs(:rebuild)
1001
+ end
944
1002
 
945
- @ca.stubs(:sign)
1003
+ INDIRECTED_CLASSES = [
1004
+ Puppet::SSL::Certificate,
1005
+ Puppet::SSL::CertificateRequest,
1006
+ Puppet::SSL::CertificateRevocationList,
1007
+ Puppet::SSL::Key,
1008
+ ]
1009
+
1010
+ INDIRECTED_CLASSES.each do |const|
1011
+ class const::Memory < Puppet::Indirector::Memory
1012
+
1013
+ # @return Array of all the indirector's values
1014
+ #
1015
+ # This mirrors Puppet::Indirector::SslFile#search which returns all files
1016
+ # in the directory.
1017
+ def search(request)
1018
+ return @instances.values
1019
+ end
1020
+ end
1021
+ end
1022
+
1023
+ before do
1024
+ avoid_rebuilding_inventory_for_every_cert
1025
+ INDIRECTED_CLASSES.each { |const| const.indirection.terminus_class = :memory }
1026
+ end
1027
+
1028
+ after do
1029
+ INDIRECTED_CLASSES.each do |const|
1030
+ const.indirection.terminus_class = :file
1031
+ const.indirection.termini.clear
1032
+ end
1033
+ end
1034
+
1035
+ describe "when generating certificates" do
1036
+ let(:ca) { Puppet::SSL::CertificateAuthority.new }
1037
+
1038
+ before do
1039
+ expect_ca_initialization
1040
+ end
1041
+
1042
+ it "should fail if a certificate already exists for the host" do
1043
+ cert = Puppet::SSL::Certificate.new('pre.existing')
1044
+ Puppet::SSL::Certificate.indirection.save(cert)
1045
+ expect { ca.generate(cert.name) }.to raise_error(ArgumentError, /a certificate already exists/i)
1046
+ end
1047
+
1048
+ describe "that do not yet exist" do
1049
+ let(:cn) { "new.host" }
1050
+
1051
+ def expect_cert_does_not_exist(cn)
1052
+ expect( Puppet::SSL::Certificate.indirection.find(cn) ).to be_nil
946
1053
  end
947
1054
 
948
- it "should fail if a certificate already exists for the host" do
949
- Puppet::SSL::Certificate.indirection.expects(:find).with("him").returns "something"
1055
+ before do
1056
+ expect_to_sign_a_cert
1057
+ expect_cert_does_not_exist(cn)
1058
+ end
950
1059
 
951
- expect { @ca.generate("him") }.to raise_error(ArgumentError)
1060
+ it "should return the created certificate" do
1061
+ cert = ca.generate(cn)
1062
+ expect( cert ).to be_kind_of(Puppet::SSL::Certificate)
1063
+ expect( cert.name ).to eq(cn)
952
1064
  end
953
1065
 
954
- it "should create a new Host instance with the correct name" do
955
- Puppet::SSL::Host.expects(:new).with("him").returns @host
1066
+ it "should not have any subject_alt_names by default" do
1067
+ cert = ca.generate(cn)
1068
+ expect( cert.subject_alt_names ).to be_empty
1069
+ end
956
1070
 
957
- @ca.generate("him")
1071
+ it "should have subject_alt_names if passed dns_alt_names" do
1072
+ cert = ca.generate(cn, :dns_alt_names => 'foo,bar')
1073
+ expect( cert.subject_alt_names ).to match_array(["DNS:#{cn}",'DNS:foo','DNS:bar'])
958
1074
  end
959
1075
 
960
- it "should use the Host to generate the certificate request" do
961
- @host.expects :generate_certificate_request
1076
+ context "if autosign is false" do
1077
+ before do
1078
+ Puppet[:autosign] = false
1079
+ end
962
1080
 
963
- @ca.generate("him")
1081
+ it "should still generate and explicitly sign the request" do
1082
+ cert = nil
1083
+ cert = ca.generate(cn)
1084
+ expect(cert.name).to eq(cn)
1085
+ end
964
1086
  end
965
1087
 
966
- it "should sign the generated request" do
967
- @ca.expects(:sign).with("him", false)
968
- @ca.generate("him")
1088
+ context "if autosign is true (Redmine #6112)" do
1089
+
1090
+ def run_mode_must_be_master_for_autosign_to_be_attempted
1091
+ Puppet.stubs(:run_mode).returns(Puppet::Util::RunMode[:master])
1092
+ end
1093
+
1094
+ before do
1095
+ Puppet[:autosign] = true
1096
+ run_mode_must_be_master_for_autosign_to_be_attempted
1097
+ Puppet::Util::Log.level = :info
1098
+ end
1099
+
1100
+ it "should generate a cert without attempting to sign again" do
1101
+ cert = ca.generate(cn)
1102
+ expect(cert.name).to eq(cn)
1103
+ expect(@logs.map(&:message)).to include("Autosigning #{cn}")
1104
+ end
969
1105
  end
970
1106
  end
971
1107
  end
@@ -0,0 +1,419 @@
1
+ require 'spec_helper'
2
+ require 'puppet/transaction'
3
+ require 'puppet_spec/compiler'
4
+ require 'matchers/relationship_graph_matchers'
5
+ require 'matchers/include_in_order'
6
+
7
+ describe Puppet::Transaction::AdditionalResourceGenerator do
8
+ include PuppetSpec::Compiler
9
+ include PuppetSpec::Files
10
+ include RelationshipGraphMatchers
11
+
12
+ let(:prioritizer) { Puppet::Graph::SequentialPrioritizer.new }
13
+
14
+ def find_vertex(graph, type, title)
15
+ graph.vertices.find {|v| v.type == type and v.title == title}
16
+ end
17
+
18
+ Puppet::Type.newtype(:generator) do
19
+ include PuppetSpec::Compiler
20
+
21
+ newparam(:name) do
22
+ isnamevar
23
+ end
24
+
25
+ newparam(:kind) do
26
+ defaultto :eval_generate
27
+ newvalues(:eval_generate, :generate)
28
+ end
29
+
30
+ newparam(:code)
31
+
32
+ def respond_to?(method_name)
33
+ method_name == self[:kind] || super
34
+ end
35
+
36
+ def eval_generate
37
+ eval_code
38
+ end
39
+
40
+ def generate
41
+ eval_code
42
+ end
43
+
44
+ def eval_code
45
+ if self[:code]
46
+ compile_to_ral(self[:code]).resources.select { |r| r.ref =~ /Notify/ }
47
+ else
48
+ []
49
+ end
50
+ end
51
+ end
52
+
53
+ context "when applying eval_generate" do
54
+ it "should add the generated resources to the catalog" do
55
+ catalog = compile_to_ral(<<-MANIFEST)
56
+ generator { thing:
57
+ code => 'notify { hello: }'
58
+ }
59
+ MANIFEST
60
+
61
+ eval_generate_resources_in(catalog, relationship_graph_for(catalog), 'Generator[thing]')
62
+
63
+ expect(catalog).to have_resource('Notify[hello]')
64
+ end
65
+
66
+ it "should add a sentinel whit for the resource" do
67
+ graph = relationships_after_eval_generating(<<-MANIFEST, 'Generator[thing]')
68
+ generator { thing:
69
+ code => 'notify { hello: }'
70
+ }
71
+ MANIFEST
72
+
73
+ find_vertex(graph, :whit, "completed_thing").must be_a(Puppet::Type.type(:whit))
74
+ end
75
+
76
+ it "should replace dependencies on the resource with dependencies on the sentinel" do
77
+ graph = relationships_after_eval_generating(<<-MANIFEST, 'Generator[thing]')
78
+ generator { thing:
79
+ code => 'notify { hello: }'
80
+ }
81
+
82
+ notify { last: require => Generator['thing'] }
83
+ MANIFEST
84
+
85
+ expect(graph).to enforce_order_with_edge(
86
+ 'Whit[completed_thing]', 'Notify[last]')
87
+ end
88
+
89
+ it "should add an edge from the nearest ancestor to the generated resource" do
90
+ graph = relationships_after_eval_generating(<<-MANIFEST, 'Generator[thing]')
91
+ generator { thing:
92
+ code => 'notify { hello: } notify { goodbye: }'
93
+ }
94
+ MANIFEST
95
+
96
+ expect(graph).to enforce_order_with_edge(
97
+ 'Generator[thing]', 'Notify[hello]')
98
+ expect(graph).to enforce_order_with_edge(
99
+ 'Generator[thing]', 'Notify[goodbye]')
100
+ end
101
+
102
+ it "should add an edge from each generated resource to the sentinel" do
103
+ graph = relationships_after_eval_generating(<<-MANIFEST, 'Generator[thing]')
104
+ generator { thing:
105
+ code => 'notify { hello: } notify { goodbye: }'
106
+ }
107
+ MANIFEST
108
+
109
+ expect(graph).to enforce_order_with_edge(
110
+ 'Notify[hello]', 'Whit[completed_thing]')
111
+ expect(graph).to enforce_order_with_edge(
112
+ 'Notify[goodbye]', 'Whit[completed_thing]')
113
+ end
114
+
115
+ it "should add an edge from the resource to the sentinel" do
116
+ graph = relationships_after_eval_generating(<<-MANIFEST, 'Generator[thing]')
117
+ generator { thing:
118
+ code => 'notify { hello: }'
119
+ }
120
+ MANIFEST
121
+
122
+ expect(graph).to enforce_order_with_edge(
123
+ 'Generator[thing]', 'Whit[completed_thing]')
124
+ end
125
+
126
+ it "should contain the generated resources in the same container as the generator" do
127
+ catalog = compile_to_ral(<<-MANIFEST)
128
+ class container {
129
+ generator { thing:
130
+ code => 'notify { hello: }'
131
+ }
132
+ }
133
+
134
+ include container
135
+ MANIFEST
136
+
137
+ eval_generate_resources_in(catalog, relationship_graph_for(catalog), 'Generator[thing]')
138
+
139
+ expect(catalog).to contain_resources_equally('Generator[thing]', 'Notify[hello]')
140
+ end
141
+
142
+ it "should return false if an error occured when generating resources" do
143
+ catalog = compile_to_ral(<<-MANIFEST)
144
+ generator { thing:
145
+ code => 'fail("not a good generation")'
146
+ }
147
+ MANIFEST
148
+
149
+ generator = Puppet::Transaction::AdditionalResourceGenerator.new(catalog, relationship_graph_for(catalog), prioritizer)
150
+
151
+ expect(generator.eval_generate(catalog.resource('Generator[thing]'))).
152
+ to eq(false)
153
+ end
154
+
155
+ it "should return true if resources were generated" do
156
+ catalog = compile_to_ral(<<-MANIFEST)
157
+ generator { thing:
158
+ code => 'notify { hello: }'
159
+ }
160
+ MANIFEST
161
+
162
+ generator = Puppet::Transaction::AdditionalResourceGenerator.new(catalog, relationship_graph_for(catalog), prioritizer)
163
+
164
+ expect(generator.eval_generate(catalog.resource('Generator[thing]'))).
165
+ to eq(true)
166
+ end
167
+
168
+ it "should not add a sentinel if no resources are generated" do
169
+ catalog = compile_to_ral(<<-MANIFEST)
170
+ generator { thing: }
171
+ MANIFEST
172
+ relationship_graph = relationship_graph_for(catalog)
173
+
174
+ generator = Puppet::Transaction::AdditionalResourceGenerator.new(catalog, relationship_graph, prioritizer)
175
+
176
+ expect(generator.eval_generate(catalog.resource('Generator[thing]'))).
177
+ to eq(false)
178
+ expect(find_vertex(relationship_graph, :whit, "completed_thing")).to be_nil
179
+ end
180
+
181
+ it "orders generated resources with the generator" do
182
+ graph = relationships_after_eval_generating(<<-MANIFEST, 'Generator[thing]')
183
+ notify { before: }
184
+ generator { thing:
185
+ code => 'notify { hello: }'
186
+ }
187
+ notify { after: }
188
+ MANIFEST
189
+
190
+ expect(order_resources_traversed_in(graph)).to(
191
+ include_in_order("Notify[before]", "Generator[thing]", "Notify[hello]", "Notify[after]"))
192
+ end
193
+
194
+ it "orders the generator in manifest order with dependencies" do
195
+ graph = relationships_after_eval_generating(<<-MANIFEST, 'Generator[thing]')
196
+ notify { before: }
197
+ generator { thing:
198
+ code => 'notify { hello: } notify { goodbye: }'
199
+ }
200
+ notify { third: require => Generator['thing'] }
201
+ notify { after: }
202
+ MANIFEST
203
+
204
+ expect(order_resources_traversed_in(graph)).to(
205
+ include_in_order("Notify[before]",
206
+ "Generator[thing]",
207
+ "Notify[hello]",
208
+ "Notify[goodbye]",
209
+ "Notify[third]",
210
+ "Notify[after]"))
211
+ end
212
+
213
+ it "duplicate generated resources are made dependent on the generator" do
214
+ graph = relationships_after_eval_generating(<<-MANIFEST, 'Generator[thing]')
215
+ notify { before: }
216
+ notify { hello: }
217
+ generator { thing:
218
+ code => 'notify { before: }'
219
+ }
220
+ notify { third: require => Generator['thing'] }
221
+ notify { after: }
222
+ MANIFEST
223
+
224
+ expect(order_resources_traversed_in(graph)).to(
225
+ include_in_order("Notify[hello]", "Generator[thing]", "Notify[before]", "Notify[third]", "Notify[after]"))
226
+ end
227
+
228
+ it "preserves dependencies on duplicate generated resources" do
229
+ graph = relationships_after_eval_generating(<<-MANIFEST, 'Generator[thing]')
230
+ notify { before: }
231
+ generator { thing:
232
+ code => 'notify { hello: } notify { before: }',
233
+ require => 'Notify[before]'
234
+ }
235
+ notify { third: require => Generator['thing'] }
236
+ notify { after: }
237
+ MANIFEST
238
+
239
+ expect(order_resources_traversed_in(graph)).to(
240
+ include_in_order("Notify[before]", "Generator[thing]", "Notify[hello]", "Notify[third]", "Notify[after]"))
241
+ end
242
+
243
+ def relationships_after_eval_generating(manifest, resource_to_generate)
244
+ catalog = compile_to_ral(manifest)
245
+ relationship_graph = relationship_graph_for(catalog)
246
+
247
+ eval_generate_resources_in(catalog, relationship_graph, resource_to_generate)
248
+
249
+ relationship_graph
250
+ end
251
+
252
+ def eval_generate_resources_in(catalog, relationship_graph, resource_to_generate)
253
+ generator = Puppet::Transaction::AdditionalResourceGenerator.new(catalog, relationship_graph, prioritizer)
254
+ generator.eval_generate(catalog.resource(resource_to_generate))
255
+ end
256
+ end
257
+
258
+ context "when applying generate" do
259
+ it "should add the generated resources to the catalog" do
260
+ catalog = compile_to_ral(<<-MANIFEST)
261
+ generator { thing:
262
+ kind => generate,
263
+ code => 'notify { hello: }'
264
+ }
265
+ MANIFEST
266
+
267
+ generate_resources_in(catalog, relationship_graph_for(catalog), 'Generator[thing]')
268
+
269
+ expect(catalog).to have_resource('Notify[hello]')
270
+ end
271
+
272
+ it "should contain the generated resources in the same container as the generator" do
273
+ catalog = compile_to_ral(<<-MANIFEST)
274
+ class container {
275
+ generator { thing:
276
+ kind => generate,
277
+ code => 'notify { hello: }'
278
+ }
279
+ }
280
+
281
+ include container
282
+ MANIFEST
283
+
284
+ generate_resources_in(catalog, relationship_graph_for(catalog), 'Generator[thing]')
285
+
286
+ expect(catalog).to contain_resources_equally('Generator[thing]', 'Notify[hello]')
287
+ end
288
+
289
+ it "should add an edge from the nearest ancestor to the generated resource" do
290
+ graph = relationships_after_generating(<<-MANIFEST, 'Generator[thing]')
291
+ generator { thing:
292
+ kind => generate,
293
+ code => 'notify { hello: } notify { goodbye: }'
294
+ }
295
+ MANIFEST
296
+
297
+ expect(graph).to enforce_order_with_edge(
298
+ 'Generator[thing]', 'Notify[hello]')
299
+ expect(graph).to enforce_order_with_edge(
300
+ 'Generator[thing]', 'Notify[goodbye]')
301
+ end
302
+
303
+ it "orders generated resources with the generator" do
304
+ graph = relationships_after_generating(<<-MANIFEST, 'Generator[thing]')
305
+ notify { before: }
306
+ generator { thing:
307
+ kind => generate,
308
+ code => 'notify { hello: }'
309
+ }
310
+ notify { after: }
311
+ MANIFEST
312
+
313
+ expect(order_resources_traversed_in(graph)).to(
314
+ include_in_order("Notify[before]", "Generator[thing]", "Notify[hello]", "Notify[after]"))
315
+ end
316
+
317
+ it "duplicate generated resources are made dependent on the generator" do
318
+ graph = relationships_after_generating(<<-MANIFEST, 'Generator[thing]')
319
+ notify { before: }
320
+ notify { hello: }
321
+ generator { thing:
322
+ kind => generate,
323
+ code => 'notify { before: }'
324
+ }
325
+ notify { third: require => Generator['thing'] }
326
+ notify { after: }
327
+ MANIFEST
328
+
329
+ expect(order_resources_traversed_in(graph)).to(
330
+ include_in_order("Notify[hello]", "Generator[thing]", "Notify[before]", "Notify[third]", "Notify[after]"))
331
+ end
332
+
333
+ it "preserves dependencies on duplicate generated resources" do
334
+ graph = relationships_after_generating(<<-MANIFEST, 'Generator[thing]')
335
+ notify { before: }
336
+ generator { thing:
337
+ kind => generate,
338
+ code => 'notify { hello: } notify { before: }',
339
+ require => 'Notify[before]'
340
+ }
341
+ notify { third: require => Generator['thing'] }
342
+ notify { after: }
343
+ MANIFEST
344
+
345
+ expect(order_resources_traversed_in(graph)).to(
346
+ include_in_order("Notify[before]", "Generator[thing]", "Notify[hello]", "Notify[third]", "Notify[after]"))
347
+ end
348
+
349
+ it "orders the generator in manifest order with dependencies" do
350
+ graph = relationships_after_generating(<<-MANIFEST, 'Generator[thing]')
351
+ notify { before: }
352
+ generator { thing:
353
+ kind => generate,
354
+ code => 'notify { hello: } notify { goodbye: }'
355
+ }
356
+ notify { third: require => Generator['thing'] }
357
+ notify { after: }
358
+ MANIFEST
359
+
360
+ expect(order_resources_traversed_in(graph)).to(
361
+ include_in_order("Notify[before]",
362
+ "Generator[thing]",
363
+ "Notify[hello]",
364
+ "Notify[goodbye]",
365
+ "Notify[third]",
366
+ "Notify[after]"))
367
+ end
368
+
369
+ def relationships_after_generating(manifest, resource_to_generate)
370
+ catalog = compile_to_ral(manifest)
371
+ relationship_graph = relationship_graph_for(catalog)
372
+
373
+ generate_resources_in(catalog, relationship_graph, resource_to_generate)
374
+
375
+ relationship_graph
376
+ end
377
+
378
+ def generate_resources_in(catalog, relationship_graph, resource_to_generate)
379
+ generator = Puppet::Transaction::AdditionalResourceGenerator.new(catalog, relationship_graph, prioritizer)
380
+ generator.generate_additional_resources(catalog.resource(resource_to_generate))
381
+ end
382
+ end
383
+
384
+ def relationship_graph_for(catalog)
385
+ relationship_graph = Puppet::Graph::RelationshipGraph.new(prioritizer)
386
+ relationship_graph.populate_from(catalog)
387
+ relationship_graph
388
+ end
389
+
390
+ def order_resources_traversed_in(relationships)
391
+ order_seen = []
392
+ relationships.traverse { |resource| order_seen << resource.ref }
393
+ order_seen
394
+ end
395
+
396
+ RSpec::Matchers.define :contain_resources_equally do |*resource_refs|
397
+ match do |catalog|
398
+ @containers = resource_refs.collect do |resource_ref|
399
+ catalog.container_of(catalog.resource(resource_ref)).ref
400
+ end
401
+
402
+ @containers.all? { |resource_ref| resource_ref == @containers[0] }
403
+ end
404
+
405
+ def failure_message_for_should
406
+ "expected #{@expected.join(', ')} to all be contained in the same resource but the containment was #{@expected.zip(@containers).collect { |(res, container)| res + ' => ' + container }.join(', ')}"
407
+ end
408
+ end
409
+ end
410
+
411
+ RSpec::Matchers.define :have_resource do |expected_resource|
412
+ match do |actual_catalog|
413
+ actual_catalog.resource(expected_resource)
414
+ end
415
+
416
+ def failure_message_for_should
417
+ "expected #{@actual.to_dot} to include #{@expected[0]}"
418
+ end
419
+ end