puppet 5.4.0 → 5.5.0

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 (441) hide show
  1. data/Gemfile +3 -3
  2. data/MAINTAINERS +0 -19
  3. data/README.md +5 -5
  4. data/Rakefile +26 -0
  5. data/conf/auth.conf +5 -0
  6. data/ext/project_data.yaml +1 -0
  7. data/ext/regexp_nodes/regexp_nodes.rb +3 -4
  8. data/lib/puppet/application/apply.rb +1 -1
  9. data/lib/puppet/application/cert.rb +3 -1
  10. data/lib/puppet/application/device.rb +100 -13
  11. data/lib/puppet/application/facts.rb +5 -0
  12. data/lib/puppet/application/lookup.rb +12 -2
  13. data/lib/puppet/configurer.rb +37 -17
  14. data/lib/puppet/confine.rb +4 -1
  15. data/lib/puppet/datatypes.rb +1 -1
  16. data/lib/puppet/environments.rb +1 -1
  17. data/lib/puppet/error.rb +6 -3
  18. data/lib/puppet/external/dot.rb +0 -7
  19. data/lib/puppet/external/nagios/parser.rb +1 -1
  20. data/lib/puppet/face/config.rb +92 -10
  21. data/lib/puppet/face/epp.rb +31 -6
  22. data/lib/puppet/face/facts.rb +49 -0
  23. data/lib/puppet/face/help.rb +33 -35
  24. data/lib/puppet/face/help/action.erb +1 -1
  25. data/lib/puppet/face/help/face.erb +1 -1
  26. data/lib/puppet/face/man.rb +55 -12
  27. data/lib/puppet/face/parser.rb +30 -3
  28. data/lib/puppet/file_bucket/file.rb +0 -2
  29. data/lib/puppet/file_serving/base.rb +10 -10
  30. data/lib/puppet/forge.rb +3 -3
  31. data/lib/puppet/forge/errors.rb +3 -3
  32. data/lib/puppet/functions.rb +1 -3
  33. data/lib/puppet/functions/alert.rb +1 -1
  34. data/lib/puppet/functions/all.rb +6 -6
  35. data/lib/puppet/functions/annotate.rb +10 -10
  36. data/lib/puppet/functions/any.rb +6 -6
  37. data/lib/puppet/functions/assert_type.rb +4 -4
  38. data/lib/puppet/functions/binary_file.rb +14 -2
  39. data/lib/puppet/functions/break.rb +31 -2
  40. data/lib/puppet/functions/call.rb +4 -4
  41. data/lib/puppet/functions/contain.rb +19 -3
  42. data/lib/puppet/functions/convert_to.rb +6 -5
  43. data/lib/puppet/functions/crit.rb +1 -1
  44. data/lib/puppet/functions/debug.rb +1 -1
  45. data/lib/puppet/functions/defined.rb +11 -9
  46. data/lib/puppet/functions/dig.rb +26 -2
  47. data/lib/puppet/functions/each.rb +8 -8
  48. data/lib/puppet/functions/emerg.rb +1 -1
  49. data/lib/puppet/functions/empty.rb +79 -0
  50. data/lib/puppet/functions/err.rb +1 -1
  51. data/lib/puppet/functions/eyaml_lookup_key.rb +3 -1
  52. data/lib/puppet/functions/filter.rb +7 -7
  53. data/lib/puppet/functions/find_file.rb +15 -1
  54. data/lib/puppet/functions/flatten.rb +64 -0
  55. data/lib/puppet/functions/hiera.rb +6 -6
  56. data/lib/puppet/functions/hiera_array.rb +6 -6
  57. data/lib/puppet/functions/hiera_hash.rb +6 -6
  58. data/lib/puppet/functions/hiera_include.rb +8 -8
  59. data/lib/puppet/functions/include.rb +28 -2
  60. data/lib/puppet/functions/info.rb +1 -1
  61. data/lib/puppet/functions/inline_epp.rb +2 -2
  62. data/lib/puppet/functions/join.rb +56 -0
  63. data/lib/puppet/functions/json_data.rb +2 -2
  64. data/lib/puppet/functions/keys.rb +25 -0
  65. data/lib/puppet/functions/length.rb +44 -0
  66. data/lib/puppet/functions/lest.rb +39 -1
  67. data/lib/puppet/functions/lookup.rb +2 -1
  68. data/lib/puppet/functions/map.rb +10 -9
  69. data/lib/puppet/functions/match.rb +6 -6
  70. data/lib/puppet/functions/new.rb +995 -2
  71. data/lib/puppet/functions/next.rb +1 -1
  72. data/lib/puppet/functions/notice.rb +1 -1
  73. data/lib/puppet/functions/reduce.rb +6 -6
  74. data/lib/puppet/functions/regsubst.rb +9 -3
  75. data/lib/puppet/functions/require.rb +36 -2
  76. data/lib/puppet/functions/return.rb +1 -1
  77. data/lib/puppet/functions/reverse_each.rb +71 -2
  78. data/lib/puppet/functions/slice.rb +23 -9
  79. data/lib/puppet/functions/split.rb +12 -10
  80. data/lib/puppet/functions/step.rb +73 -1
  81. data/lib/puppet/functions/strftime.rb +176 -2
  82. data/lib/puppet/functions/then.rb +65 -2
  83. data/lib/puppet/functions/tree_each.rb +19 -19
  84. data/lib/puppet/functions/type.rb +42 -1
  85. data/lib/puppet/functions/unique.rb +13 -13
  86. data/lib/puppet/functions/unwrap.rb +8 -4
  87. data/lib/puppet/functions/values.rb +25 -0
  88. data/lib/puppet/functions/versioncmp.rb +1 -1
  89. data/lib/puppet/functions/warning.rb +1 -1
  90. data/lib/puppet/functions/with.rb +6 -4
  91. data/lib/puppet/functions/yaml_data.rb +3 -1
  92. data/lib/puppet/indirector/certificate_status/file.rb +1 -1
  93. data/lib/puppet/indirector/facts/facter.rb +1 -3
  94. data/lib/puppet/indirector/facts/rest.rb +21 -0
  95. data/lib/puppet/indirector/facts/yaml.rb +0 -4
  96. data/lib/puppet/indirector/rest.rb +2 -2
  97. data/lib/puppet/module.rb +3 -3
  98. data/lib/puppet/module/task.rb +2 -3
  99. data/lib/puppet/module_tool/applications/application.rb +4 -4
  100. data/lib/puppet/module_tool/applications/builder.rb +2 -2
  101. data/lib/puppet/module_tool/applications/checksummer.rb +3 -3
  102. data/lib/puppet/module_tool/applications/unpacker.rb +2 -2
  103. data/lib/puppet/module_tool/metadata.rb +3 -3
  104. data/lib/puppet/network/authconfig.rb +1 -1
  105. data/lib/puppet/network/format_support.rb +1 -1
  106. data/lib/puppet/network/formats.rb +5 -7
  107. data/lib/puppet/network/http/api/indirected_routes.rb +1 -0
  108. data/lib/puppet/network/http/api/master/v3/environment.rb +2 -2
  109. data/lib/puppet/network/http/api/master/v3/environments.rb +2 -2
  110. data/lib/puppet/network/http/error.rb +3 -3
  111. data/lib/puppet/network/resolver.rb +1 -2
  112. data/lib/puppet/parser/compiler.rb +12 -5
  113. data/lib/puppet/parser/compiler/catalog_validator/env_relationship_validator.rb +1 -1
  114. data/lib/puppet/parser/functions/fqdn_rand.rb +15 -4
  115. data/lib/puppet/parser/functions/new.rb +31 -46
  116. data/lib/puppet/parser/parser_factory.rb +1 -1
  117. data/lib/puppet/parser/resource.rb +1 -1
  118. data/lib/puppet/parser/type_loader.rb +11 -11
  119. data/lib/puppet/pops/evaluator/closure.rb +1 -1
  120. data/lib/puppet/pops/evaluator/collector_transformer.rb +1 -1
  121. data/lib/puppet/pops/evaluator/epp_evaluator.rb +2 -2
  122. data/lib/puppet/pops/evaluator/runtime3_resource_support.rb +2 -2
  123. data/lib/puppet/pops/evaluator/runtime3_support.rb +5 -2
  124. data/lib/puppet/pops/functions/dispatch.rb +1 -1
  125. data/lib/puppet/pops/issue_reporter.rb +18 -1
  126. data/lib/puppet/pops/issues.rb +6 -3
  127. data/lib/puppet/pops/loader/ruby_data_type_instantiator.rb +1 -2
  128. data/lib/puppet/pops/loader/ruby_function_instantiator.rb +1 -2
  129. data/lib/puppet/pops/loader/task_instantiator.rb +5 -5
  130. data/lib/puppet/pops/loader/type_definition_instantiator.rb +4 -1
  131. data/lib/puppet/pops/loaders.rb +18 -7
  132. data/lib/puppet/pops/lookup/global_data_provider.rb +1 -1
  133. data/lib/puppet/pops/lookup/lookup_adapter.rb +55 -6
  134. data/lib/puppet/pops/model/factory.rb +6 -3
  135. data/lib/puppet/pops/model/model_tree_dumper.rb +4 -0
  136. data/lib/puppet/pops/model/pn_transformer.rb +400 -0
  137. data/lib/puppet/pops/parser/egrammar.ra +1 -1
  138. data/lib/puppet/pops/parser/eparser.rb +1 -1
  139. data/lib/puppet/pops/parser/heredoc_support.rb +1 -1
  140. data/lib/puppet/pops/parser/lexer_support.rb +3 -2
  141. data/lib/puppet/pops/parser/locator.rb +0 -2
  142. data/lib/puppet/pops/parser/pn_parser.rb +316 -0
  143. data/lib/puppet/pops/pcore.rb +17 -17
  144. data/lib/puppet/pops/pn.rb +236 -0
  145. data/lib/puppet/pops/serialization/json.rb +7 -7
  146. data/lib/puppet/pops/types/class_loader.rb +6 -3
  147. data/lib/puppet/pops/types/implementation_registry.rb +28 -35
  148. data/lib/puppet/pops/types/p_object_type.rb +3 -3
  149. data/lib/puppet/pops/types/p_timespan_type.rb +2 -2
  150. data/lib/puppet/pops/types/p_type_set_type.rb +24 -1
  151. data/lib/puppet/pops/types/ruby_generator.rb +3 -4
  152. data/lib/puppet/pops/types/type_calculator.rb +1 -1
  153. data/lib/puppet/pops/types/type_factory.rb +0 -4
  154. data/lib/puppet/pops/types/type_mismatch_describer.rb +1 -1
  155. data/lib/puppet/pops/types/type_parser.rb +14 -7
  156. data/lib/puppet/pops/types/types.rb +1 -1
  157. data/lib/puppet/pops/utils.rb +2 -2
  158. data/lib/puppet/pops/validation/checker4_0.rb +6 -2
  159. data/lib/puppet/provider/group/groupadd.rb +3 -1
  160. data/lib/puppet/provider/group/windows_adsi.rb +4 -7
  161. data/lib/puppet/provider/nameservice.rb +3 -3
  162. data/lib/puppet/provider/package/pacman.rb +4 -4
  163. data/lib/puppet/provider/package/pip.rb +3 -3
  164. data/lib/puppet/provider/package/pkgdmg.rb +3 -3
  165. data/lib/puppet/provider/package/pkgutil.rb +2 -2
  166. data/lib/puppet/provider/package/portage.rb +9 -9
  167. data/lib/puppet/provider/package/zypper.rb +2 -2
  168. data/lib/puppet/provider/service/base.rb +1 -1
  169. data/lib/puppet/provider/service/smf.rb +3 -2
  170. data/lib/puppet/provider/service/systemd.rb +1 -1
  171. data/lib/puppet/provider/user/useradd.rb +6 -2
  172. data/lib/puppet/provider/user/windows_adsi.rb +1 -1
  173. data/lib/puppet/provider/yumrepo/inifile.rb +20 -9
  174. data/lib/puppet/provider/zfs/zfs.rb +1 -1
  175. data/lib/puppet/reference/configuration.rb +2 -0
  176. data/lib/puppet/reference/type.rb +11 -11
  177. data/lib/puppet/resource.rb +1 -1
  178. data/lib/puppet/resource/capability_finder.rb +5 -5
  179. data/lib/puppet/resource/catalog.rb +6 -3
  180. data/lib/puppet/resource/status.rb +9 -2
  181. data/lib/puppet/resource/type.rb +1 -1
  182. data/lib/puppet/settings.rb +31 -19
  183. data/lib/puppet/settings/base_setting.rb +5 -0
  184. data/lib/puppet/settings/config_file.rb +1 -1
  185. data/lib/puppet/settings/ttl_setting.rb +5 -0
  186. data/lib/puppet/ssl/certificate_factory.rb +2 -2
  187. data/lib/puppet/ssl/certificate_request.rb +0 -2
  188. data/lib/puppet/syntax_checkers/json.rb +1 -1
  189. data/lib/puppet/transaction/additional_resource_generator.rb +2 -2
  190. data/lib/puppet/transaction/event.rb +1 -1
  191. data/lib/puppet/transaction/report.rb +18 -12
  192. data/lib/puppet/type.rb +9 -13
  193. data/lib/puppet/type/augeas.rb +2 -2
  194. data/lib/puppet/type/cron.rb +11 -6
  195. data/lib/puppet/type/exec.rb +1 -1
  196. data/lib/puppet/type/file.rb +4 -5
  197. data/lib/puppet/type/host.rb +1 -1
  198. data/lib/puppet/type/k5login.rb +30 -54
  199. data/lib/puppet/type/package.rb +3 -3
  200. data/lib/puppet/type/schedule.rb +12 -12
  201. data/lib/puppet/type/scheduled_task.rb +2 -2
  202. data/lib/puppet/type/ssh_authorized_key.rb +5 -5
  203. data/lib/puppet/type/sshkey.rb +2 -2
  204. data/lib/puppet/type/tidy.rb +1 -1
  205. data/lib/puppet/type/user.rb +1 -1
  206. data/lib/puppet/type/yumrepo.rb +26 -5
  207. data/lib/puppet/util.rb +0 -4
  208. data/lib/puppet/util/backups.rb +1 -1
  209. data/lib/puppet/util/inifile.rb +3 -4
  210. data/lib/puppet/util/json.rb +68 -0
  211. data/lib/puppet/util/json_lockfile.rb +3 -3
  212. data/lib/puppet/util/log.rb +2 -5
  213. data/lib/puppet/util/log/destinations.rb +2 -2
  214. data/lib/puppet/util/network_device/cisco/facts.rb +1 -1
  215. data/lib/puppet/util/plist.rb +1 -1
  216. data/lib/puppet/util/reference.rb +1 -8
  217. data/lib/puppet/util/tagging.rb +1 -1
  218. data/lib/puppet/util/warnings.rb +0 -2
  219. data/lib/puppet/util/windows/adsi.rb +15 -18
  220. data/lib/puppet/util/windows/com.rb +2 -1
  221. data/lib/puppet/util/windows/file.rb +2 -2
  222. data/lib/puppet/util/windows/principal.rb +7 -6
  223. data/lib/puppet/util/windows/sid.rb +60 -7
  224. data/lib/puppet/util/windows/taskscheduler.rb +0 -9
  225. data/lib/puppet/version.rb +1 -1
  226. data/lib/puppet_pal.rb +53 -48
  227. data/locales/ja/puppet.po +1357 -912
  228. data/locales/puppet.pot +549 -466
  229. data/man/man5/puppet.conf.5 +103 -20
  230. data/man/man8/puppet-agent.8 +6 -2
  231. data/man/man8/puppet-apply.8 +2 -2
  232. data/man/man8/puppet-ca.8 +1 -1
  233. data/man/man8/puppet-catalog.8 +1 -1
  234. data/man/man8/puppet-cert.8 +1 -1
  235. data/man/man8/puppet-certificate.8 +1 -1
  236. data/man/man8/puppet-certificate_request.8 +1 -1
  237. data/man/man8/puppet-certificate_revocation_list.8 +1 -1
  238. data/man/man8/puppet-config.8 +35 -1
  239. data/man/man8/puppet-describe.8 +1 -1
  240. data/man/man8/puppet-device.8 +33 -11
  241. data/man/man8/puppet-doc.8 +1 -1
  242. data/man/man8/puppet-epp.8 +34 -12
  243. data/man/man8/puppet-facts.8 +50 -1
  244. data/man/man8/puppet-filebucket.8 +38 -11
  245. data/man/man8/puppet-generate.8 +1 -1
  246. data/man/man8/puppet-help.8 +1 -1
  247. data/man/man8/puppet-key.8 +1 -1
  248. data/man/man8/puppet-lookup.8 +1 -1
  249. data/man/man8/puppet-man.8 +10 -4
  250. data/man/man8/puppet-master.8 +1 -1
  251. data/man/man8/puppet-module.8 +15 -6
  252. data/man/man8/puppet-node.8 +1 -1
  253. data/man/man8/puppet-parser.8 +31 -8
  254. data/man/man8/puppet-plugin.8 +1 -1
  255. data/man/man8/puppet-report.8 +1 -1
  256. data/man/man8/puppet-resource.8 +1 -1
  257. data/man/man8/puppet-script.8 +67 -0
  258. data/man/man8/puppet-status.8 +1 -1
  259. data/man/man8/puppet.8 +3 -3
  260. data/spec/fixtures/unit/pops/binder/bindings_composer/ok/modules/awesome2/lib/puppet_x/awesome2/echo_scheme_handler.rb +1 -1
  261. data/spec/integration/application/apply_spec.rb +15 -15
  262. data/spec/integration/application/lookup_spec.rb +21 -0
  263. data/spec/integration/faces/config_spec.rb +16 -4
  264. data/spec/integration/network/http/api/indirected_routes_spec.rb +5 -5
  265. data/spec/integration/parser/catalog_spec.rb +1 -1
  266. data/spec/integration/parser/collection_spec.rb +2 -2
  267. data/spec/integration/parser/compiler_spec.rb +17 -18
  268. data/spec/integration/parser/pcore_resource_spec.rb +2 -2
  269. data/spec/integration/parser/scope_spec.rb +2 -2
  270. data/spec/integration/ssl/certificate_authority_spec.rb +7 -7
  271. data/spec/integration/ssl/certificate_revocation_list_spec.rb +1 -1
  272. data/spec/integration/ssl/key_spec.rb +1 -1
  273. data/spec/integration/transaction/report_spec.rb +3 -3
  274. data/spec/integration/transaction_spec.rb +0 -1
  275. data/spec/integration/type/file_spec.rb +10 -11
  276. data/spec/integration/type_spec.rb +1 -2
  277. data/spec/integration/util/windows/adsi_spec.rb +86 -1
  278. data/spec/integration/util/windows/principal_spec.rb +11 -2
  279. data/spec/integration/util/windows/security_spec.rb +2 -2
  280. data/spec/lib/matchers/json.rb +4 -4
  281. data/spec/lib/puppet_spec/language.rb +34 -35
  282. data/spec/lib/puppet_spec/module_tool/shared_functions.rb +2 -2
  283. data/spec/shared_behaviours/file_server_terminus.rb +0 -2
  284. data/spec/shared_behaviours/things_that_declare_options.rb +2 -2
  285. data/spec/spec_helper.rb +1 -1
  286. data/spec/unit/application/cert_spec.rb +21 -9
  287. data/spec/unit/application/device_spec.rb +96 -2
  288. data/spec/unit/application/face_base_spec.rb +2 -2
  289. data/spec/unit/application/lookup_spec.rb +0 -1
  290. data/spec/unit/configurer_spec.rb +14 -0
  291. data/spec/unit/confine_spec.rb +16 -0
  292. data/spec/unit/data_providers/hiera_data_provider_spec.rb +4 -4
  293. data/spec/unit/datatypes_spec.rb +49 -0
  294. data/spec/unit/environments_spec.rb +7 -0
  295. data/spec/unit/face/config_spec.rb +116 -12
  296. data/spec/unit/face/epp_face_spec.rb +53 -2
  297. data/spec/unit/face/facts_spec.rb +53 -0
  298. data/spec/unit/face/help_spec.rb +62 -69
  299. data/spec/unit/face/man_spec.rb +26 -0
  300. data/spec/unit/face/module/list_spec.rb +0 -1
  301. data/spec/unit/face/parser_spec.rb +78 -0
  302. data/spec/unit/file_bucket/dipper_spec.rb +0 -4
  303. data/spec/unit/file_serving/content_spec.rb +0 -1
  304. data/spec/unit/file_serving/fileset_spec.rb +0 -1
  305. data/spec/unit/file_serving/metadata_spec.rb +0 -1
  306. data/spec/unit/file_serving/terminus_selector_spec.rb +0 -2
  307. data/spec/unit/forge_spec.rb +1 -2
  308. data/spec/unit/functions/assert_type_spec.rb +1 -1
  309. data/spec/unit/functions/empty_spec.rb +77 -0
  310. data/spec/unit/functions/epp_spec.rb +1 -1
  311. data/spec/unit/functions/flatten_spec.rb +31 -0
  312. data/spec/unit/functions/include_spec.rb +2 -2
  313. data/spec/unit/functions/inline_epp_spec.rb +1 -1
  314. data/spec/unit/functions/join_spec.rb +33 -0
  315. data/spec/unit/functions/keys_spec.rb +31 -0
  316. data/spec/unit/functions/length_spec.rb +50 -0
  317. data/spec/unit/functions/lookup_fixture_spec.rb +1 -1
  318. data/spec/unit/functions/lookup_spec.rb +52 -0
  319. data/spec/unit/functions/shared.rb +1 -1
  320. data/spec/unit/functions/values_spec.rb +30 -0
  321. data/spec/unit/functions/versioncmp_spec.rb +1 -1
  322. data/spec/unit/functions4_spec.rb +30 -32
  323. data/spec/unit/graph/title_hash_prioritizer_spec.rb +2 -1
  324. data/spec/unit/indirector/catalog/compiler_spec.rb +0 -15
  325. data/spec/unit/indirector/facts/rest_spec.rb +45 -0
  326. data/spec/unit/indirector/facts/yaml_spec.rb +6 -0
  327. data/spec/unit/indirector/file_bucket_file/file_spec.rb +2 -2
  328. data/spec/unit/indirector/indirection_spec.rb +1 -1
  329. data/spec/unit/indirector/node/ldap_spec.rb +2 -2
  330. data/spec/unit/indirector/request_spec.rb +0 -2
  331. data/spec/unit/indirector/rest_spec.rb +2 -2
  332. data/spec/unit/indirector_spec.rb +0 -1
  333. data/spec/unit/info_service_spec.rb +1 -1
  334. data/spec/unit/interface/action_manager_spec.rb +1 -1
  335. data/spec/unit/interface/action_spec.rb +1 -1
  336. data/spec/unit/module_spec.rb +0 -5
  337. data/spec/unit/module_tool/applications/builder_spec.rb +1 -1
  338. data/spec/unit/module_tool/applications/unpacker_spec.rb +4 -4
  339. data/spec/unit/network/formats_spec.rb +5 -13
  340. data/spec/unit/network/http/api/indirected_routes_spec.rb +6 -2
  341. data/spec/unit/network/http/connection_spec.rb +1 -1
  342. data/spec/unit/network/http/handler_spec.rb +3 -2
  343. data/spec/unit/node/environment_spec.rb +1 -1
  344. data/spec/unit/node_spec.rb +3 -3
  345. data/spec/unit/parser/compiler_spec.rb +9 -2
  346. data/spec/unit/parser/environment_compiler_spec.rb +8 -8
  347. data/spec/unit/parser/functions/create_resources_spec.rb +1 -1
  348. data/spec/unit/parser/functions/fail_spec.rb +1 -1
  349. data/spec/unit/parser/functions/fqdn_rand_spec.rb +24 -0
  350. data/spec/unit/parser/functions/realize_spec.rb +1 -1
  351. data/spec/unit/parser/resource_spec.rb +0 -1
  352. data/spec/unit/parser/scope_spec.rb +3 -3
  353. data/spec/unit/parser/type_loader_spec.rb +1 -1
  354. data/spec/unit/pops/adaptable_spec.rb +0 -1
  355. data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +0 -3
  356. data/spec/unit/pops/evaluator/runtime3_converter_spec.rb +0 -4
  357. data/spec/unit/pops/factory_rspec_helper.rb +1 -1
  358. data/spec/unit/pops/factory_spec.rb +5 -5
  359. data/spec/unit/pops/issues_spec.rb +23 -8
  360. data/spec/unit/pops/loaders/loaders_spec.rb +24 -2
  361. data/spec/unit/pops/loaders/static_loader_spec.rb +1 -1
  362. data/spec/unit/pops/lookup/interpolation_spec.rb +5 -0
  363. data/spec/unit/pops/lookup/lookup_spec.rb +56 -0
  364. data/spec/unit/pops/model/pn_transformer_spec.rb +53 -0
  365. data/spec/unit/pops/parser/lexer2_spec.rb +14 -5
  366. data/spec/unit/pops/parser/parse_basic_expressions_spec.rb +9 -9
  367. data/spec/unit/pops/parser/parse_calls_spec.rb +1 -1
  368. data/spec/unit/pops/parser/parse_functions_spec.rb +1 -1
  369. data/spec/unit/pops/parser/parse_heredoc_spec.rb +3 -3
  370. data/spec/unit/pops/parser/parse_lambda_spec.rb +1 -1
  371. data/spec/unit/pops/parser/parse_resource_spec.rb +35 -35
  372. data/spec/unit/pops/parser/pn_parser_spec.rb +101 -0
  373. data/spec/unit/pops/pn_spec.rb +148 -0
  374. data/spec/unit/pops/types/iterable_spec.rb +1 -1
  375. data/spec/unit/pops/types/p_object_type_spec.rb +5 -5
  376. data/spec/unit/pops/types/p_timespan_type_spec.rb +11 -4
  377. data/spec/unit/pops/types/p_timestamp_type_spec.rb +9 -2
  378. data/spec/unit/pops/types/p_type_set_type_spec.rb +106 -2
  379. data/spec/unit/pops/types/ruby_generator_spec.rb +3 -8
  380. data/spec/unit/pops/types/string_converter_spec.rb +3 -3
  381. data/spec/unit/pops/types/type_calculator_spec.rb +1 -1
  382. data/spec/unit/pops/validator/validator_spec.rb +3 -1
  383. data/spec/unit/property_spec.rb +2 -2
  384. data/spec/unit/provider/aixobject_spec.rb +1 -1
  385. data/spec/unit/provider/cron/crontab_spec.rb +3 -3
  386. data/spec/unit/provider/exec/posix_spec.rb +6 -6
  387. data/spec/unit/provider/group/groupadd_spec.rb +4 -4
  388. data/spec/unit/provider/group/windows_adsi_spec.rb +79 -22
  389. data/spec/unit/provider/ldap_spec.rb +0 -1
  390. data/spec/unit/provider/nameservice_spec.rb +5 -5
  391. data/spec/unit/provider/package/rpm_spec.rb +3 -4
  392. data/spec/unit/provider/package/yum_spec.rb +6 -2
  393. data/spec/unit/provider/parsedfile_spec.rb +1 -1
  394. data/spec/unit/provider/service/base_spec.rb +2 -4
  395. data/spec/unit/provider/service/init_spec.rb +2 -2
  396. data/spec/unit/provider/service/openrc_spec.rb +2 -2
  397. data/spec/unit/provider/service/redhat_spec.rb +2 -2
  398. data/spec/unit/provider/service/smf_spec.rb +2 -0
  399. data/spec/unit/provider/service/systemd_spec.rb +3 -3
  400. data/spec/unit/provider/service/upstart_spec.rb +7 -7
  401. data/spec/unit/provider/ssh_authorized_key/parsed_spec.rb +0 -4
  402. data/spec/unit/provider/sshkey/parsed_spec.rb +0 -2
  403. data/spec/unit/provider/user/useradd_spec.rb +15 -9
  404. data/spec/unit/provider/user/windows_adsi_spec.rb +4 -4
  405. data/spec/unit/provider/yumrepo/inifile_spec.rb +76 -0
  406. data/spec/unit/puppet_pal_2pec.rb +4 -5
  407. data/spec/unit/resource/catalog_spec.rb +8 -3
  408. data/spec/unit/resource/status_spec.rb +15 -4
  409. data/spec/unit/resource/type_spec.rb +2 -3
  410. data/spec/unit/settings_spec.rb +9 -4
  411. data/spec/unit/ssl/certificate_authority_spec.rb +1 -9
  412. data/spec/unit/ssl/certificate_request_spec.rb +1 -2
  413. data/spec/unit/transaction/report_spec.rb +41 -0
  414. data/spec/unit/transaction_spec.rb +1 -1
  415. data/spec/unit/type/exec_spec.rb +7 -9
  416. data/spec/unit/type/file/selinux_spec.rb +0 -1
  417. data/spec/unit/type/file_spec.rb +4 -3
  418. data/spec/unit/type/k5login_spec.rb +79 -10
  419. data/spec/unit/type/mount_spec.rb +1 -1
  420. data/spec/unit/type/nagios_spec.rb +6 -6
  421. data/spec/unit/type/user_spec.rb +1 -1
  422. data/spec/unit/type/yumrepo_spec.rb +18 -0
  423. data/spec/unit/type/zfs_spec.rb +1 -1
  424. data/spec/unit/type_spec.rb +14 -15
  425. data/spec/unit/util/docs_spec.rb +1 -1
  426. data/spec/unit/util/execution_spec.rb +0 -1
  427. data/spec/unit/util/inifile_spec.rb +35 -4
  428. data/spec/unit/util/log/destinations_spec.rb +2 -2
  429. data/spec/unit/util/log_spec.rb +6 -5
  430. data/spec/unit/util/network_device/cisco/device_spec.rb +2 -2
  431. data/spec/unit/util/plist_spec.rb +3 -3
  432. data/spec/unit/util/selinux_spec.rb +2 -2
  433. data/spec/unit/util/tagging_spec.rb +1 -7
  434. data/spec/unit/util/windows/adsi_spec.rb +31 -27
  435. data/spec/unit/util/windows/sid_spec.rb +86 -15
  436. data/spec/unit/util_spec.rb +2 -2
  437. data/spec/watchr.rb +0 -1
  438. data/tasks/benchmark.rake +37 -0
  439. data/tasks/manpages.rake +1 -1
  440. metadata +71 -11
  441. checksums.yaml +0 -7
@@ -69,7 +69,7 @@ EOT
69
69
  it "has no side effects on original input string" do
70
70
  input = "First line \n second line \n \n indented line \n \n last line\n\n"
71
71
  clean_input = "First line \n second line \n \n indented line \n \n last line\n\n"
72
- not_used = Puppet::Util::Docs.scrub(input)
72
+ Puppet::Util::Docs.scrub(input)
73
73
  expect(input).to eq clean_input
74
74
  end
75
75
 
@@ -711,7 +711,6 @@ describe Puppet::Util::Execution do
711
711
  it "should not raise an error if the file is open" do
712
712
  stdout = Puppet::FileSystem::Uniquefile.new('test')
713
713
  Puppet::FileSystem::Uniquefile.stubs(:new).returns(stdout)
714
- file = File.new(stdout.path, 'r')
715
714
 
716
715
  Puppet::Util::Execution.execute('test command')
717
716
  end
@@ -159,8 +159,8 @@ describe Puppet::Util::IniConfig::PhysicalFile do
159
159
 
160
160
  end
161
161
 
162
- describe "parsing properties" do
163
- it "raises an error if the property is not within a section" do
162
+ describe 'parsing properties' do
163
+ it 'raises an error if the property is not within a section' do
164
164
  text = "key=val\n"
165
165
 
166
166
  expect {
@@ -169,13 +169,44 @@ describe Puppet::Util::IniConfig::PhysicalFile do
169
169
  /Property with key "key" outside of a section/)
170
170
  end
171
171
 
172
- it "adds the property to the current section" do
172
+ it 'adds the property to the current section' do
173
173
  text = "[main]\nkey=val\n"
174
174
 
175
175
  subject.parse(text)
176
176
  expect(subject.contents).to have(1).items
177
177
  sect = subject.contents[0]
178
- expect(sect['key']).to eq "val"
178
+ expect(sect['key']).to eq 'val'
179
+ end
180
+
181
+ context 'with white space' do
182
+ let(:section) do
183
+ text = <<-INIFILE
184
+ [main]
185
+ leading_white_space=value1
186
+ white_space_after_key =value2
187
+ white_space_after_equals= value3
188
+ white_space_after_value=value4\t
189
+ INIFILE
190
+ subject.parse(text)
191
+ expect(subject.contents).to have(1).items
192
+ subject.contents[0]
193
+ end
194
+
195
+ it 'allows and ignores white space before the key' do
196
+ expect(section['leading_white_space']).to eq('value1')
197
+ end
198
+
199
+ it 'allows and ignores white space before the equals' do
200
+ expect(section['white_space_after_key']).to eq('value2')
201
+ end
202
+
203
+ it 'allows and ignores white space after the equals' do
204
+ expect(section['white_space_after_equals']).to eq('value3')
205
+ end
206
+
207
+ it 'allows and ignores white spaces after the value' do
208
+ expect(section['white_space_after_value']).to eq('value4')
209
+ end
179
210
  end
180
211
  end
181
212
 
@@ -1,6 +1,6 @@
1
1
  #! /usr/bin/env ruby
2
2
  require 'spec_helper'
3
- require 'json'
3
+ require 'puppet/util/json'
4
4
 
5
5
  require 'puppet/util/log'
6
6
 
@@ -143,7 +143,7 @@ describe Puppet::Util::Log.desttypes[:logstash_event] do
143
143
  it "format returns a structure that can be converted to json" do
144
144
  dest = described_class.new
145
145
  hash = dest.format(@msg)
146
- JSON.parse(hash.to_json)
146
+ Puppet::Util::Json.load(hash.to_json)
147
147
  end
148
148
 
149
149
  it "handle should send the output to stdout" do
@@ -1,4 +1,5 @@
1
1
  #! /usr/bin/env ruby
2
+ # coding: utf-8
2
3
  require 'spec_helper'
3
4
 
4
5
  require 'puppet/util/log'
@@ -498,12 +499,12 @@ describe Puppet::Util::Log do
498
499
  source.tags = ["tag", "tag2"]
499
500
 
500
501
  log = Puppet::Util::Log.new(:level => "notice", :message => :foo)
501
- log.expects(:tag).with("file")
502
- log.expects(:tag).with("tag")
503
- log.expects(:tag).with("tag2")
504
-
505
502
  log.source = source
506
503
 
504
+ expect(log).to be_tagged('file')
505
+ expect(log).to be_tagged('tag')
506
+ expect(log).to be_tagged('tag2')
507
+
507
508
  expect(log.source).to eq("/File[#{path}]")
508
509
  end
509
510
 
@@ -532,7 +533,7 @@ describe Puppet::Util::Log do
532
533
  it "should not try to copy over file, version, line, or tag information" do
533
534
  source = mock
534
535
  source.expects(:file).never
535
- log = Puppet::Util::Log.new(:level => "notice", :message => :foo, :source => source)
536
+ Puppet::Util::Log.new(:level => "notice", :message => :foo, :source => source)
536
537
  end
537
538
  end
538
539
  end
@@ -51,12 +51,12 @@ if Puppet.features.telnet?
51
51
 
52
52
  it "should find the debug mode from the options" do
53
53
  Puppet::Util::NetworkDevice::Transport::Telnet.expects(:new).with(true).returns(@transport)
54
- cisco = Puppet::Util::NetworkDevice::Cisco::Device.new("telnet://user:password@localhost:23", :debug => true)
54
+ Puppet::Util::NetworkDevice::Cisco::Device.new("telnet://user:password@localhost:23", :debug => true)
55
55
  end
56
56
 
57
57
  it "should set the debug mode to nil by default" do
58
58
  Puppet::Util::NetworkDevice::Transport::Telnet.expects(:new).with(nil).returns(@transport)
59
- cisco = Puppet::Util::NetworkDevice::Cisco::Device.new("telnet://user:password@localhost:23")
59
+ Puppet::Util::NetworkDevice::Cisco::Device.new("telnet://user:password@localhost:23")
60
60
  end
61
61
  end
62
62
 
@@ -92,7 +92,7 @@ describe Puppet::Util::Plist, :if => Puppet.features.cfpropertylist? do
92
92
  subject.stubs(:open_file_with_args).with(plist_path, 'r:UTF-8').returns(invalid_xml_plist)
93
93
  Puppet.expects(:debug).with(regexp_matches(/^Failed with CFFormatError/))
94
94
  Puppet.expects(:debug).with("Plist #{plist_path} ill-formatted, converting with plutil")
95
- Puppet::Util::Execution.expects(:execute).with(['/usr/bin/plutil', '-convert', 'xml1', '-o', '/dev/stdout', plist_path],
95
+ Puppet::Util::Execution.expects(:execute).with(['/usr/bin/plutil', '-convert', 'xml1', '-o', '-', plist_path],
96
96
  {:failonfail => true, :combine => true}).returns(valid_xml_plist)
97
97
  expect(subject.read_plist_file(plist_path)).to eq(valid_xml_plist_hash)
98
98
  end
@@ -101,7 +101,7 @@ describe Puppet::Util::Plist, :if => Puppet.features.cfpropertylist? do
101
101
  subject.stubs(:open_file_with_args).with(plist_path, 'r:UTF-8').returns(non_plist_data)
102
102
  Puppet.expects(:debug).with(regexp_matches(/^Failed with (CFFormatError|NoMethodError)/))
103
103
  Puppet.expects(:debug).with("Plist #{plist_path} ill-formatted, converting with plutil")
104
- Puppet::Util::Execution.expects(:execute).with(['/usr/bin/plutil', '-convert', 'xml1', '-o', '/dev/stdout', plist_path],
104
+ Puppet::Util::Execution.expects(:execute).with(['/usr/bin/plutil', '-convert', 'xml1', '-o', '-', plist_path],
105
105
  {:failonfail => true, :combine => true}).raises(Puppet::ExecutionFailure, 'boom')
106
106
  expect(subject.read_plist_file(plist_path)).to eq(nil)
107
107
  end
@@ -110,7 +110,7 @@ describe Puppet::Util::Plist, :if => Puppet.features.cfpropertylist? do
110
110
  subject.stubs(:open_file_with_args).with(plist_path, 'r:UTF-8').returns(binary_data)
111
111
  Puppet.expects(:debug).with(regexp_matches(/^Failed with (CFFormatError|ArgumentError)/))
112
112
  Puppet.expects(:debug).with("Plist #{plist_path} ill-formatted, converting with plutil")
113
- Puppet::Util::Execution.expects(:execute).with(['/usr/bin/plutil', '-convert', 'xml1', '-o', '/dev/stdout', plist_path],
113
+ Puppet::Util::Execution.expects(:execute).with(['/usr/bin/plutil', '-convert', 'xml1', '-o', '-', plist_path],
114
114
  {:failonfail => true, :combine => true}).raises(Puppet::ExecutionFailure, 'boom')
115
115
  expect(subject.read_plist_file(plist_path)).to eq(nil)
116
116
  end
@@ -109,7 +109,7 @@ describe Puppet::Util::SELinux do
109
109
 
110
110
  it "should return nil if lgetfilecon fails" do
111
111
  self.expects(:selinux_support?).returns true
112
- Selinux.expects(:lgetfilecon).with("/foo").returns -1
112
+ Selinux.expects(:lgetfilecon).with("/foo").returns(-1)
113
113
  expect(get_selinux_current_context("/foo")).to be_nil
114
114
  end
115
115
  end
@@ -153,7 +153,7 @@ describe Puppet::Util::SELinux do
153
153
  fstat = stub 'File::Stat', :mode => 0
154
154
  Puppet::FileSystem.expects(:lstat).with('/foo').returns(fstat)
155
155
  self.expects(:find_fs).with("/foo").returns "ext3"
156
- Selinux.expects(:matchpathcon).with("/foo", 0).returns -1
156
+ Selinux.expects(:matchpathcon).with("/foo", 0).returns(-1)
157
157
 
158
158
  expect(get_selinux_default_context("/foo")).to be_nil
159
159
  end
@@ -1,4 +1,5 @@
1
1
  #! /usr/bin/env ruby
2
+ # coding: utf-8
2
3
  require 'spec_helper'
3
4
 
4
5
  require 'puppet/util/tagging'
@@ -11,13 +12,6 @@ describe Puppet::Util::Tagging do
11
12
  expect(tagger.tags).to include("one")
12
13
  end
13
14
 
14
- it "should return a duplicate of the tag list, rather than the original" do
15
- tagger.tag("one")
16
- tags = tagger.tags
17
- tags << "two"
18
- expect(tagger.tags).to_not include("two")
19
- end
20
-
21
15
  it "should add all provided tags to the tag list" do
22
16
  tagger.tag("one", "two")
23
17
  expect(tagger.tags).to include("one")
@@ -106,14 +106,14 @@ describe Puppet::Util::Windows::ADSI, :if => Puppet.features.microsoft_windows?
106
106
  end
107
107
 
108
108
  it "should be able to check the existence of a user" do
109
- Puppet::Util::Windows::SID.expects(:name_to_sid_object).with(username).returns nil
109
+ Puppet::Util::Windows::SID.expects(:name_to_principal).with(username).returns nil
110
110
  Puppet::Util::Windows::ADSI.expects(:connect).with("WinNT://./#{username},user").returns connection
111
111
  connection.expects(:Class).returns('User')
112
112
  expect(Puppet::Util::Windows::ADSI::User.exists?(username)).to be_truthy
113
113
  end
114
114
 
115
115
  it "should be able to check the existence of a domain user" do
116
- Puppet::Util::Windows::SID.expects(:name_to_sid_object).with("#{domain}\\#{username}").returns nil
116
+ Puppet::Util::Windows::SID.expects(:name_to_principal).with("#{domain}\\#{username}").returns nil
117
117
  Puppet::Util::Windows::ADSI.expects(:connect).with("WinNT://#{domain}/#{username},user").returns connection
118
118
  connection.expects(:Class).returns('User')
119
119
  expect(Puppet::Util::Windows::ADSI::User.exists?(domain_username)).to be_truthy
@@ -213,7 +213,7 @@ describe Puppet::Util::Windows::ADSI, :if => Puppet.features.microsoft_windows?
213
213
  end
214
214
 
215
215
  it "should generate the correct URI" do
216
- Puppet::Util::Windows::SID.stubs(:octet_string_to_sid_object).returns(sid)
216
+ Puppet::Util::Windows::SID.stubs(:octet_string_to_principal).returns(sid)
217
217
  expect(user.uri).to eq("WinNT://testcomputername/#{username},user")
218
218
  end
219
219
 
@@ -276,8 +276,8 @@ describe Puppet::Util::Windows::ADSI, :if => Puppet.features.microsoft_windows?
276
276
  let(:someone_sid){ stub(:account => 'someone', :domain => 'testcomputername')}
277
277
 
278
278
  describe "should be able to use SID objects" do
279
- let(:system) { Puppet::Util::Windows::SID.name_to_sid_object('SYSTEM') }
280
- let(:invalid) { Puppet::Util::Windows::SID.name_to_sid_object('foobar') }
279
+ let(:system) { Puppet::Util::Windows::SID.name_to_principal('SYSTEM') }
280
+ let(:invalid) { Puppet::Util::Windows::SID.name_to_principal('foobar') }
281
281
 
282
282
  it "to add a member" do
283
283
  adsi_group.expects(:Add).with("WinNT://S-1-5-18")
@@ -303,11 +303,14 @@ describe Puppet::Util::Windows::ADSI, :if => Puppet.features.microsoft_windows?
303
303
  it "should provide its groups as a list of names" do
304
304
  names = ['user1', 'user2']
305
305
 
306
- users = names.map { |name| stub('user', :Name => name) }
306
+ users = names.map { |name| stub('user', :Name => name, :objectSID => name, :ole_respond_to? => true) }
307
307
 
308
308
  adsi_group.expects(:Members).returns(users)
309
309
 
310
- expect(group.members).to match(names)
310
+ Puppet::Util::Windows::SID.expects(:octet_string_to_principal).with('user1').returns(stub(:domain_account => 'HOSTNAME\user1'))
311
+ Puppet::Util::Windows::SID.expects(:octet_string_to_principal).with('user2').returns(stub(:domain_account => 'HOSTNAME\user2'))
312
+
313
+ expect(group.members.map(&:domain_account)).to match(['HOSTNAME\user1', 'HOSTNAME\user2'])
311
314
  end
312
315
 
313
316
  context "calling .set_members" do
@@ -320,16 +323,16 @@ describe Puppet::Util::Windows::ADSI, :if => Puppet.features.microsoft_windows?
320
323
  ]
321
324
 
322
325
  # use stubbed objectSid on member to return stubbed SID
323
- Puppet::Util::Windows::SID.expects(:octet_string_to_sid_object).with([0]).returns(sids[0])
324
- Puppet::Util::Windows::SID.expects(:octet_string_to_sid_object).with([1]).returns(sids[1])
326
+ Puppet::Util::Windows::SID.expects(:octet_string_to_principal).with([0]).returns(sids[0])
327
+ Puppet::Util::Windows::SID.expects(:octet_string_to_principal).with([1]).returns(sids[1])
325
328
 
326
- Puppet::Util::Windows::SID.expects(:name_to_sid_object).with('user2').returns(sids[1])
327
- Puppet::Util::Windows::SID.expects(:name_to_sid_object).with('DOMAIN2\user3').returns(sids[2])
329
+ Puppet::Util::Windows::SID.expects(:name_to_principal).with('user2').returns(sids[1])
330
+ Puppet::Util::Windows::SID.expects(:name_to_principal).with('DOMAIN2\user3').returns(sids[2])
328
331
 
329
332
  Puppet::Util::Windows::ADSI.expects(:sid_uri).with(sids[0]).returns("WinNT://DOMAIN/user1,user")
330
333
  Puppet::Util::Windows::ADSI.expects(:sid_uri).with(sids[2]).returns("WinNT://DOMAIN2/user3,user")
331
334
 
332
- members = names.each_with_index.map{|n,i| stub(:Name => n, :objectSID => [i])}
335
+ members = names.each_with_index.map{|n,i| stub(:Name => n, :objectSID => [i], :ole_respond_to? => true)}
333
336
  adsi_group.expects(:Members).returns members
334
337
 
335
338
  adsi_group.expects(:Remove).with('WinNT://DOMAIN/user1,user')
@@ -347,15 +350,15 @@ describe Puppet::Util::Windows::ADSI, :if => Puppet.features.microsoft_windows?
347
350
  ]
348
351
 
349
352
  # use stubbed objectSid on member to return stubbed SID
350
- Puppet::Util::Windows::SID.expects(:octet_string_to_sid_object).with([0]).returns(sids[0])
351
- Puppet::Util::Windows::SID.expects(:octet_string_to_sid_object).with([1]).returns(sids[1])
353
+ Puppet::Util::Windows::SID.expects(:octet_string_to_principal).with([0]).returns(sids[0])
354
+ Puppet::Util::Windows::SID.expects(:octet_string_to_principal).with([1]).returns(sids[1])
352
355
 
353
- Puppet::Util::Windows::SID.expects(:name_to_sid_object).with('user2').returns(sids[1])
354
- Puppet::Util::Windows::SID.expects(:name_to_sid_object).with('DOMAIN2\user3').returns(sids[2])
356
+ Puppet::Util::Windows::SID.expects(:name_to_principal).with('user2').returns(sids[1])
357
+ Puppet::Util::Windows::SID.expects(:name_to_principal).with('DOMAIN2\user3').returns(sids[2])
355
358
 
356
359
  Puppet::Util::Windows::ADSI.expects(:sid_uri).with(sids[2]).returns("WinNT://DOMAIN2/user3,user")
357
360
 
358
- members = names.each_with_index.map{|n,i| stub(:Name => n, :objectSID => [i])}
361
+ members = names.each_with_index.map{|n,i| stub(:Name => n, :objectSID => [i], :ole_respond_to? => true)}
359
362
  adsi_group.expects(:Members).returns members
360
363
 
361
364
  adsi_group.expects(:Remove).with('WinNT://DOMAIN/user1,user').never
@@ -382,13 +385,13 @@ describe Puppet::Util::Windows::ADSI, :if => Puppet.features.microsoft_windows?
382
385
  ]
383
386
 
384
387
  # use stubbed objectSid on member to return stubbed SID
385
- Puppet::Util::Windows::SID.expects(:octet_string_to_sid_object).with([0]).returns(sids[0])
386
- Puppet::Util::Windows::SID.expects(:octet_string_to_sid_object).with([1]).returns(sids[1])
388
+ Puppet::Util::Windows::SID.expects(:octet_string_to_principal).with([0]).returns(sids[0])
389
+ Puppet::Util::Windows::SID.expects(:octet_string_to_principal).with([1]).returns(sids[1])
387
390
 
388
391
  Puppet::Util::Windows::ADSI.expects(:sid_uri).with(sids[0]).returns("WinNT://DOMAIN/user1,user")
389
392
  Puppet::Util::Windows::ADSI.expects(:sid_uri).with(sids[1]).returns("WinNT://testcomputername/user2,user")
390
393
 
391
- members = names.each_with_index.map{|n,i| stub(:Name => n, :objectSID => [i])}
394
+ members = names.each_with_index.map{|n,i| stub(:Name => n, :objectSID => [i], :ole_respond_to? => true)}
392
395
  adsi_group.expects(:Members).returns members
393
396
 
394
397
  adsi_group.expects(:Remove).with('WinNT://DOMAIN/user1,user')
@@ -404,10 +407,10 @@ describe Puppet::Util::Windows::ADSI, :if => Puppet.features.microsoft_windows?
404
407
  stub(:account => 'user2', :domain => 'testcomputername', :sid => 2 ),
405
408
  ]
406
409
  # use stubbed objectSid on member to return stubbed SID
407
- Puppet::Util::Windows::SID.expects(:octet_string_to_sid_object).with([0]).returns(sids[0])
408
- Puppet::Util::Windows::SID.expects(:octet_string_to_sid_object).with([1]).returns(sids[1])
410
+ Puppet::Util::Windows::SID.expects(:octet_string_to_principal).with([0]).returns(sids[0])
411
+ Puppet::Util::Windows::SID.expects(:octet_string_to_principal).with([1]).returns(sids[1])
409
412
 
410
- members = names.each_with_index.map{|n,i| stub(:Name => n, :objectSID => [i])}
413
+ members = names.each_with_index.map{|n,i| stub(:Name => n, :objectSID => [i], :ole_respond_to? => true)}
411
414
  adsi_group.expects(:Members).returns members
412
415
 
413
416
  adsi_group.expects(:Remove).never
@@ -428,7 +431,7 @@ describe Puppet::Util::Windows::ADSI, :if => Puppet.features.microsoft_windows?
428
431
  adsi_group.expects(:objectSID).returns([0])
429
432
  Socket.expects(:gethostname).returns('TESTcomputerNAME')
430
433
  computer_sid = stub(:account => groupname,:domain => 'testcomputername')
431
- Puppet::Util::Windows::SID.expects(:octet_string_to_sid_object).with([0]).returns(computer_sid)
434
+ Puppet::Util::Windows::SID.expects(:octet_string_to_principal).with([0]).returns(computer_sid)
432
435
  expect(group.uri).to eq("WinNT://./#{groupname},group")
433
436
  end
434
437
  end
@@ -458,7 +461,7 @@ describe Puppet::Util::Windows::ADSI, :if => Puppet.features.microsoft_windows?
458
461
  end
459
462
 
460
463
  it "should be able to confirm the existence of a group" do
461
- Puppet::Util::Windows::SID.expects(:name_to_sid_object).with(groupname).returns nil
464
+ Puppet::Util::Windows::SID.expects(:name_to_principal).with(groupname).returns nil
462
465
  Puppet::Util::Windows::ADSI.expects(:connect).with("WinNT://./#{groupname},group").returns connection
463
466
  connection.expects(:Class).returns('Group')
464
467
 
@@ -500,13 +503,14 @@ describe Puppet::Util::Windows::ADSI, :if => Puppet.features.microsoft_windows?
500
503
  Puppet::Util::Windows::ADSI.expects(:execquery).with('select name from win32_group where localaccount = "TRUE"').returns(wmi_groups)
501
504
 
502
505
  native_group = stub('IADsGroup')
503
- native_group.expects(:Members).returns([stub(:Name => 'Administrator')])
506
+ Puppet::Util::Windows::SID.expects(:octet_string_to_principal).with([]).returns(stub(:domain_account => '.\Administrator'))
507
+ native_group.expects(:Members).returns([stub(:Name => 'Administrator', :objectSID => [], :ole_respond_to? => true)])
504
508
  Puppet::Util::Windows::ADSI.expects(:connect).with("WinNT://./#{name},group").returns(native_group)
505
509
 
506
510
  groups = Puppet::Util::Windows::ADSI::Group.to_a
507
511
  expect(groups.length).to eq(1)
508
512
  expect(groups[0].name).to eq(name)
509
- expect(groups[0].members).to eq(['Administrator'])
513
+ expect(groups[0].members.map(&:domain_account)).to eq(['.\Administrator'])
510
514
  end
511
515
  end
512
516
 
@@ -13,10 +13,10 @@ describe "Puppet::Util::Windows::SID", :if => Puppet.features.microsoft_windows?
13
13
  let(:null_sid) { 'S-1-0-0' }
14
14
  let(:unknown_name) { 'chewbacca' }
15
15
 
16
- context "#octet_string_to_sid_object" do
16
+ context "#octet_string_to_principal" do
17
17
  it "should properly convert an array of bytes for a well-known non-localized SID" do
18
18
  bytes = [1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
19
- converted = subject.octet_string_to_sid_object(bytes)
19
+ converted = subject.octet_string_to_principal(bytes)
20
20
 
21
21
  expect(converted).to be_an_instance_of Puppet::Util::Windows::SID::Principal
22
22
  expect(converted.sid_bytes).to eq(bytes)
@@ -28,13 +28,13 @@ describe "Puppet::Util::Windows::SID", :if => Puppet.features.microsoft_windows?
28
28
 
29
29
  it "should raise an error for non-array input" do
30
30
  expect {
31
- subject.octet_string_to_sid_object(invalid_sid)
31
+ subject.octet_string_to_principal(invalid_sid)
32
32
  }.to raise_error(Puppet::Error, /Octet string must be an array of bytes/)
33
33
  end
34
34
 
35
35
  it "should raise an error for an empty byte array" do
36
36
  expect {
37
- subject.octet_string_to_sid_object([])
37
+ subject.octet_string_to_principal([])
38
38
  }.to raise_error(Puppet::Error, /Octet string must be an array of bytes/)
39
39
  end
40
40
 
@@ -42,7 +42,7 @@ describe "Puppet::Util::Windows::SID", :if => Puppet.features.microsoft_windows?
42
42
  expect {
43
43
  # S-1-1-1 which is not a valid account
44
44
  valid_octet_invalid_user =[1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0]
45
- subject.octet_string_to_sid_object(valid_octet_invalid_user)
45
+ subject.octet_string_to_principal(valid_octet_invalid_user)
46
46
  }.to raise_error do |error|
47
47
  expect(error).to be_a(Puppet::Util::Windows::Error)
48
48
  expect(error.code).to eq(1332) # ERROR_NONE_MAPPED
@@ -52,7 +52,7 @@ describe "Puppet::Util::Windows::SID", :if => Puppet.features.microsoft_windows?
52
52
  it "should raise an error for a malformed byte array" do
53
53
  expect {
54
54
  invalid_octet = [2]
55
- subject.octet_string_to_sid_object(invalid_octet)
55
+ subject.octet_string_to_principal(invalid_octet)
56
56
  }.to raise_error do |error|
57
57
  expect(error).to be_a(Puppet::Util::Windows::Error)
58
58
  expect(error.code).to eq(87) # ERROR_INVALID_PARAMETER
@@ -72,12 +72,12 @@ describe "Puppet::Util::Windows::SID", :if => Puppet.features.microsoft_windows?
72
72
  end
73
73
 
74
74
  it "should return a SID for a passed user or group name" do
75
- subject.expects(:name_to_sid_object).with('testers').returns stub(:sid => 'S-1-5-32-547')
75
+ subject.expects(:name_to_principal).with('testers').returns stub(:sid => 'S-1-5-32-547')
76
76
  expect(subject.name_to_sid('testers')).to eq('S-1-5-32-547')
77
77
  end
78
78
 
79
79
  it "should return a SID for a passed fully-qualified user or group name" do
80
- subject.expects(:name_to_sid_object).with('MACHINE\testers').returns stub(:sid => 'S-1-5-32-547')
80
+ subject.expects(:name_to_principal).with('MACHINE\testers').returns stub(:sid => 'S-1-5-32-547')
81
81
  expect(subject.name_to_sid('MACHINE\testers')).to eq('S-1-5-32-547')
82
82
  end
83
83
 
@@ -128,37 +128,108 @@ describe "Puppet::Util::Windows::SID", :if => Puppet.features.microsoft_windows?
128
128
  end
129
129
  end
130
130
 
131
- context "#name_to_sid_object" do
131
+ context "#name_to_principal" do
132
132
  it "should return nil if the account does not exist" do
133
- expect(subject.name_to_sid_object(unknown_name)).to be_nil
133
+ expect(subject.name_to_principal(unknown_name)).to be_nil
134
134
  end
135
135
 
136
136
  it "should return a Puppet::Util::Windows::SID::Principal instance for any valid sid" do
137
- expect(subject.name_to_sid_object(sid)).to be_an_instance_of(Puppet::Util::Windows::SID::Principal)
137
+ expect(subject.name_to_principal(sid)).to be_an_instance_of(Puppet::Util::Windows::SID::Principal)
138
138
  end
139
139
 
140
140
  it "should accept unqualified account name" do
141
141
  # NOTE: lookup by name works in localized environments only for a few instances
142
142
  # this works in French Windows, even though the account is really Syst\u00E8me
143
- expect(subject.name_to_sid_object('SYSTEM').sid).to eq(sid)
143
+ expect(subject.name_to_principal('SYSTEM').sid).to eq(sid)
144
144
  end
145
145
 
146
146
  it "should be case-insensitive" do
147
147
  # NOTE: lookup by name works in localized environments only for a few instances
148
148
  # this works in French Windows, even though the account is really Syst\u00E8me
149
- expect(subject.name_to_sid_object('SYSTEM')).to eq(subject.name_to_sid_object('system'))
149
+ expect(subject.name_to_principal('SYSTEM')).to eq(subject.name_to_principal('system'))
150
150
  end
151
151
 
152
152
  it "should be leading and trailing whitespace-insensitive" do
153
153
  # NOTE: lookup by name works in localized environments only for a few instances
154
154
  # this works in French Windows, even though the account is really Syst\u00E8me
155
- expect(subject.name_to_sid_object('SYSTEM')).to eq(subject.name_to_sid_object(' SYSTEM '))
155
+ expect(subject.name_to_principal('SYSTEM')).to eq(subject.name_to_principal(' SYSTEM '))
156
156
  end
157
157
 
158
158
  it "should accept domain qualified account names" do
159
159
  # NOTE: lookup by name works in localized environments only for a few instances
160
160
  # this works in French Windows, even though the account is really AUTORITE NT\\Syst\u00E8me
161
- expect(subject.name_to_sid_object('NT AUTHORITY\SYSTEM').sid).to eq(sid)
161
+ expect(subject.name_to_principal('NT AUTHORITY\SYSTEM').sid).to eq(sid)
162
+ end
163
+ end
164
+
165
+ context "#ads_to_principal" do
166
+ it "should raise an error for non-WIN32OLE input" do
167
+ expect {
168
+ subject.ads_to_principal(stub('WIN32OLE', { :Name => 'foo' }))
169
+ }.to raise_error(Puppet::Error, /ads_object must be an IAdsUser or IAdsGroup instance/)
170
+ end
171
+
172
+ it "should raise an error for an empty byte array in the objectSID property" do
173
+ expect {
174
+ subject.ads_to_principal(stub('WIN32OLE', { :objectSID => [], :Name => '', :ole_respond_to? => true }))
175
+ }.to raise_error(Puppet::Error, /Octet string must be an array of bytes/)
176
+ end
177
+
178
+ it "should raise an error for a malformed byte array" do
179
+ expect {
180
+ invalid_octet = [2]
181
+ subject.ads_to_principal(stub('WIN32OLE', { :objectSID => invalid_octet, :Name => '', :ole_respond_to? => true }))
182
+ }.to raise_error do |error|
183
+ expect(error).to be_a(Puppet::Util::Windows::Error)
184
+ expect(error.code).to eq(87) # ERROR_INVALID_PARAMETER
185
+ end
186
+ end
187
+
188
+ it "should raise an error when a valid byte array for SID is unresolvable and its Name does not match" do
189
+ expect {
190
+ # S-1-1-1 is a valid SID that will not resolve
191
+ valid_octet_invalid_user = [1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0]
192
+ subject.ads_to_principal(stub('WIN32OLE', { :objectSID => valid_octet_invalid_user, :Name => unknown_name, :ole_respond_to? => true }))
193
+ }.to raise_error do |error|
194
+ expect(error).to be_a(Puppet::Error)
195
+ expect(error.cause.code).to eq(1332) # ERROR_NONE_MAPPED
196
+ end
197
+ end
198
+
199
+ it "should return a Principal object even when the SID is unresolvable, as long as the Name matches" do
200
+ # S-1-1-1 is a valid SID that will not resolve
201
+ valid_octet_invalid_user = [1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0]
202
+ unresolvable_user = stub('WIN32OLE', { :objectSID => valid_octet_invalid_user, :Name => 'S-1-1-1', :ole_respond_to? => true })
203
+ principal = subject.ads_to_principal(unresolvable_user)
204
+
205
+ expect(principal).to be_an_instance_of(Puppet::Util::Windows::SID::Principal)
206
+ expect(principal.account).to eq('S-1-1-1 (unresolvable)')
207
+ expect(principal.domain).to eq(nil)
208
+ expect(principal.domain_account).to eq('S-1-1-1 (unresolvable)')
209
+ expect(principal.sid).to eq('S-1-1-1')
210
+ expect(principal.sid_bytes).to eq(valid_octet_invalid_user)
211
+ expect(principal.account_type).to eq(:SidTypeUnknown)
212
+ end
213
+
214
+ it "should return a Puppet::Util::Windows::SID::Principal instance for any valid sid" do
215
+ system_bytes = [1, 1, 0, 0, 0, 0, 0, 5, 18, 0, 0, 0]
216
+ adsuser = stub('WIN32OLE', { :objectSID => system_bytes, :Name => 'SYSTEM', :ole_respond_to? => true })
217
+ expect(subject.ads_to_principal(adsuser)).to be_an_instance_of(Puppet::Util::Windows::SID::Principal)
218
+ end
219
+
220
+ it "should properly convert an array of bytes for a well-known non-localized SID, ignoring the Name from the WIN32OLE object" do
221
+ bytes = [1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
222
+ adsuser = stub('WIN32OLE', { :objectSID => bytes, :Name => unknown_name, :ole_respond_to? => true })
223
+ converted = subject.ads_to_principal(adsuser)
224
+
225
+ expect(converted).to be_an_instance_of Puppet::Util::Windows::SID::Principal
226
+ expect(converted.sid_bytes).to eq(bytes)
227
+ expect(converted.sid).to eq(null_sid)
228
+
229
+ # carefully select a SID here that is not localized on international Windows
230
+ expect(converted.account).to eq('NULL SID')
231
+ # garbage name supplied does not carry forward as SID is looked up again
232
+ expect(converted.account).to_not eq(adsuser.Name)
162
233
  end
163
234
  end
164
235