puppet 4.5.3-x86-mingw32 → 4.6.1-x86-mingw32

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 (422) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile +10 -1
  3. data/ext/debian/control +2 -4
  4. data/ext/project_data.yaml +4 -4
  5. data/install.rb +6 -2
  6. data/lib/puppet.rb +3 -1
  7. data/lib/puppet/agent/locker.rb +1 -1
  8. data/lib/puppet/application.rb +6 -4
  9. data/lib/puppet/application/agent.rb +2 -1
  10. data/lib/puppet/application/cert.rb +35 -2
  11. data/lib/puppet/application/device.rb +1 -1
  12. data/lib/puppet/application/generate.rb +5 -0
  13. data/lib/puppet/application/lookup.rb +3 -3
  14. data/lib/puppet/application_support.rb +1 -1
  15. data/lib/puppet/compilable_resource_type.rb +15 -0
  16. data/lib/puppet/configurer.rb +67 -10
  17. data/lib/puppet/configurer/plugin_handler.rb +2 -4
  18. data/lib/puppet/data_providers/hiera_config.rb +1 -1
  19. data/lib/puppet/defaults.rb +34 -7
  20. data/lib/puppet/environments.rb +4 -2
  21. data/lib/puppet/error.rb +1 -1
  22. data/lib/puppet/external/dot.rb +1 -1
  23. data/lib/puppet/face/ca.rb +4 -1
  24. data/lib/puppet/face/certificate.rb +7 -1
  25. data/lib/puppet/face/epp.rb +5 -5
  26. data/lib/puppet/face/generate.rb +64 -0
  27. data/lib/puppet/face/help.rb +19 -13
  28. data/lib/puppet/face/man.rb +1 -1
  29. data/lib/puppet/feature/external_facts.rb +1 -1
  30. data/lib/puppet/file_system.rb +16 -0
  31. data/lib/puppet/file_system/file_impl.rb +5 -0
  32. data/lib/puppet/file_system/memory_impl.rb +4 -0
  33. data/lib/puppet/file_system/path_pattern.rb +1 -0
  34. data/lib/puppet/file_system/windows.rb +19 -0
  35. data/lib/puppet/functions.rb +3 -5
  36. data/lib/puppet/functions/assert_type.rb +1 -1
  37. data/lib/puppet/functions/defined.rb +7 -5
  38. data/lib/puppet/functions/dig.rb +2 -18
  39. data/lib/puppet/functions/hiera.rb +1 -1
  40. data/lib/puppet/functions/lest.rb +1 -37
  41. data/lib/puppet/functions/new.rb +2 -473
  42. data/lib/puppet/functions/reverse_each.rb +2 -59
  43. data/lib/puppet/functions/scanf.rb +4 -4
  44. data/lib/puppet/functions/step.rb +1 -63
  45. data/lib/puppet/functions/then.rb +1 -61
  46. data/lib/puppet/functions/type.rb +1 -40
  47. data/lib/puppet/functions/unwrap.rb +40 -0
  48. data/lib/puppet/generate/models/type/property.rb +70 -0
  49. data/lib/puppet/generate/models/type/type.rb +57 -0
  50. data/lib/puppet/generate/templates/type/pcore.erb +41 -0
  51. data/lib/puppet/generate/type.rb +239 -0
  52. data/lib/puppet/graph/simple_graph.rb +2 -6
  53. data/lib/puppet/indirector/catalog/static_compiler.rb +5 -2
  54. data/lib/puppet/indirector/facts/facter.rb +1 -1
  55. data/lib/puppet/indirector/key/ca.rb +2 -2
  56. data/lib/puppet/indirector/request.rb +25 -4
  57. data/lib/puppet/indirector/rest.rb +73 -3
  58. data/lib/puppet/info_service/class_information_service.rb +1 -2
  59. data/lib/puppet/interface/documentation.rb +1 -1
  60. data/lib/puppet/loaders.rb +2 -0
  61. data/lib/puppet/metatype/manager.rb +6 -6
  62. data/lib/puppet/module.rb +8 -1
  63. data/lib/puppet/module_tool.rb +2 -2
  64. data/lib/puppet/module_tool/checksums.rb +1 -1
  65. data/lib/puppet/module_tool/errors/installer.rb +2 -2
  66. data/lib/puppet/module_tool/metadata.rb +1 -1
  67. data/lib/puppet/network/http/api/indirected_routes.rb +23 -32
  68. data/lib/puppet/network/http/rack/rest.rb +15 -1
  69. data/lib/puppet/network/rights.rb +1 -11
  70. data/lib/puppet/node/environment.rb +7 -3
  71. data/lib/puppet/node/facts.rb +1 -1
  72. data/lib/puppet/parameter.rb +23 -3
  73. data/lib/puppet/parameter/boolean.rb +1 -1
  74. data/lib/puppet/parameter/value.rb +1 -1
  75. data/lib/puppet/parser.rb +0 -1
  76. data/lib/puppet/parser/ast/pops_bridge.rb +1 -1
  77. data/lib/puppet/parser/ast/resource.rb +5 -0
  78. data/lib/puppet/parser/ast/resource_instance.rb +5 -1
  79. data/lib/puppet/parser/ast/resourceparam.rb +5 -0
  80. data/lib/puppet/parser/compiler.rb +14 -17
  81. data/lib/puppet/parser/compiler/catalog_validator/relationship_validator.rb +1 -1
  82. data/lib/puppet/parser/environment_compiler.rb +10 -0
  83. data/lib/puppet/parser/functions/create_resources.rb +39 -24
  84. data/lib/puppet/parser/functions/defined.rb +2 -26
  85. data/lib/puppet/parser/functions/dig.rb +29 -0
  86. data/lib/puppet/parser/functions/lest.rb +49 -0
  87. data/lib/puppet/parser/functions/new.rb +530 -0
  88. data/lib/puppet/parser/functions/require.rb +1 -1
  89. data/lib/puppet/parser/functions/reverse_each.rb +83 -0
  90. data/lib/puppet/parser/functions/scanf.rb +4 -4
  91. data/lib/puppet/parser/functions/step.rb +84 -0
  92. data/lib/puppet/parser/functions/then.rb +73 -0
  93. data/lib/puppet/parser/functions/type.rb +53 -0
  94. data/lib/puppet/parser/resource.rb +16 -7
  95. data/lib/puppet/parser/scope.rb +36 -28
  96. data/lib/puppet/parser/type_loader.rb +1 -1
  97. data/lib/puppet/plugins/data_providers/data_provider.rb +1 -1
  98. data/lib/puppet/pops.rb +13 -0
  99. data/lib/puppet/pops/adapters.rb +49 -49
  100. data/lib/puppet/pops/binder/scheme_handler/confdir_scheme.rb +1 -1
  101. data/lib/puppet/pops/evaluator/access_operator.rb +39 -2
  102. data/lib/puppet/pops/evaluator/closure.rb +39 -13
  103. data/lib/puppet/pops/evaluator/collector_transformer.rb +10 -1
  104. data/lib/puppet/pops/evaluator/evaluator_impl.rb +16 -11
  105. data/lib/puppet/pops/evaluator/external_syntax_support.rb +1 -1
  106. data/lib/puppet/pops/evaluator/json_strict_literal_evaluator.rb +0 -1
  107. data/lib/puppet/pops/evaluator/literal_evaluator.rb +0 -1
  108. data/lib/puppet/pops/evaluator/relationship_operator.rb +1 -2
  109. data/lib/puppet/pops/evaluator/runtime3_resource_support.rb +119 -0
  110. data/lib/puppet/pops/evaluator/runtime3_support.rb +19 -45
  111. data/lib/puppet/pops/functions/function.rb +5 -0
  112. data/lib/puppet/pops/issues.rb +1 -1
  113. data/lib/puppet/pops/label_provider.rb +2 -2
  114. data/lib/puppet/pops/loader/base_loader.rb +12 -15
  115. data/lib/puppet/pops/loader/loader.rb +15 -50
  116. data/lib/puppet/pops/loader/loader_paths.rb +28 -2
  117. data/lib/puppet/pops/loader/module_loaders.rb +16 -1
  118. data/lib/puppet/pops/loader/null_loader.rb +17 -1
  119. data/lib/puppet/pops/loader/puppet_function_instantiator.rb +12 -11
  120. data/lib/puppet/pops/loader/puppet_resource_type_impl_instantiator.rb +80 -0
  121. data/lib/puppet/pops/loader/ruby_function_instantiator.rb +2 -3
  122. data/lib/puppet/pops/loader/runtime3_type_loader.rb +52 -13
  123. data/lib/puppet/pops/loader/static_loader.rb +55 -0
  124. data/lib/puppet/pops/loader/type_definition_instantiator.rb +30 -14
  125. data/lib/puppet/pops/loader/typed_name.rb +50 -0
  126. data/lib/puppet/pops/loaders.rb +64 -19
  127. data/lib/puppet/pops/merge_strategy.rb +7 -7
  128. data/lib/puppet/pops/migration/migration_checker.rb +4 -0
  129. data/lib/puppet/pops/model/model_label_provider.rb +2 -0
  130. data/lib/puppet/pops/parser/egrammar.ra +8 -5
  131. data/lib/puppet/pops/parser/eparser.rb +1550 -1498
  132. data/lib/puppet/pops/parser/evaluating_parser.rb +1 -1
  133. data/lib/puppet/pops/parser/interpolation_support.rb +7 -0
  134. data/lib/puppet/pops/parser/lexer2.rb +14 -1
  135. data/lib/puppet/pops/parser/locator.rb +30 -1
  136. data/lib/puppet/pops/parser/parser_support.rb +0 -3
  137. data/lib/puppet/pops/parser/slurp_support.rb +3 -3
  138. data/lib/puppet/pops/patterns.rb +9 -1
  139. data/lib/puppet/pops/pcore.rb +67 -11
  140. data/lib/puppet/pops/puppet_stack.rb +43 -0
  141. data/lib/puppet/pops/resource/param.rb +51 -0
  142. data/lib/puppet/pops/resource/resource_type_impl.rb +301 -0
  143. data/lib/puppet/pops/resource/resource_type_set.pcore +21 -0
  144. data/lib/puppet/pops/serialization.rb +17 -0
  145. data/lib/puppet/pops/serialization/abstract_reader.rb +149 -0
  146. data/lib/puppet/pops/serialization/abstract_writer.rb +179 -0
  147. data/lib/puppet/pops/serialization/deserializer.rb +60 -0
  148. data/lib/puppet/pops/serialization/extension.rb +126 -0
  149. data/lib/puppet/pops/serialization/instance_reader.rb +19 -0
  150. data/lib/puppet/pops/serialization/instance_writer.rb +14 -0
  151. data/lib/puppet/pops/serialization/json.rb +247 -0
  152. data/lib/puppet/pops/serialization/object.rb +63 -0
  153. data/lib/puppet/pops/serialization/rgen.rb +151 -0
  154. data/lib/puppet/pops/serialization/serializer.rb +91 -0
  155. data/lib/puppet/pops/serialization/time_factory.rb +66 -0
  156. data/lib/puppet/pops/types/annotatable.rb +36 -0
  157. data/lib/puppet/pops/types/implementation_registry.rb +3 -8
  158. data/lib/puppet/pops/types/p_meta_type.rb +83 -0
  159. data/lib/puppet/pops/types/p_object_type.rb +110 -117
  160. data/lib/puppet/pops/types/p_runtime_type.rb +13 -0
  161. data/lib/puppet/pops/types/p_sem_ver_range_type.rb +23 -0
  162. data/lib/puppet/pops/types/p_sem_ver_type.rb +30 -2
  163. data/lib/puppet/pops/types/p_sensitive_type.rb +69 -0
  164. data/lib/puppet/pops/types/p_type_set_type.rb +361 -0
  165. data/lib/puppet/pops/types/puppet_object.rb +0 -5
  166. data/lib/puppet/pops/types/ruby_generator.rb +9 -2
  167. data/lib/puppet/pops/types/type_calculator.rb +6 -1
  168. data/lib/puppet/pops/types/type_factory.rb +14 -12
  169. data/lib/puppet/pops/types/type_formatter.rb +78 -33
  170. data/lib/puppet/pops/types/type_mismatch_describer.rb +0 -2
  171. data/lib/puppet/pops/types/type_parser.rb +27 -2
  172. data/lib/puppet/pops/types/type_set_reference.rb +59 -0
  173. data/lib/puppet/pops/types/types.rb +366 -13
  174. data/lib/puppet/pops/validation.rb +4 -4
  175. data/lib/puppet/pops/validation/checker4_0.rb +5 -2
  176. data/lib/puppet/pops/visitor.rb +2 -2
  177. data/lib/puppet/property.rb +64 -5
  178. data/lib/puppet/provider.rb +1 -1
  179. data/lib/puppet/provider/aixobject.rb +3 -3
  180. data/lib/puppet/provider/group/aix.rb +4 -4
  181. data/lib/puppet/provider/macauthorization/macauthorization.rb +1 -1
  182. data/lib/puppet/provider/mailalias/aliases.rb +1 -1
  183. data/lib/puppet/provider/mcx/mcxcontent.rb +2 -2
  184. data/lib/puppet/provider/mount/parsed.rb +1 -1
  185. data/lib/puppet/provider/nameservice/directoryservice.rb +5 -5
  186. data/lib/puppet/provider/package/appdmg.rb +3 -3
  187. data/lib/puppet/provider/package/apple.rb +1 -1
  188. data/lib/puppet/provider/package/dnf.rb +5 -0
  189. data/lib/puppet/provider/package/nim.rb +1 -1
  190. data/lib/puppet/provider/package/pacman.rb +2 -2
  191. data/lib/puppet/provider/package/pip.rb +5 -3
  192. data/lib/puppet/provider/package/pip3.rb +1 -1
  193. data/lib/puppet/provider/package/pkg.rb +5 -5
  194. data/lib/puppet/provider/package/pkgdmg.rb +4 -4
  195. data/lib/puppet/provider/package/pkgin.rb +1 -1
  196. data/lib/puppet/provider/package/pkgutil.rb +1 -1
  197. data/lib/puppet/provider/package/portage.rb +48 -8
  198. data/lib/puppet/provider/package/sun.rb +1 -1
  199. data/lib/puppet/provider/package/tdnf.rb +28 -0
  200. data/lib/puppet/provider/package/yum.rb +22 -4
  201. data/lib/puppet/provider/parsedfile.rb +2 -2
  202. data/lib/puppet/provider/service/base.rb +1 -1
  203. data/lib/puppet/provider/service/bsd.rb +1 -1
  204. data/lib/puppet/provider/service/daemontools.rb +2 -2
  205. data/lib/puppet/provider/service/debian.rb +3 -3
  206. data/lib/puppet/provider/service/init.rb +5 -3
  207. data/lib/puppet/provider/service/launchd.rb +16 -2
  208. data/lib/puppet/provider/service/runit.rb +1 -1
  209. data/lib/puppet/provider/service/smf.rb +8 -1
  210. data/lib/puppet/provider/service/systemd.rb +39 -6
  211. data/lib/puppet/provider/ssh_authorized_key/parsed.rb +1 -1
  212. data/lib/puppet/provider/user/aix.rb +3 -2
  213. data/lib/puppet/provider/user/directoryservice.rb +4 -3
  214. data/lib/puppet/provider/user/hpux.rb +1 -1
  215. data/lib/puppet/provider/user/user_role_add.rb +1 -1
  216. data/lib/puppet/provider/user/windows_adsi.rb +3 -0
  217. data/lib/puppet/provider/zfs/zfs.rb +1 -1
  218. data/lib/puppet/reference/type.rb +1 -1
  219. data/lib/puppet/resource.rb +33 -7
  220. data/lib/puppet/resource/capability_finder.rb +74 -54
  221. data/lib/puppet/resource/status.rb +11 -2
  222. data/lib/puppet/settings.rb +17 -6
  223. data/lib/puppet/settings/environment_conf.rb +1 -1
  224. data/lib/puppet/settings/server_list_setting.rb +20 -0
  225. data/lib/puppet/ssl/certificate_authority.rb +32 -9
  226. data/lib/puppet/ssl/certificate_authority/interface.rb +164 -24
  227. data/lib/puppet/ssl/host.rb +3 -3
  228. data/lib/puppet/ssl/oids.rb +10 -0
  229. data/lib/puppet/ssl/validator/default_validator.rb +2 -2
  230. data/lib/puppet/test/test_helper.rb +2 -2
  231. data/lib/puppet/transaction.rb +12 -0
  232. data/lib/puppet/transaction/additional_resource_generator.rb +1 -1
  233. data/lib/puppet/transaction/event.rb +29 -2
  234. data/lib/puppet/transaction/event_manager.rb +1 -1
  235. data/lib/puppet/transaction/persistence.rb +84 -0
  236. data/lib/puppet/transaction/report.rb +49 -2
  237. data/lib/puppet/transaction/resource_harness.rb +98 -18
  238. data/lib/puppet/type.rb +63 -21
  239. data/lib/puppet/type/augeas.rb +3 -3
  240. data/lib/puppet/type/cron.rb +1 -1
  241. data/lib/puppet/type/file.rb +39 -2
  242. data/lib/puppet/type/file/data_sync.rb +13 -5
  243. data/lib/puppet/type/host.rb +1 -1
  244. data/lib/puppet/type/mount.rb +2 -6
  245. data/lib/puppet/type/notify.rb +1 -1
  246. data/lib/puppet/type/package.rb +1 -1
  247. data/lib/puppet/type/resources.rb +1 -1
  248. data/lib/puppet/type/scheduled_task.rb +1 -1
  249. data/lib/puppet/type/ssh_authorized_key.rb +2 -2
  250. data/lib/puppet/type/tidy.rb +1 -1
  251. data/lib/puppet/type/yumrepo.rb +3 -3
  252. data/lib/puppet/type/zone.rb +1 -1
  253. data/lib/puppet/util.rb +2 -2
  254. data/lib/puppet/util/classgen.rb +1 -1
  255. data/lib/puppet/util/command_line.rb +6 -2
  256. data/lib/puppet/util/command_line/trollop.rb +1 -1
  257. data/lib/puppet/util/execution.rb +2 -2
  258. data/lib/puppet/util/http_proxy.rb +1 -1
  259. data/lib/puppet/util/inifile.rb +1 -1
  260. data/lib/puppet/util/instance_loader.rb +1 -1
  261. data/lib/puppet/util/logging.rb +1 -1
  262. data/lib/puppet/util/multi_match.rb +1 -1
  263. data/lib/puppet/util/plist.rb +15 -5
  264. data/lib/puppet/util/profiler.rb +1 -1
  265. data/lib/puppet/util/profiler/around_profiler.rb +1 -1
  266. data/lib/puppet/util/psych_support.rb +1 -1
  267. data/lib/puppet/util/rdoc.rb +2 -2
  268. data/lib/puppet/util/rubygems.rb +1 -1
  269. data/lib/puppet/util/watcher/periodic_watcher.rb +2 -2
  270. data/lib/puppet/util/windows/access_control_entry.rb +1 -1
  271. data/lib/puppet/util/windows/adsi.rb +30 -8
  272. data/lib/puppet/util/windows/api_types.rb +1 -1
  273. data/lib/puppet/util/windows/file.rb +59 -0
  274. data/lib/puppet/util/windows/process.rb +10 -0
  275. data/lib/puppet/util/windows/security.rb +1 -1
  276. data/lib/puppet/util/windows/user.rb +22 -4
  277. data/lib/puppet/util/yaml.rb +15 -3
  278. data/lib/puppet/vendor/deep_merge/test/test_deep_merge.rb +1 -1
  279. data/lib/puppet/vendor/rgen_patch.rb +1 -1
  280. data/lib/puppet/version.rb +2 -2
  281. data/spec/fixtures/unit/pops/loaders/loaders/no_modules/manifests/site.pp +10 -0
  282. data/spec/integration/agent/logging_spec.rb +15 -14
  283. data/spec/integration/application/apply_spec.rb +1 -0
  284. data/spec/integration/directory_environments_spec.rb +16 -0
  285. data/spec/integration/environments/settings_spec.rb +32 -4
  286. data/spec/integration/faces/documentation_spec.rb +1 -1
  287. data/spec/integration/network/http/api/indirected_routes_spec.rb +33 -0
  288. data/spec/integration/node/environment_spec.rb +21 -0
  289. data/spec/integration/parser/collection_spec.rb +10 -0
  290. data/spec/integration/parser/compiler_spec.rb +76 -840
  291. data/spec/integration/parser/functions/require_spec.rb +3 -3
  292. data/spec/integration/parser/parameter_defaults_spec.rb +6 -2
  293. data/spec/integration/parser/pcore_resource_spec.rb +208 -0
  294. data/spec/integration/parser/resource_expressions_spec.rb +4 -2
  295. data/spec/integration/provider/yumrepo_spec.rb +4 -1
  296. data/spec/integration/transaction/report_spec.rb +666 -0
  297. data/spec/integration/type/file_spec.rb +11 -12
  298. data/spec/integration/util/windows/adsi_spec.rb +99 -0
  299. data/spec/integration/util/windows/principal_spec.rb +109 -60
  300. data/spec/integration/util/windows/process_spec.rb +4 -2
  301. data/spec/integration/util/windows/security_spec.rb +34 -8
  302. data/spec/integration/util/windows/user_spec.rb +26 -4
  303. data/spec/lib/puppet_spec/files.rb +2 -2
  304. data/spec/lib/puppet_spec/network.rb +12 -8
  305. data/spec/shared_examples/rhel_package_provider.rb +341 -0
  306. data/spec/spec_helper.rb +8 -2
  307. data/spec/unit/application/cert_spec.rb +20 -0
  308. data/spec/unit/configurer/plugin_handler_spec.rb +0 -26
  309. data/spec/unit/configurer_spec.rb +46 -0
  310. data/spec/unit/defaults_spec.rb +14 -0
  311. data/spec/unit/face/generate_spec.rb +230 -0
  312. data/spec/unit/face/help_spec.rb +53 -0
  313. data/spec/unit/face/parser_spec.rb +6 -0
  314. data/spec/unit/face/plugin_spec.rb +0 -4
  315. data/spec/unit/file_system_spec.rb +85 -0
  316. data/spec/unit/functions/lookup_spec.rb +4 -4
  317. data/spec/unit/functions/match_spec.rb +2 -2
  318. data/spec/unit/functions/regsubst_spec.rb +1 -1
  319. data/spec/unit/functions/split_spec.rb +1 -1
  320. data/spec/unit/functions/unwrap_spec.rb +29 -0
  321. data/spec/unit/functions/versioncmp_spec.rb +1 -1
  322. data/spec/unit/functions4_spec.rb +8 -8
  323. data/spec/unit/indirector/facts/facter_spec.rb +1 -9
  324. data/spec/unit/indirector/rest_spec.rb +95 -9
  325. data/spec/unit/module_spec.rb +43 -7
  326. data/spec/unit/module_tool/applications/installer_spec.rb +10 -1
  327. data/spec/unit/module_tool/applications/unpacker_spec.rb +2 -1
  328. data/spec/unit/module_tool/applications/upgrader_spec.rb +8 -0
  329. data/spec/unit/module_tool/tar/mini_spec.rb +3 -3
  330. data/spec/unit/network/http/api/indirected_routes_spec.rb +49 -58
  331. data/spec/unit/network/http/api/master/v3_spec.rb +7 -4
  332. data/spec/unit/network/rights_spec.rb +1 -1
  333. data/spec/unit/parameter_spec.rb +11 -0
  334. data/spec/unit/parser/compiler_spec.rb +19 -33
  335. data/spec/unit/{appmgmt_spec.rb → parser/environment_compiler_spec.rb} +12 -1
  336. data/spec/unit/parser/functions/create_resources_spec.rb +76 -4
  337. data/spec/unit/parser/functions/require_spec.rb +2 -2
  338. data/spec/unit/parser/resource_spec.rb +21 -11
  339. data/spec/unit/parser/scope_spec.rb +1 -5
  340. data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +1 -1
  341. data/spec/unit/pops/loaders/dependency_loader_spec.rb +1 -1
  342. data/spec/unit/pops/loaders/loader_paths_spec.rb +1 -1
  343. data/spec/unit/pops/loaders/loaders_spec.rb +63 -5
  344. data/spec/unit/pops/loaders/module_loaders_spec.rb +2 -2
  345. data/spec/unit/pops/loaders/static_loader_spec.rb +1 -1
  346. data/spec/unit/pops/parser/lexer2_spec.rb +27 -3
  347. data/spec/unit/pops/parser/parse_basic_expressions_spec.rb +8 -0
  348. data/spec/unit/pops/parser/parse_calls_spec.rb +9 -0
  349. data/spec/unit/pops/puppet_stack_spec.rb +79 -0
  350. data/spec/unit/pops/resource/resource_type_impl_spec.rb +37 -0
  351. data/spec/unit/pops/serialization/packer_spec.rb +153 -0
  352. data/spec/unit/pops/serialization/rgen_spec.rb +88 -0
  353. data/spec/unit/pops/serialization/serialization_spec.rb +228 -0
  354. data/spec/unit/pops/types/p_object_type_spec.rb +44 -2
  355. data/spec/unit/pops/types/p_sem_ver_type_spec.rb +42 -0
  356. data/spec/unit/pops/types/p_sensitive_type_spec.rb +139 -0
  357. data/spec/unit/pops/types/p_type_set_type_spec.rb +424 -0
  358. data/spec/unit/pops/types/ruby_generator_spec.rb +497 -181
  359. data/spec/unit/pops/types/type_calculator_spec.rb +10 -4
  360. data/spec/unit/pops/types/type_formatter_spec.rb +1 -1
  361. data/spec/unit/pops/types/type_mismatch_describer_spec.rb +2 -2
  362. data/spec/unit/pops/types/type_parser_spec.rb +1 -1
  363. data/spec/unit/pops/types/types_spec.rb +1 -1
  364. data/spec/unit/pops/validator/validator_spec.rb +18 -1
  365. data/spec/unit/property_spec.rb +48 -11
  366. data/spec/unit/provider/group/windows_adsi_spec.rb +11 -1
  367. data/spec/unit/provider/package/dnf_spec.rb +1 -99
  368. data/spec/unit/provider/package/pacman_spec.rb +4 -4
  369. data/spec/unit/provider/package/pip_spec.rb +14 -0
  370. data/spec/unit/provider/package/pkg_spec.rb +6 -0
  371. data/spec/unit/provider/package/pkgdmg_spec.rb +0 -3
  372. data/spec/unit/provider/package/portage_spec.rb +64 -8
  373. data/spec/unit/provider/package/tdnf_spec.rb +18 -0
  374. data/spec/unit/provider/package/windows/package_spec.rb +4 -1
  375. data/spec/unit/provider/package/windows_spec.rb +8 -2
  376. data/spec/unit/provider/package/yum_spec.rb +6 -377
  377. data/spec/unit/provider/service/base_spec.rb +6 -0
  378. data/spec/unit/provider/service/debian_spec.rb +16 -7
  379. data/spec/unit/provider/service/gentoo_spec.rb +6 -0
  380. data/spec/unit/provider/service/init_spec.rb +7 -0
  381. data/spec/unit/provider/service/launchd_spec.rb +35 -4
  382. data/spec/unit/provider/service/openrc_spec.rb +6 -0
  383. data/spec/unit/provider/service/smf_spec.rb +31 -6
  384. data/spec/unit/provider/service/src_spec.rb +6 -0
  385. data/spec/unit/provider/service/systemd_spec.rb +70 -20
  386. data/spec/unit/provider/service/upstart_spec.rb +6 -0
  387. data/spec/unit/provider/user/aix_spec.rb +7 -0
  388. data/spec/unit/provider/user/directoryservice_spec.rb +30 -1
  389. data/spec/unit/provider/user/windows_adsi_spec.rb +19 -0
  390. data/spec/unit/resource/capability_finder_spec.rb +51 -3
  391. data/spec/unit/resource/catalog_spec.rb +5 -0
  392. data/spec/unit/resource/type_spec.rb +2 -2
  393. data/spec/unit/resource_spec.rb +19 -0
  394. data/spec/unit/settings_spec.rb +13 -0
  395. data/spec/unit/ssl/certificate_authority/interface_spec.rb +176 -10
  396. data/spec/unit/ssl/certificate_authority_spec.rb +63 -22
  397. data/spec/unit/ssl/host_spec.rb +1 -1
  398. data/spec/unit/ssl/oids_spec.rb +24 -21
  399. data/spec/unit/transaction/event_spec.rb +3 -1
  400. data/spec/unit/transaction/persistence_spec.rb +173 -0
  401. data/spec/unit/transaction/report_spec.rb +64 -1
  402. data/spec/unit/transaction/resource_harness_spec.rb +91 -0
  403. data/spec/unit/type/file/content_spec.rb +47 -15
  404. data/spec/unit/type/file_spec.rb +28 -0
  405. data/spec/unit/type/mount_spec.rb +5 -12
  406. data/spec/unit/type/yumrepo_spec.rb +1 -5
  407. data/spec/unit/type_spec.rb +32 -0
  408. data/spec/unit/util/command_line_spec.rb +11 -0
  409. data/spec/unit/util/execution_spec.rb +1 -1
  410. data/spec/unit/util/plist_spec.rb +16 -3
  411. data/spec/unit/util/storage_spec.rb +4 -1
  412. data/spec/unit/util/windows/adsi_spec.rb +23 -2
  413. data/spec/unit/util/windows/file_spec.rb +56 -1
  414. data/spec/unit/util/windows/sid_spec.rb +31 -7
  415. data/spec/unit/util/yaml_spec.rb +12 -0
  416. data/spec/unit/util_spec.rb +87 -20
  417. metadata +91 -48
  418. data/ext/puppetlisten/puppetlisten.rb +0 -77
  419. data/ext/puppetlisten/puppetrun.rb +0 -38
  420. data/lib/puppet/resource/type_collection_helper.rb +0 -7
  421. data/spec/unit/parser/functions/defined_spec.rb +0 -120
  422. data/spec/unit/resource/type_collection_helper_spec.rb +0 -24
@@ -12,11 +12,16 @@ describe "Puppet::Util::Windows::Security", :if => Puppet.features.microsoft_win
12
12
  include PuppetSpec::Files
13
13
 
14
14
  before :all do
15
+
16
+ # necessary for localized name of guests
17
+ guests_name = Puppet::Util::Windows::SID.sid_to_name('S-1-5-32-546')
18
+ guests = Puppet::Util::Windows::ADSI::Group.new(guests_name)
19
+
15
20
  @sids = {
16
21
  :current_user => Puppet::Util::Windows::SID.name_to_sid(Puppet::Util::Windows::ADSI::User.current_user_name),
17
22
  :system => Puppet::Util::Windows::SID::LocalSystem,
18
23
  :administrators => Puppet::Util::Windows::SID::BuiltinAdministrators,
19
- :guest => Puppet::Util::Windows::SID.name_to_sid("Guest"),
24
+ :guest => Puppet::Util::Windows::SID.name_to_sid(guests.members[0]),
20
25
  :users => Puppet::Util::Windows::SID::BuiltinUsers,
21
26
  :power_users => Puppet::Util::Windows::SID::PowerUsers,
22
27
  :none => Puppet::Util::Windows::SID::Nobody,
@@ -132,7 +137,10 @@ describe "Puppet::Util::Windows::Security", :if => Puppet.features.microsoft_win
132
137
  end
133
138
 
134
139
  it "should raise an exception when setting to a different user" do
135
- expect { winsec.set_owner(sids[:guest], path) }.to raise_error(Puppet::Error, /This security ID may not be assigned as the owner of this object./)
140
+ expect { winsec.set_owner(sids[:guest], path) }.to raise_error do |error|
141
+ expect(error).to be_a(Puppet::Util::Windows::Error)
142
+ expect(error.code).to eq(1307) # ERROR_INVALID_OWNER
143
+ end
136
144
  end
137
145
  end
138
146
 
@@ -142,7 +150,10 @@ describe "Puppet::Util::Windows::Security", :if => Puppet.features.microsoft_win
142
150
  end
143
151
 
144
152
  it "should raise an exception if an invalid path is provided" do
145
- expect { winsec.get_owner("c:\\doesnotexist.txt") }.to raise_error(Puppet::Error, /The system cannot find the file specified./)
153
+ expect { winsec.get_owner("c:\\doesnotexist.txt") }.to raise_error do |error|
154
+ expect(error).to be_a(Puppet::Util::Windows::Error)
155
+ expect(error.code).to eq(2) # ERROR_FILE_NOT_FOUND
156
+ end
146
157
  end
147
158
  end
148
159
 
@@ -164,7 +175,10 @@ describe "Puppet::Util::Windows::Security", :if => Puppet.features.microsoft_win
164
175
  end
165
176
 
166
177
  it "should raise an exception if an invalid path is provided" do
167
- expect { winsec.get_group("c:\\doesnotexist.txt") }.to raise_error(Puppet::Error, /The system cannot find the file specified./)
178
+ expect { winsec.get_group("c:\\doesnotexist.txt") }.to raise_error do |error|
179
+ expect(error).to be_a(Puppet::Util::Windows::Error)
180
+ expect(error.code).to eq(2) # ERROR_FILE_NOT_FOUND
181
+ end
168
182
  end
169
183
  end
170
184
 
@@ -300,7 +314,10 @@ describe "Puppet::Util::Windows::Security", :if => Puppet.features.microsoft_win
300
314
  end
301
315
 
302
316
  it "should raise an exception if an invalid path is provided" do
303
- expect { winsec.set_mode(sids[:guest], "c:\\doesnotexist.txt") }.to raise_error(Puppet::Error, /The system cannot find the file specified./)
317
+ expect { winsec.set_mode(sids[:guest], "c:\\doesnotexist.txt") }.to raise_error do |error|
318
+ expect(error).to be_a(Puppet::Util::Windows::Error)
319
+ expect(error.code).to eq(2) # ERROR_FILE_NOT_FOUND
320
+ end
304
321
  end
305
322
  end
306
323
 
@@ -344,7 +361,10 @@ describe "Puppet::Util::Windows::Security", :if => Puppet.features.microsoft_win
344
361
  end
345
362
 
346
363
  it "should raise an exception if an invalid path is provided" do
347
- expect { winsec.get_mode("c:\\doesnotexist.txt") }.to raise_error(Puppet::Error, /The system cannot find the file specified./)
364
+ expect { winsec.get_mode("c:\\doesnotexist.txt") }.to raise_error do |error|
365
+ expect(error).to be_a(Puppet::Util::Windows::Error)
366
+ expect(error.code).to eq(2) # ERROR_FILE_NOT_FOUND
367
+ end
348
368
  end
349
369
  end
350
370
 
@@ -424,7 +444,10 @@ describe "Puppet::Util::Windows::Security", :if => Puppet.features.microsoft_win
424
444
  end
425
445
 
426
446
  it "should raise an exception if an invalid path is provided" do
427
- expect { winsec.set_owner(sids[:guest], "c:\\doesnotexist.txt") }.to raise_error(Puppet::Error, /The system cannot find the file specified./)
447
+ expect { winsec.set_owner(sids[:guest], "c:\\doesnotexist.txt") }.to raise_error do |error|
448
+ expect(error).to be_a(Puppet::Util::Windows::Error)
449
+ expect(error.code).to eq(2) # ERROR_FILE_NOT_FOUND
450
+ end
428
451
  end
429
452
  end
430
453
 
@@ -463,7 +486,10 @@ describe "Puppet::Util::Windows::Security", :if => Puppet.features.microsoft_win
463
486
  end
464
487
 
465
488
  it "should raise an exception if an invalid path is provided" do
466
- expect { winsec.set_group(sids[:guest], "c:\\doesnotexist.txt") }.to raise_error(Puppet::Error, /The system cannot find the file specified./)
489
+ expect { winsec.set_group(sids[:guest], "c:\\doesnotexist.txt") }.to raise_error do |error|
490
+ expect(error).to be_a(Puppet::Util::Windows::Error)
491
+ expect(error.code).to eq(2) # ERROR_FILE_NOT_FOUND
492
+ end
467
493
  end
468
494
  end
469
495
 
@@ -106,13 +106,35 @@ describe "Puppet::Util::Windows::User", :if => Puppet.features.microsoft_windows
106
106
  expect(Puppet::Util::Windows::User.password_is?(username, bad_password)).to be_falsey
107
107
  end
108
108
 
109
- it "should return false given an incorrect username and nil password" do
110
- expect(Puppet::Util::Windows::User.password_is?(username, nil)).to be_falsey
111
- end
112
-
113
109
  it "should return false given a nil username and an incorrect password" do
114
110
  expect(Puppet::Util::Windows::User.password_is?(nil, bad_password)).to be_falsey
115
111
  end
112
+
113
+ context "with a correct password" do
114
+ it "should return true even if account restrictions are in place " do
115
+ error = Puppet::Util::Windows::Error.new('', Puppet::Util::Windows::User::ERROR_ACCOUNT_RESTRICTION)
116
+ Puppet::Util::Windows::User.stubs(:logon_user).raises(error)
117
+ expect(Puppet::Util::Windows::User.password_is?(username, 'p@ssword')).to be(true)
118
+ end
119
+
120
+ it "should return true even for an account outside of logon hours" do
121
+ error = Puppet::Util::Windows::Error.new('', Puppet::Util::Windows::User::ERROR_INVALID_LOGON_HOURS)
122
+ Puppet::Util::Windows::User.stubs(:logon_user).raises(error)
123
+ expect(Puppet::Util::Windows::User.password_is?(username, 'p@ssword')).to be(true)
124
+ end
125
+
126
+ it "should return true even for an account not allowed to log into this workstation" do
127
+ error = Puppet::Util::Windows::Error.new('', Puppet::Util::Windows::User::ERROR_INVALID_WORKSTATION)
128
+ Puppet::Util::Windows::User.stubs(:logon_user).raises(error)
129
+ expect(Puppet::Util::Windows::User.password_is?(username, 'p@ssword')).to be(true)
130
+ end
131
+
132
+ it "should return true even for a disabled account" do
133
+ error = Puppet::Util::Windows::Error.new('', Puppet::Util::Windows::User::ERROR_ACCOUNT_DISABLED)
134
+ Puppet::Util::Windows::User.stubs(:logon_user).raises(error)
135
+ expect(Puppet::Util::Windows::User.password_is?(username, 'p@ssword')).to be(true)
136
+ end
137
+ end
116
138
  end
117
139
 
118
140
  describe "check_token_membership" do
@@ -28,7 +28,7 @@ module PuppetSpec::Files
28
28
  def self.tmpfile(name, dir = nil)
29
29
  # Generate a temporary file, just for the name...
30
30
  source = dir ? Tempfile.new(name, dir) : Tempfile.new(name)
31
- path = source.path.encode(Encoding::UTF_8)
31
+ path = Puppet::FileSystem.expand_path(source.path.encode(Encoding::UTF_8))
32
32
  source.close!
33
33
 
34
34
  record_tmp(File.expand_path(path))
@@ -59,7 +59,7 @@ module PuppetSpec::Files
59
59
 
60
60
  def tmpdir(name) PuppetSpec::Files.tmpdir(name) end
61
61
  def self.tmpdir(name)
62
- dir = Dir.mktmpdir(name).encode!(Encoding::UTF_8)
62
+ dir = Puppet::FileSystem.expand_path(Dir.mktmpdir(name).encode!(Encoding::UTF_8))
63
63
 
64
64
  record_tmp(dir)
65
65
 
@@ -5,20 +5,24 @@ require 'puppet/network/http/api/indirected_routes'
5
5
  require 'puppet/indirector_testing'
6
6
 
7
7
  module PuppetSpec::Network
8
- def not_found_code
9
- Puppet::Network::HTTP::Error::HTTPNotFoundError::CODE
8
+ def not_found_error
9
+ Puppet::Network::HTTP::Error::HTTPNotFoundError
10
10
  end
11
11
 
12
- def not_acceptable_code
13
- Puppet::Network::HTTP::Error::HTTPNotAcceptableError::CODE
12
+ def not_acceptable_error
13
+ Puppet::Network::HTTP::Error::HTTPNotAcceptableError
14
14
  end
15
15
 
16
- def bad_request_code
17
- Puppet::Network::HTTP::Error::HTTPBadRequestError::CODE
16
+ def bad_request_error
17
+ Puppet::Network::HTTP::Error::HTTPBadRequestError
18
18
  end
19
19
 
20
- def not_authorized_code
21
- Puppet::Network::HTTP::Error::HTTPNotAuthorizedError::CODE
20
+ def not_authorized_error
21
+ Puppet::Network::HTTP::Error::HTTPNotAuthorizedError
22
+ end
23
+
24
+ def method_not_allowed_error
25
+ Puppet::Network::HTTP::Error::HTTPMethodNotAllowedError
22
26
  end
23
27
 
24
28
  def params
@@ -0,0 +1,341 @@
1
+ shared_examples "RHEL package provider" do |provider_class, provider_name|
2
+ describe provider_name do
3
+
4
+ let(:name) { 'mypackage' }
5
+ let(:resource) do
6
+ Puppet::Type.type(:package).new(
7
+ :name => name,
8
+ :ensure => :installed,
9
+ :provider => provider_name
10
+ )
11
+ end
12
+ let(:provider) do
13
+ provider = provider_class.new
14
+ provider.resource = resource
15
+ provider
16
+ end
17
+ let(:arch) { 'x86_64' }
18
+ let(:arch_resource) do
19
+ Puppet::Type.type(:package).new(
20
+ :name => "#{name}.#{arch}",
21
+ :ensure => :installed,
22
+ :provider => provider_name
23
+ )
24
+ end
25
+ let(:arch_provider) do
26
+ provider = provider_class.new
27
+ provider.resource = arch_resource
28
+ provider
29
+ end
30
+
31
+ case provider_name
32
+ when 'yum'
33
+ let(:error_level) { '0' }
34
+ when 'dnf'
35
+ let(:error_level) { '1' }
36
+ when 'tdnf'
37
+ let(:error_level) { '1' }
38
+ end
39
+
40
+ case provider_name
41
+ when 'yum'
42
+ let(:upgrade_command) { 'update' }
43
+ when 'dnf'
44
+ let(:upgrade_command) { 'upgrade' }
45
+ when 'tdnf'
46
+ let(:upgrade_command) { 'upgrade' }
47
+ end
48
+
49
+ before do
50
+ provider_class.stubs(:command).with(:cmd).returns("/usr/bin/#{provider_name}")
51
+ provider.stubs(:rpm).returns 'rpm'
52
+ provider.stubs(:get).with(:version).returns '1'
53
+ provider.stubs(:get).with(:release).returns '1'
54
+ provider.stubs(:get).with(:arch).returns 'i386'
55
+ end
56
+ describe 'provider features' do
57
+ it { is_expected.to be_versionable }
58
+ it { is_expected.to be_install_options }
59
+ it { is_expected.to be_virtual_packages }
60
+ end
61
+ # provider should repond to the following methods
62
+ [:install, :latest, :update, :purge, :install_options].each do |method|
63
+ it "should have a(n) #{method}" do
64
+ expect(provider).to respond_to(method)
65
+ end
66
+ end
67
+ describe 'when installing' do
68
+ before(:each) do
69
+ Puppet::Util.stubs(:which).with("rpm").returns("/bin/rpm")
70
+ provider.stubs(:which).with("rpm").returns("/bin/rpm")
71
+ Puppet::Util::Execution.expects(:execute).with(["/bin/rpm", "--version"], {:combine => true, :custom_environment => {}, :failonfail => true}).returns("4.10.1\n").at_most_once
72
+ Facter.stubs(:value).with(:operatingsystemmajrelease).returns('6')
73
+ end
74
+ it "should call #{provider_name} install for :installed" do
75
+ resource.stubs(:should).with(:ensure).returns :installed
76
+ Puppet::Util::Execution.expects(:execute).with(["/usr/bin/#{provider_name}", '-d', '0', '-e', error_level, '-y', :install, 'mypackage'])
77
+ provider.install
78
+ end
79
+
80
+ if provider_name == 'yum'
81
+ context 'on el-5' do
82
+ before(:each) do
83
+ Facter.stubs(:value).with(:operatingsystemmajrelease).returns('5')
84
+ end
85
+ it "should catch #{provider_name} install failures when status code is wrong" do
86
+ resource.stubs(:should).with(:ensure).returns :installed
87
+ Puppet::Util::Execution.expects(:execute).with(["/usr/bin/#{provider_name}", '-e', error_level, '-y', :install, name]).returns("No package #{name} available.")
88
+ expect {
89
+ provider.install
90
+ }.to raise_error(Puppet::Error, "Could not find package #{name}")
91
+ end
92
+ end
93
+ end
94
+ it 'should use :install to update' do
95
+ provider.expects(:install)
96
+ provider.update
97
+ end
98
+ it 'should be able to set version' do
99
+ version = '1.2'
100
+ resource[:ensure] = version
101
+ Puppet::Util::Execution.expects(:execute).with(["/usr/bin/#{provider_name}", '-d', '0', '-e', error_level, '-y', :install, "#{name}-#{version}"])
102
+ provider.stubs(:query).returns :ensure => version
103
+ provider.install
104
+ end
105
+ it 'should handle partial versions specified' do
106
+ version = '1.3.4'
107
+ resource[:ensure] = version
108
+ Puppet::Util::Execution.expects(:execute).with(["/usr/bin/#{provider_name}", '-d', '0', '-e', error_level, '-y', :install, 'mypackage-1.3.4'])
109
+ provider.stubs(:query).returns :ensure => '1.3.4-1.el6'
110
+ provider.install
111
+ end
112
+ it 'should be able to downgrade' do
113
+ current_version = '1.2'
114
+ version = '1.0'
115
+ resource[:ensure] = '1.0'
116
+ Puppet::Util::Execution.expects(:execute).with(["/usr/bin/#{provider_name}", '-d', '0', '-e', error_level, '-y', :downgrade, "#{name}-#{version}"])
117
+ provider.stubs(:query).returns(:ensure => current_version).then.returns(:ensure => version)
118
+ provider.install
119
+ end
120
+ it 'should be able to upgrade' do
121
+ current_version = '1.0'
122
+ version = '1.2'
123
+ resource[:ensure] = '1.2'
124
+ Puppet::Util::Execution.expects(:execute).with(["/usr/bin/#{provider_name}", '-d', '0', '-e', error_level, '-y', upgrade_command, "#{name}-#{version}"])
125
+ provider.stubs(:query).returns(:ensure => current_version).then.returns(:ensure => version)
126
+ provider.install
127
+ end
128
+ it 'should accept install options' do
129
+ resource[:ensure] = :installed
130
+ resource[:install_options] = ['-t', {'-x' => 'expackage'}]
131
+ Puppet::Util::Execution.expects(:execute).with(["/usr/bin/#{provider_name}", '-d', '0', '-e', error_level, '-y', ['-t', '-x=expackage'], :install, name])
132
+ provider.install
133
+ end
134
+ it 'allow virtual packages' do
135
+ resource[:ensure] = :installed
136
+ resource[:allow_virtual] = true
137
+ Puppet::Util::Execution.expects(:execute).with(["/usr/bin/#{provider_name}", '-d', '0', '-e', error_level, '-y', :list, name]).never
138
+ Puppet::Util::Execution.expects(:execute).with(["/usr/bin/#{provider_name}", '-d', '0', '-e', error_level, '-y', :install, name])
139
+ provider.install
140
+ end
141
+ it 'moves architecture to end of version' do
142
+ version = '1.2.3'
143
+ arch_resource[:ensure] = version
144
+ Puppet::Util::Execution.expects(:execute).with(["/usr/bin/#{provider_name}", '-d', '0', '-e', error_level, '-y', :install, "#{name}-#{version}.#{arch}"])
145
+ arch_provider.stubs(:query).returns :ensure => version
146
+ arch_provider.install
147
+ end
148
+ end
149
+ describe 'when uninstalling' do
150
+ it 'should use erase to purge' do
151
+ Puppet::Util::Execution.expects(:execute).with(["/usr/bin/#{provider_name}", '-y', :erase, name])
152
+ provider.purge
153
+ end
154
+ end
155
+ it 'should be versionable' do
156
+ expect(provider).to be_versionable
157
+ end
158
+ describe 'determining the latest version available for a package' do
159
+ it "passes the value of enablerepo install_options when querying" do
160
+ resource[:install_options] = [
161
+ {'--enablerepo' => 'contrib'},
162
+ {'--enablerepo' => 'centosplus'},
163
+ ]
164
+ provider.stubs(:properties).returns({:ensure => '3.4.5'})
165
+ described_class.expects(:latest_package_version).with(name, ['contrib', 'centosplus'], [], [])
166
+ provider.latest
167
+ end
168
+ it "passes the value of disablerepo install_options when querying" do
169
+ resource[:install_options] = [
170
+ {'--disablerepo' => 'updates'},
171
+ {'--disablerepo' => 'centosplus'},
172
+ ]
173
+ provider.stubs(:properties).returns({:ensure => '3.4.5'})
174
+ described_class.expects(:latest_package_version).with(name, [], ['updates', 'centosplus'], [])
175
+ provider.latest
176
+ end
177
+ it "passes the value of disableexcludes install_options when querying" do
178
+ resource[:install_options] = [
179
+ {'--disableexcludes' => 'main'},
180
+ {'--disableexcludes' => 'centosplus'},
181
+ ]
182
+ provider.stubs(:properties).returns({:ensure => '3.4.5'})
183
+ described_class.expects(:latest_package_version).with(name, [], [], ['main', 'centosplus'])
184
+ provider.latest
185
+ end
186
+ describe 'and a newer version is not available' do
187
+ before :each do
188
+ described_class.stubs(:latest_package_version).with(name, [], [], []).returns nil
189
+ end
190
+ it 'raises an error the package is not installed' do
191
+ provider.stubs(:properties).returns({:ensure => :absent})
192
+ expect {
193
+ provider.latest
194
+ }.to raise_error(Puppet::DevError, 'Tried to get latest on a missing package')
195
+ end
196
+ it 'returns version of the currently installed package' do
197
+ provider.stubs(:properties).returns({:ensure => '3.4.5'})
198
+ expect(provider.latest).to eq('3.4.5')
199
+ end
200
+ end
201
+ describe 'and a newer version is available' do
202
+ let(:latest_version) do
203
+ {
204
+ :name => name,
205
+ :epoch => '1',
206
+ :version => '2.3.4',
207
+ :release => '5',
208
+ :arch => 'i686',
209
+ }
210
+ end
211
+ it 'includes the epoch in the version string' do
212
+ described_class.stubs(:latest_package_version).with(name, [], [], []).returns(latest_version)
213
+ expect(provider.latest).to eq('1:2.3.4-5')
214
+ end
215
+ end
216
+ end
217
+ describe "lazy loading of latest package versions" do
218
+ before { described_class.clear }
219
+ after { described_class.clear }
220
+ let(:mypackage_version) do
221
+ {
222
+ :name => name,
223
+ :epoch => '1',
224
+ :version => '2.3.4',
225
+ :release => '5',
226
+ :arch => 'i686',
227
+ }
228
+ end
229
+ let(:mypackage_newerversion) do
230
+ {
231
+ :name => name,
232
+ :epoch => '1',
233
+ :version => '4.5.6',
234
+ :release => '7',
235
+ :arch => 'i686',
236
+ }
237
+ end
238
+ let(:latest_versions) { {name => [mypackage_version]} }
239
+ let(:enabled_versions) { {name => [mypackage_newerversion]} }
240
+ it "returns the version hash if the package was found" do
241
+ described_class.expects(:check_updates).with([], [], []).once.returns(latest_versions)
242
+ version = described_class.latest_package_version(name, [], [], [])
243
+ expect(version).to eq(mypackage_version)
244
+ end
245
+ it "is nil if the package was not found in the query" do
246
+ described_class.expects(:check_updates).with([], [], []).once.returns(latest_versions)
247
+ version = described_class.latest_package_version('nopackage', [], [], [])
248
+ expect(version).to be_nil
249
+ end
250
+ it "caches the package list and reuses that for subsequent queries" do
251
+ described_class.expects(:check_updates).with([], [], []).once.returns(latest_versions)
252
+ 2.times {
253
+ version = described_class.latest_package_version(name, [], [], [])
254
+ expect(version).to eq mypackage_version
255
+ }
256
+ end
257
+ it "caches separate lists for each combination of 'enablerepo' and 'disablerepo' and 'disableexcludes'" do
258
+ described_class.expects(:check_updates).with([], [], []).once.returns(latest_versions)
259
+ described_class.expects(:check_updates).with(['enabled'], ['disabled'], ['disableexcludes']).once.returns(enabled_versions)
260
+ 2.times {
261
+ version = described_class.latest_package_version(name, [], [], [])
262
+ expect(version).to eq mypackage_version
263
+ }
264
+ 2.times {
265
+ version = described_class.latest_package_version(name, ['enabled'], ['disabled'], ['disableexcludes'])
266
+ expect(version).to eq(mypackage_newerversion)
267
+ }
268
+ end
269
+ end
270
+ describe "executing #{provider_name} check-update" do
271
+ it "passes repos to enable to '#{provider_name} check-update'" do
272
+ Puppet::Util::Execution.expects(:execute).with do |args, *rest|
273
+ expect(args).to eq %W[/usr/bin/#{provider_name} check-update --enablerepo=updates --enablerepo=centosplus]
274
+ end.returns(stub(:exitstatus => 0))
275
+ described_class.check_updates(%W[updates centosplus], [], [])
276
+ end
277
+ it "passes repos to disable to '#{provider_name} check-update'" do
278
+ Puppet::Util::Execution.expects(:execute).with do |args, *rest|
279
+ expect(args).to eq %W[/usr/bin/#{provider_name} check-update --disablerepo=updates --disablerepo=centosplus]
280
+ end.returns(stub(:exitstatus => 0))
281
+ described_class.check_updates([],%W[updates centosplus], [])
282
+ end
283
+ it "passes a combination of repos to enable and disable to '#{provider_name} check-update'" do
284
+ Puppet::Util::Execution.expects(:execute).with do |args, *rest|
285
+ expect(args).to eq %W[/usr/bin/#{provider_name} check-update --enablerepo=os --enablerepo=contrib --disablerepo=updates --disablerepo=centosplus]
286
+ end.returns(stub(:exitstatus => 0))
287
+ described_class.check_updates(%W[os contrib], %W[updates centosplus], [])
288
+ end
289
+ it "passes disableexcludes to '#{provider_name} check-update'" do
290
+ Puppet::Util::Execution.expects(:execute).with do |args, *rest|
291
+ expect(args).to eq %W[/usr/bin/#{provider_name} check-update --disableexcludes=main --disableexcludes=centosplus]
292
+ end.returns(stub(:exitstatus => 0))
293
+ described_class.check_updates([], [], %W[main centosplus])
294
+ end
295
+ it "passes all options to '#{provider_name} check-update'" do
296
+ Puppet::Util::Execution.expects(:execute).with do |args, *rest|
297
+ expect(args).to eq %W[/usr/bin/#{provider_name} check-update --enablerepo=a --enablerepo=b --disablerepo=c
298
+ --disablerepo=d --disableexcludes=e --disableexcludes=f]
299
+ end.returns(stub(:exitstatus => 0))
300
+ described_class.check_updates(%W[a b], %W[c d], %W[e f])
301
+ end
302
+ it "returns an empty hash if '#{provider_name} check-update' returned 0" do
303
+ Puppet::Util::Execution.expects(:execute).returns(stub :exitstatus => 0)
304
+ expect(described_class.check_updates([], [], [])).to be_empty
305
+ end
306
+ it "returns a populated hash if '#{provider_name} check-update returned 100'" do
307
+ output = stub(:exitstatus => 100)
308
+ Puppet::Util::Execution.expects(:execute).returns(output)
309
+ described_class.expects(:parse_updates).with(output).returns({:has => :updates})
310
+ expect(described_class.check_updates([], [], [])).to eq({:has => :updates})
311
+ end
312
+ it "returns an empty hash if '#{provider_name} check-update' returned an exit code that was not 0 or 100" do
313
+ Puppet::Util::Execution.expects(:execute).returns(stub(:exitstatus => 1))
314
+ described_class.expects(:warning).with("Could not check for updates, \'/usr/bin/#{provider_name} check-update\' exited with 1")
315
+ expect(described_class.check_updates([], [], [])).to eq({})
316
+ end
317
+ end
318
+ describe "parsing a line from #{provider_name} check-update" do
319
+ it "splits up the package name and architecture fields" do
320
+ checkupdate = %W[curl.i686 7.32.0-10.fc20]
321
+ parsed = described_class.update_to_hash(*checkupdate)
322
+ expect(parsed[:name]).to eq 'curl'
323
+ expect(parsed[:arch]).to eq 'i686'
324
+ end
325
+ it "splits up the epoch, version, and release fields" do
326
+ checkupdate = %W[dhclient.i686 12:4.1.1-38.P1.el6.centos]
327
+ parsed = described_class.update_to_hash(*checkupdate)
328
+ expect(parsed[:epoch]).to eq '12'
329
+ expect(parsed[:version]).to eq '4.1.1'
330
+ expect(parsed[:release]).to eq '38.P1.el6.centos'
331
+ end
332
+ it "sets the epoch to 0 when an epoch is not specified" do
333
+ checkupdate = %W[curl.i686 7.32.0-10.fc20]
334
+ parsed = described_class.update_to_hash(*checkupdate)
335
+ expect(parsed[:epoch]).to eq '0'
336
+ expect(parsed[:version]).to eq '7.32.0'
337
+ expect(parsed[:release]).to eq '10.fc20'
338
+ end
339
+ end
340
+ end
341
+ end