chef 12.4.3-universal-mingw32 → 12.5.1-universal-mingw32

Sign up to get free protection for your applications and to get access to all the features.
Files changed (320) hide show
  1. checksums.yaml +4 -4
  2. data/CONTRIBUTING.md +21 -25
  3. data/Gemfile +46 -0
  4. data/README.md +4 -4
  5. data/Rakefile +4 -110
  6. data/bin/chef-service-manager +3 -1
  7. data/distro/common/html/knife_cookbook_site.html +18 -18
  8. data/distro/common/man/man1/knife-cookbook-site.1 +11 -11
  9. data/lib/chef.rb +1 -1
  10. data/lib/chef/application.rb +1 -1
  11. data/lib/chef/application/apply.rb +19 -1
  12. data/lib/chef/application/client.rb +11 -5
  13. data/lib/chef/application/knife.rb +2 -2
  14. data/lib/chef/application/solo.rb +1 -1
  15. data/lib/chef/application/windows_service_manager.rb +19 -12
  16. data/lib/chef/chef_class.rb +46 -0
  17. data/lib/chef/chef_fs/config.rb +22 -24
  18. data/lib/chef/chef_fs/data_handler/client_data_handler.rb +3 -1
  19. data/lib/chef/chef_fs/file_pattern.rb +4 -15
  20. data/lib/chef/chef_fs/file_system/acl_dir.rb +3 -4
  21. data/lib/chef/chef_fs/file_system/acls_dir.rb +5 -1
  22. data/lib/chef/chef_fs/file_system/base_fs_dir.rb +0 -5
  23. data/lib/chef/chef_fs/file_system/base_fs_object.rb +5 -2
  24. data/lib/chef/chef_fs/file_system/chef_repository_file_system_cookbook_dir.rb +2 -9
  25. data/lib/chef/chef_fs/file_system/chef_repository_file_system_cookbook_entry.rb +2 -9
  26. data/lib/chef/chef_fs/file_system/chef_repository_file_system_cookbooks_dir.rb +10 -17
  27. data/lib/chef/chef_fs/file_system/chef_repository_file_system_entry.rb +1 -12
  28. data/lib/chef/chef_fs/file_system/chef_repository_file_system_root_dir.rb +15 -11
  29. data/lib/chef/chef_fs/file_system/chef_server_root_dir.rb +8 -2
  30. data/lib/chef/chef_fs/file_system/cookbook_dir.rb +4 -4
  31. data/lib/chef/chef_fs/file_system/cookbooks_acl_dir.rb +1 -1
  32. data/lib/chef/chef_fs/file_system/cookbooks_dir.rb +3 -11
  33. data/lib/chef/chef_fs/file_system/data_bags_dir.rb +3 -5
  34. data/lib/chef/chef_fs/file_system/environments_dir.rb +1 -1
  35. data/lib/chef/chef_fs/file_system/file_system_entry.rb +7 -4
  36. data/lib/chef/chef_fs/file_system/memory_dir.rb +2 -3
  37. data/lib/chef/chef_fs/file_system/multiplexed_dir.rb +15 -0
  38. data/lib/chef/chef_fs/file_system/nodes_dir.rb +1 -1
  39. data/lib/chef/chef_fs/file_system/organization_members_entry.rb +2 -2
  40. data/lib/chef/chef_fs/file_system/rest_list_dir.rb +4 -9
  41. data/lib/chef/chef_fs/knife.rb +35 -7
  42. data/lib/chef/chef_fs/path_utils.rb +65 -34
  43. data/lib/chef/client.rb +2 -3
  44. data/lib/chef/config.rb +34 -2
  45. data/lib/chef/{mixin/wstring.rb → constants.rb} +9 -13
  46. data/lib/chef/cookbook/metadata.rb +25 -3
  47. data/lib/chef/cookbook/synchronizer.rb +1 -1
  48. data/lib/chef/cookbook_site_streaming_uploader.rb +1 -1
  49. data/lib/chef/cookbook_version.rb +3 -3
  50. data/lib/chef/delayed_evaluator.rb +21 -0
  51. data/lib/chef/deprecation/mixin/template.rb +1 -2
  52. data/lib/chef/deprecation/provider/cookbook_file.rb +1 -1
  53. data/lib/chef/deprecation/provider/file.rb +1 -1
  54. data/lib/chef/deprecation/provider/remote_directory.rb +52 -0
  55. data/lib/chef/deprecation/provider/remote_file.rb +1 -2
  56. data/lib/chef/deprecation/provider/template.rb +1 -1
  57. data/lib/chef/deprecation/warnings.rb +3 -4
  58. data/lib/chef/dsl/reboot_pending.rb +3 -2
  59. data/lib/chef/dsl/recipe.rb +26 -7
  60. data/lib/chef/dsl/resources.rb +2 -2
  61. data/lib/chef/event_dispatch/base.rb +51 -22
  62. data/lib/chef/event_dispatch/dispatcher.rb +21 -6
  63. data/lib/chef/event_dispatch/dsl.rb +64 -0
  64. data/lib/chef/exceptions.rb +28 -1
  65. data/lib/chef/file_content_management/tempfile.rb +1 -1
  66. data/lib/chef/formatters/base.rb +3 -0
  67. data/lib/chef/formatters/doc.rb +56 -6
  68. data/lib/chef/formatters/error_inspectors/compile_error_inspector.rb +36 -0
  69. data/lib/chef/formatters/minimal.rb +2 -2
  70. data/lib/chef/guard_interpreter/resource_guard_interpreter.rb +3 -1
  71. data/lib/chef/http/http_request.rb +1 -1
  72. data/lib/chef/knife.rb +35 -55
  73. data/lib/chef/knife/bootstrap.rb +41 -0
  74. data/lib/chef/knife/bootstrap/chef_vault_handler.rb +1 -0
  75. data/lib/chef/knife/bootstrap/client_builder.rb +16 -0
  76. data/lib/chef/knife/bootstrap/templates/README.md +3 -4
  77. data/lib/chef/knife/bootstrap/templates/chef-full.erb +1 -1
  78. data/lib/chef/knife/cookbook_create.rb +1 -1
  79. data/lib/chef/knife/cookbook_site_download.rb +1 -1
  80. data/lib/chef/knife/cookbook_site_install.rb +1 -1
  81. data/lib/chef/knife/cookbook_site_share.rb +6 -6
  82. data/lib/chef/knife/cookbook_site_unshare.rb +2 -2
  83. data/lib/chef/knife/core/bootstrap_context.rb +12 -4
  84. data/lib/chef/knife/core/custom_manifest_loader.rb +69 -0
  85. data/lib/chef/knife/core/gem_glob_loader.rb +138 -0
  86. data/lib/chef/knife/core/hashed_command_loader.rb +80 -0
  87. data/lib/chef/knife/core/node_presenter.rb +24 -1
  88. data/lib/chef/knife/core/object_loader.rb +1 -0
  89. data/lib/chef/knife/core/subcommand_loader.rb +131 -146
  90. data/lib/chef/knife/node_run_list_remove.rb +12 -1
  91. data/lib/chef/knife/null.rb +10 -0
  92. data/lib/chef/knife/rehash.rb +62 -0
  93. data/lib/chef/knife/search.rb +3 -3
  94. data/lib/chef/knife/ssh.rb +52 -30
  95. data/lib/chef/knife/ssl_check.rb +3 -2
  96. data/lib/chef/knife/user_edit.rb +1 -2
  97. data/lib/chef/local_mode.rb +5 -0
  98. data/lib/chef/log.rb +5 -1
  99. data/lib/chef/mixin/deprecation.rb +8 -8
  100. data/lib/chef/mixin/params_validate.rb +362 -135
  101. data/lib/chef/mixin/template.rb +48 -0
  102. data/lib/chef/mixin/which.rb +1 -1
  103. data/lib/chef/mixin/wide_string.rb +72 -0
  104. data/lib/chef/mixin/windows_architecture_helper.rb +15 -39
  105. data/lib/chef/mixin/windows_env_helper.rb +4 -1
  106. data/lib/chef/monkey_patches/webrick-utils.rb +51 -0
  107. data/lib/chef/monkey_patches/win32/registry.rb +72 -0
  108. data/lib/chef/node.rb +116 -3
  109. data/lib/chef/node_map.rb +2 -2
  110. data/lib/chef/platform/handler_map.rb +0 -5
  111. data/lib/chef/platform/provider_mapping.rb +5 -6
  112. data/lib/chef/platform/query_helpers.rb +46 -4
  113. data/lib/chef/platform/rebooter.rb +1 -1
  114. data/lib/chef/platform/service_helpers.rb +30 -32
  115. data/lib/chef/policy_builder.rb +1 -8
  116. data/lib/chef/policy_builder/dynamic.rb +186 -0
  117. data/lib/chef/policy_builder/expand_node_object.rb +30 -15
  118. data/lib/chef/policy_builder/policyfile.rb +155 -18
  119. data/lib/chef/property.rb +568 -0
  120. data/lib/chef/provider.rb +222 -13
  121. data/lib/chef/provider/batch.rb +8 -0
  122. data/lib/chef/provider/deploy.rb +5 -7
  123. data/lib/chef/provider/directory.rb +14 -2
  124. data/lib/chef/provider/dsc_resource.rb +5 -9
  125. data/lib/chef/provider/group/pw.rb +1 -1
  126. data/lib/chef/provider/ifconfig.rb +2 -2
  127. data/lib/chef/provider/lwrp_base.rb +1 -75
  128. data/lib/chef/provider/mount.rb +7 -3
  129. data/lib/chef/provider/package.rb +1 -1
  130. data/lib/chef/provider/package/dpkg.rb +5 -11
  131. data/lib/chef/provider/package/rpm.rb +2 -2
  132. data/lib/chef/provider/package/rubygems.rb +1 -1
  133. data/lib/chef/provider/package/windows/msi.rb +2 -2
  134. data/lib/chef/provider/package/yum.rb +17 -5
  135. data/lib/chef/provider/powershell_script.rb +59 -23
  136. data/lib/chef/provider/registry_key.rb +5 -5
  137. data/lib/chef/provider/remote_directory.rb +190 -102
  138. data/lib/chef/provider/service.rb +12 -2
  139. data/lib/chef/provider/service/aix.rb +1 -1
  140. data/lib/chef/provider/service/debian.rb +3 -5
  141. data/lib/chef/provider/service/freebsd.rb +1 -1
  142. data/lib/chef/provider/service/gentoo.rb +3 -3
  143. data/lib/chef/provider/service/init.rb +3 -3
  144. data/lib/chef/provider/service/insserv.rb +2 -4
  145. data/lib/chef/provider/service/invokercd.rb +2 -4
  146. data/lib/chef/provider/service/macosx.rb +5 -1
  147. data/lib/chef/provider/service/openbsd.rb +2 -1
  148. data/lib/chef/provider/service/redhat.rb +52 -16
  149. data/lib/chef/provider/service/simple.rb +2 -2
  150. data/lib/chef/provider/service/systemd.rb +3 -5
  151. data/lib/chef/provider/service/upstart.rb +4 -6
  152. data/lib/chef/provider/subversion.rb +13 -7
  153. data/lib/chef/provider/template/content.rb +16 -6
  154. data/lib/chef/provider/user/solaris.rb +32 -4
  155. data/lib/chef/provider/windows_script.rb +3 -5
  156. data/lib/chef/provider_resolver.rb +2 -2
  157. data/lib/chef/recipe.rb +1 -8
  158. data/lib/chef/resource.rb +563 -90
  159. data/lib/chef/resource/action_class.rb +83 -0
  160. data/lib/chef/resource/chef_gem.rb +3 -3
  161. data/lib/chef/resource/deploy.rb +8 -2
  162. data/lib/chef/resource/dsc_script.rb +2 -0
  163. data/lib/chef/resource/file/verification.rb +7 -1
  164. data/lib/chef/resource/lwrp_base.rb +1 -7
  165. data/lib/chef/resource/registry_key.rb +1 -1
  166. data/lib/chef/resource/service.rb +10 -2
  167. data/lib/chef/resource/subversion.rb +5 -0
  168. data/lib/chef/resource/windows_script.rb +6 -2
  169. data/lib/chef/resource/yum_package.rb +10 -1
  170. data/lib/chef/resource_resolver.rb +3 -3
  171. data/lib/chef/run_context.rb +402 -83
  172. data/lib/chef/run_list/versioned_recipe_list.rb +15 -0
  173. data/lib/chef/run_lock.rb +30 -21
  174. data/lib/chef/util/powershell/ps_credential.rb +4 -0
  175. data/lib/chef/util/windows.rb +0 -32
  176. data/lib/chef/util/windows/net_group.rb +85 -106
  177. data/lib/chef/util/windows/net_use.rb +35 -71
  178. data/lib/chef/util/windows/net_user.rb +0 -1
  179. data/lib/chef/util/windows/volume.rb +19 -19
  180. data/lib/chef/version.rb +3 -3
  181. data/lib/chef/win32/api.rb +1 -0
  182. data/lib/chef/win32/api/file.rb +20 -0
  183. data/lib/chef/win32/api/net.rb +163 -43
  184. data/lib/chef/win32/api/registry.rb +51 -0
  185. data/lib/chef/win32/api/system.rb +23 -0
  186. data/lib/chef/win32/api/unicode.rb +0 -43
  187. data/lib/chef/win32/crypto.rb +2 -1
  188. data/lib/chef/win32/file.rb +28 -3
  189. data/lib/chef/win32/mutex.rb +1 -2
  190. data/lib/chef/win32/net.rb +162 -8
  191. data/lib/chef/win32/process.rb +13 -0
  192. data/lib/chef/win32/registry.rb +35 -30
  193. data/lib/chef/win32/security.rb +1 -1
  194. data/lib/chef/win32/security/token.rb +1 -1
  195. data/lib/chef/win32/system.rb +62 -0
  196. data/lib/chef/win32/unicode.rb +7 -2
  197. data/lib/chef/win32/version.rb +0 -4
  198. data/lib/chef/workstation_config_loader.rb +3 -158
  199. data/spec/data/cookbooks/openldap/templates/default/helpers.erb +14 -0
  200. data/spec/data/cookbooks/openldap/templates/default/nested_openldap_partials.erb +1 -0
  201. data/spec/data/cookbooks/openldap/templates/default/nested_partial.erb +1 -0
  202. data/spec/data/dsc_lcm.pfx +0 -0
  203. data/spec/data/run_context/cookbooks/include/recipes/default.rb +24 -0
  204. data/spec/data/run_context/cookbooks/include/recipes/includee.rb +3 -0
  205. data/spec/functional/dsl/reboot_pending_spec.rb +33 -43
  206. data/spec/functional/knife/cookbook_delete_spec.rb +17 -7
  207. data/spec/functional/knife/ssh_spec.rb +16 -0
  208. data/spec/functional/rebooter_spec.rb +1 -1
  209. data/spec/functional/resource/deploy_revision_spec.rb +1 -1
  210. data/spec/functional/resource/dsc_resource_spec.rb +2 -0
  211. data/spec/functional/resource/dsc_script_spec.rb +91 -2
  212. data/spec/functional/resource/group_spec.rb +67 -44
  213. data/spec/functional/resource/{powershell_spec.rb → powershell_script_spec.rb} +107 -18
  214. data/spec/functional/resource/windows_service_spec.rb +1 -1
  215. data/spec/functional/run_lock_spec.rb +368 -189
  216. data/spec/functional/win32/{registry_helper_spec.rb → registry_spec.rb} +16 -23
  217. data/spec/functional/win32/service_manager_spec.rb +2 -2
  218. data/spec/integration/client/client_spec.rb +51 -0
  219. data/spec/integration/knife/chef_repo_path_spec.rb +13 -11
  220. data/spec/integration/knife/download_spec.rb +4 -0
  221. data/spec/integration/knife/list_spec.rb +8 -0
  222. data/spec/integration/knife/upload_spec.rb +1 -1
  223. data/spec/integration/recipes/recipe_dsl_spec.rb +1 -16
  224. data/spec/integration/recipes/remote_directory.rb +74 -0
  225. data/spec/integration/recipes/resource_action_spec.rb +363 -0
  226. data/spec/integration/recipes/resource_converge_if_changed_spec.rb +423 -0
  227. data/spec/integration/recipes/resource_load_spec.rb +206 -0
  228. data/spec/spec_helper.rb +9 -0
  229. data/spec/support/platform_helpers.rb +13 -0
  230. data/spec/support/shared/context/win32.rb +34 -0
  231. data/spec/support/shared/functional/win32_service.rb +2 -1
  232. data/spec/support/shared/functional/windows_script.rb +63 -26
  233. data/spec/support/shared/unit/mock_shellout.rb +46 -0
  234. data/spec/support/shared/unit/provider/file.rb +10 -4
  235. data/spec/unit/application/client_spec.rb +16 -3
  236. data/spec/unit/application/knife_spec.rb +2 -2
  237. data/spec/unit/application/solo_spec.rb +4 -3
  238. data/spec/unit/chef_class_spec.rb +23 -4
  239. data/spec/unit/chef_fs/path_util_spec.rb +108 -0
  240. data/spec/unit/client_spec.rb +6 -1
  241. data/spec/unit/config_spec.rb +31 -0
  242. data/spec/unit/cookbook/metadata_spec.rb +23 -3
  243. data/spec/unit/cookbook/syntax_check_spec.rb +3 -0
  244. data/spec/unit/deprecation_spec.rb +3 -6
  245. data/spec/unit/dsl/reboot_pending_spec.rb +12 -6
  246. data/spec/unit/event_dispatch/dispatcher_spec.rb +65 -3
  247. data/spec/unit/event_dispatch/dsl_spec.rb +83 -0
  248. data/spec/unit/formatters/doc_spec.rb +32 -0
  249. data/spec/unit/formatters/error_inspectors/compile_error_inspector_spec.rb +26 -0
  250. data/spec/unit/json_compat_spec.rb +4 -3
  251. data/spec/unit/knife/bootstrap/client_builder_spec.rb +27 -0
  252. data/spec/unit/knife/bootstrap_spec.rb +55 -3
  253. data/spec/unit/knife/cookbook_site_share_spec.rb +3 -3
  254. data/spec/unit/knife/core/bootstrap_context_spec.rb +21 -4
  255. data/spec/unit/knife/core/custom_manifest_loader_spec.rb +41 -0
  256. data/spec/unit/knife/core/gem_glob_loader_spec.rb +210 -0
  257. data/spec/unit/knife/core/hashed_command_loader_spec.rb +93 -0
  258. data/spec/unit/knife/core/subcommand_loader_spec.rb +16 -192
  259. data/spec/unit/knife/node_run_list_remove_spec.rb +17 -0
  260. data/spec/unit/knife/ssl_check_spec.rb +4 -0
  261. data/spec/unit/mixin/enforce_ownership_and_permissions_spec.rb +10 -10
  262. data/spec/unit/mixin/params_validate_spec.rb +4 -2
  263. data/spec/unit/mixin/template_spec.rb +5 -1
  264. data/spec/unit/mixin/windows_architecture_helper_spec.rb +13 -8
  265. data/spec/unit/node_spec.rb +220 -0
  266. data/spec/unit/platform/query_helpers_spec.rb +146 -3
  267. data/spec/unit/policy_builder/dynamic_spec.rb +275 -0
  268. data/spec/unit/policy_builder/expand_node_object_spec.rb +37 -38
  269. data/spec/unit/policy_builder/policyfile_spec.rb +260 -46
  270. data/spec/unit/property/state_spec.rb +506 -0
  271. data/spec/unit/property/validation_spec.rb +663 -0
  272. data/spec/unit/property_spec.rb +1094 -0
  273. data/spec/unit/provider/deploy_spec.rb +5 -5
  274. data/spec/unit/provider/directory_spec.rb +35 -0
  275. data/spec/unit/provider/dsc_resource_spec.rb +3 -10
  276. data/spec/unit/provider/ifconfig_spec.rb +22 -2
  277. data/spec/unit/provider/mount/aix_spec.rb +2 -1
  278. data/spec/unit/provider/mount/mount_spec.rb +6 -0
  279. data/spec/unit/provider/mount/windows_spec.rb +14 -0
  280. data/spec/unit/provider/mount_spec.rb +12 -1
  281. data/spec/unit/provider/package/dpkg_spec.rb +8 -1
  282. data/spec/unit/provider/package/rpm_spec.rb +18 -1
  283. data/spec/unit/provider/package/rubygems_spec.rb +18 -0
  284. data/spec/unit/provider/package/yum_spec.rb +97 -24
  285. data/spec/unit/provider/powershell_script_spec.rb +106 -0
  286. data/spec/unit/provider/registry_key_spec.rb +12 -0
  287. data/spec/unit/provider/remote_directory_spec.rb +1 -2
  288. data/spec/unit/provider/service/aix_service_spec.rb +3 -3
  289. data/spec/unit/provider/service/gentoo_service_spec.rb +4 -4
  290. data/spec/unit/provider/service/macosx_spec.rb +4 -4
  291. data/spec/unit/provider/service/openbsd_service_spec.rb +10 -8
  292. data/spec/unit/provider/service/redhat_spec.rb +88 -8
  293. data/spec/unit/provider/service/upstart_service_spec.rb +11 -7
  294. data/spec/unit/provider/service/windows_spec.rb +211 -200
  295. data/spec/unit/provider/subversion_spec.rb +50 -31
  296. data/spec/unit/provider/template/content_spec.rb +93 -2
  297. data/spec/unit/provider/user/solaris_spec.rb +66 -9
  298. data/spec/unit/provider_resolver_spec.rb +707 -650
  299. data/spec/unit/provider_spec.rb +1 -3
  300. data/spec/unit/recipe_spec.rb +0 -4
  301. data/spec/unit/resource/deploy_spec.rb +7 -1
  302. data/spec/unit/resource/dsc_script_spec.rb +4 -0
  303. data/spec/unit/resource/file/verification_spec.rb +33 -5
  304. data/spec/unit/resource/{powershell_spec.rb → powershell_script_spec.rb} +17 -13
  305. data/spec/unit/resource/service_spec.rb +4 -4
  306. data/spec/unit/resource/subversion_spec.rb +4 -0
  307. data/spec/unit/resource/yum_package_spec.rb +10 -1
  308. data/spec/unit/resource_spec.rb +2 -2
  309. data/spec/unit/run_context/child_run_context_spec.rb +133 -0
  310. data/spec/unit/run_context_spec.rb +7 -0
  311. data/spec/unit/run_list/versioned_recipe_list_spec.rb +5 -0
  312. data/spec/unit/win32/registry_spec.rb +394 -0
  313. data/tasks/external_tests.rb +47 -23
  314. data/tasks/maintainers.rb +155 -14
  315. metadata +64 -53
  316. data/lib/chef/knife/bootstrap/templates/archlinux-gems.erb +0 -76
  317. data/lib/chef/knife/bootstrap/templates/chef-aix.erb +0 -72
  318. data/spec/unit/provider/powershell_spec.rb +0 -80
  319. data/spec/unit/registry_helper_spec.rb +0 -376
  320. data/spec/unit/workstation_config_loader_spec.rb +0 -283
@@ -58,14 +58,7 @@ class Chef
58
58
  end
59
59
 
60
60
  def children
61
- begin
62
- Dir.entries(file_path).sort.
63
- select { |child_name| can_have_child?(child_name, File.directory?(File.join(file_path, child_name))) }.
64
- map { |child_name| make_child(child_name) }.
65
- select { |entry| !(entry.dir? && entry.children.size == 0) }
66
- rescue Errno::ENOENT
67
- raise Chef::ChefFS::FileSystem::NotFoundError.new(self, $!)
68
- end
61
+ super.select { |entry| !(entry.dir? && entry.children.size == 0 ) }
69
62
  end
70
63
 
71
64
  def can_have_child?(name, is_dir)
@@ -99,7 +92,7 @@ class Chef
99
92
 
100
93
  protected
101
94
 
102
- def make_child(child_name)
95
+ def make_child_entry(child_name)
103
96
  segment_info = CookbookDir::COOKBOOK_SEGMENT_INFO[child_name.to_sym] || {}
104
97
  ChefRepositoryFileSystemCookbookEntry.new(child_name, self, nil, segment_info[:ruby_only], segment_info[:recursive])
105
98
  end
@@ -34,14 +34,7 @@ class Chef
34
34
  attr_reader :recursive
35
35
 
36
36
  def children
37
- begin
38
- Dir.entries(file_path).sort.
39
- select { |child_name| can_have_child?(child_name, File.directory?(File.join(file_path, child_name))) }.
40
- map { |child_name| make_child(child_name) }.
41
- select { |entry| !(entry.dir? && entry.children.size == 0) }
42
- rescue Errno::ENOENT
43
- raise Chef::ChefFS::FileSystem::NotFoundError.new(self, $!)
44
- end
37
+ super.select { |entry| !(entry.dir? && entry.children.size == 0 ) }
45
38
  end
46
39
 
47
40
  def can_have_child?(name, is_dir)
@@ -78,7 +71,7 @@ class Chef
78
71
 
79
72
  protected
80
73
 
81
- def make_child(child_name)
74
+ def make_child_entry(child_name)
82
75
  ChefRepositoryFileSystemCookbookEntry.new(child_name, self, nil, ruby_only, recursive)
83
76
  end
84
77
  end
@@ -37,21 +37,14 @@ class Chef
37
37
  attr_reader :chefignore
38
38
 
39
39
  def children
40
- begin
41
- Dir.entries(file_path).sort.
42
- select { |child_name| can_have_child?(child_name, File.directory?(File.join(file_path, child_name))) }.
43
- map { |child_name| make_child(child_name) }.
44
- select do |entry|
45
- # empty cookbooks and cookbook directories are ignored
46
- if !entry.can_upload?
47
- Chef::Log.warn("Cookbook '#{entry.name}' is empty or entirely chefignored at #{entry.path_for_printing}")
48
- false
49
- else
50
- true
51
- end
52
- end
53
- rescue Errno::ENOENT
54
- raise Chef::ChefFS::FileSystem::NotFoundError.new(self, $!)
40
+ super.select do |entry|
41
+ # empty cookbooks and cookbook directories are ignored
42
+ if !entry.can_upload?
43
+ Chef::Log.warn("Cookbook '#{entry.name}' is empty or entirely chefignored at #{entry.path_for_printing}")
44
+ false
45
+ else
46
+ true
47
+ end
55
48
  end
56
49
  end
57
50
 
@@ -61,7 +54,7 @@ class Chef
61
54
 
62
55
  def write_cookbook(cookbook_path, cookbook_version_json, from_fs)
63
56
  cookbook_name = File.basename(cookbook_path)
64
- child = make_child(cookbook_name)
57
+ child = make_child_entry(cookbook_name)
65
58
 
66
59
  # Use the copy/diff algorithm to copy it down so we don't destroy
67
60
  # chefignored data. This is terribly un-thread-safe.
@@ -80,7 +73,7 @@ class Chef
80
73
 
81
74
  protected
82
75
 
83
- def make_child(child_name)
76
+ def make_child_entry(child_name)
84
77
  ChefRepositoryFileSystemCookbookDir.new(child_name, self)
85
78
  end
86
79
  end
@@ -70,20 +70,9 @@ class Chef
70
70
  Chef::JSONCompat.to_json_pretty(object)
71
71
  end
72
72
 
73
- def children
74
- # Except cookbooks and data bag dirs, all things must be json files
75
- begin
76
- Dir.entries(file_path).sort.
77
- select { |child_name| can_have_child?(child_name, File.directory?(File.join(file_path, child_name))) }.
78
- map { |child_name| make_child(child_name) }
79
- rescue Errno::ENOENT
80
- raise Chef::ChefFS::FileSystem::NotFoundError.new(self, $!)
81
- end
82
- end
83
-
84
73
  protected
85
74
 
86
- def make_child(child_name)
75
+ def make_child_entry(child_name)
87
76
  ChefRepositoryFileSystemEntry.new(child_name, self)
88
77
  end
89
78
  end
@@ -68,13 +68,13 @@ class Chef
68
68
  attr_reader :child_paths
69
69
  attr_reader :versioned_cookbooks
70
70
 
71
- CHILDREN = %w(invitations.json members.json org.json)
71
+ CHILDREN = %w(org.json invitations.json members.json)
72
72
 
73
73
  def children
74
74
  @children ||= begin
75
- result = child_paths.keys.sort.map { |name| make_child_entry(name) }.select { |child| !child.nil? }
76
- result += root_dir.children.select { |c| CHILDREN.include?(c.name) } if root_dir
77
- result.sort_by { |c| c.name }
75
+ result = child_paths.keys.sort.map { |name| make_child_entry(name) }
76
+ result += CHILDREN.map { |name| make_child_entry(name) }
77
+ result.select { |c| c && c.exists? }.sort_by { |c| c.name }
78
78
  end
79
79
  end
80
80
 
@@ -149,19 +149,23 @@ class Chef
149
149
  # cookbooks from all of them when you list or grab them).
150
150
  #
151
151
  def make_child_entry(name)
152
- paths = child_paths[name].select do |path|
153
- File.exists?(path)
152
+ if CHILDREN.include?(name)
153
+ return nil if !root_dir
154
+ return root_dir.child(name)
154
155
  end
156
+
157
+ paths = (child_paths[name] || []).select { |path| File.exists?(path) }
155
158
  if paths.size == 0
156
- return nil
159
+ return NonexistentFSObject.new(name, self)
157
160
  end
158
- if name == 'cookbooks'
161
+ case name
162
+ when 'cookbooks'
159
163
  dirs = paths.map { |path| ChefRepositoryFileSystemCookbooksDir.new(name, self, path) }
160
- elsif name == 'data_bags'
164
+ when 'data_bags'
161
165
  dirs = paths.map { |path| ChefRepositoryFileSystemDataBagsDir.new(name, self, path) }
162
- elsif name == 'policies'
166
+ when 'policies'
163
167
  dirs = paths.map { |path| ChefRepositoryFileSystemPoliciesDir.new(name, self, path) }
164
- elsif name == 'acls'
168
+ when 'acls'
165
169
  dirs = paths.map { |path| ChefRepositoryFileSystemAclsDir.new(name, self, path) }
166
170
  else
167
171
  data_handler = case name
@@ -110,7 +110,8 @@ class Chef
110
110
  end
111
111
 
112
112
  def can_have_child?(name, is_dir)
113
- is_dir && children.any? { |child| child.name == name }
113
+ result = children.select { |child| child.name == name }.first
114
+ result && !!result.dir? == !!is_dir
114
115
  end
115
116
 
116
117
  def org
@@ -119,11 +120,16 @@ class Chef
119
120
  if File.dirname(path) == '/organizations'
120
121
  File.basename(path)
121
122
  else
122
- nil
123
+ # In Chef 12, everything is in an org.
124
+ 'chef'
123
125
  end
124
126
  end
125
127
  end
126
128
 
129
+ def make_child_entry(name)
130
+ children.select { |child| child.name == name }.first
131
+ end
132
+
127
133
  def children
128
134
  @children ||= begin
129
135
  result = [
@@ -16,6 +16,7 @@
16
16
  # limitations under the License.
17
17
  #
18
18
 
19
+ require 'chef/chef_fs/command_line'
19
20
  require 'chef/chef_fs/file_system/rest_list_dir'
20
21
  require 'chef/chef_fs/file_system/cookbook_subdir'
21
22
  require 'chef/chef_fs/file_system/cookbook_file'
@@ -71,16 +72,15 @@ class Chef
71
72
  "#{parent.api_path}/#{cookbook_name}/#{version || "_latest"}"
72
73
  end
73
74
 
74
- def child(name)
75
+ def make_child_entry(name)
75
76
  # Since we're ignoring the rules and doing a network request here,
76
77
  # we need to make sure we don't rethrow the exception. (child(name)
77
78
  # is not supposed to fail.)
78
79
  begin
79
- result = children.select { |child| child.name == name }.first
80
- return result if result
80
+ children.select { |child| child.name == name }.first
81
81
  rescue Chef::ChefFS::FileSystem::NotFoundError
82
+ nil
82
83
  end
83
- return NonexistentFSObject.new(name, self)
84
84
  end
85
85
 
86
86
  def can_have_child?(name, is_dir)
@@ -31,7 +31,7 @@ class Chef
31
31
  def children
32
32
  if @children.nil?
33
33
  names = parent.parent.child(name).children.map { |child| "#{child.cookbook_name}.json" }
34
- @children = names.uniq.map { |name| AclEntry.new(name, self, true) }
34
+ @children = names.uniq.map { |name| make_child_entry(name, true) }
35
35
  end
36
36
  @children
37
37
  end
@@ -36,17 +36,9 @@ class Chef
36
36
  super("cookbooks", parent)
37
37
  end
38
38
 
39
- def child(name)
40
- if @children
41
- result = self.children.select { |child| child.name == name }.first
42
- if result
43
- result
44
- else
45
- NonexistentFSObject.new(name, self)
46
- end
47
- else
48
- CookbookDir.new(name, self)
49
- end
39
+ def make_child_entry(name)
40
+ result = @children.select { |child| child.name == name }.first if @children
41
+ result || CookbookDir.new(name, self)
50
42
  end
51
43
 
52
44
  def children
@@ -27,16 +27,14 @@ class Chef
27
27
  super("data_bags", parent, "data")
28
28
  end
29
29
 
30
- def child(name)
30
+ def make_child_entry(name, exists = false)
31
31
  result = @children.select { |child| child.name == name }.first if @children
32
- result || DataBagDir.new(name, self)
32
+ result || DataBagDir.new(name, self, exists)
33
33
  end
34
34
 
35
35
  def children
36
36
  begin
37
- @children ||= root.get_json(api_path).keys.sort.map do |entry|
38
- DataBagDir.new(entry, self, true)
39
- end
37
+ @children ||= root.get_json(api_path).keys.sort.map { |entry| make_child_entry(entry, true) }
40
38
  rescue Timeout::Error => e
41
39
  raise Chef::ChefFS::FileSystem::OperationFailedError.new(:children, self, e), "Timeout getting children: #{e}"
42
40
  rescue Net::HTTPServerException => e
@@ -30,7 +30,7 @@ class Chef
30
30
  super("environments", parent, nil, Chef::ChefFS::DataHandler::EnvironmentDataHandler.new)
31
31
  end
32
32
 
33
- def _make_child_entry(name, exists = nil)
33
+ def make_child_entry(name, exists = nil)
34
34
  if name == '_default.json'
35
35
  DefaultEnvironmentEntry.new(name, self, exists)
36
36
  else
@@ -40,15 +40,18 @@ class Chef
40
40
  end
41
41
 
42
42
  def children
43
+ # Except cookbooks and data bag dirs, all things must be json files
43
44
  begin
44
- Dir.entries(file_path).sort.select { |entry| entry != '.' && entry != '..' }.map { |entry| make_child(entry) }
45
+ Dir.entries(file_path).sort.
46
+ map { |child_name| make_child_entry(child_name) }.
47
+ select { |child| child && can_have_child?(child.name, child.dir?) }
45
48
  rescue Errno::ENOENT
46
49
  raise Chef::ChefFS::FileSystem::NotFoundError.new(self, $!)
47
50
  end
48
51
  end
49
52
 
50
53
  def create_child(child_name, file_contents=nil)
51
- child = make_child(child_name)
54
+ child = make_child_entry(child_name)
52
55
  if child.exists?
53
56
  raise Chef::ChefFS::FileSystem::AlreadyExistsError.new(:create_child, child)
54
57
  end
@@ -80,7 +83,7 @@ class Chef
80
83
  end
81
84
 
82
85
  def exists?
83
- File.exists?(file_path)
86
+ File.exists?(file_path) && parent.can_have_child?(name, dir?)
84
87
  end
85
88
 
86
89
  def read
@@ -99,7 +102,7 @@ class Chef
99
102
 
100
103
  protected
101
104
 
102
- def make_child(child_name)
105
+ def make_child_entry(child_name)
103
106
  FileSystemEntry.new(child_name, self)
104
107
  end
105
108
  end
@@ -1,5 +1,4 @@
1
1
  require 'chef/chef_fs/file_system/base_fs_dir'
2
- require 'chef/chef_fs/file_system/nonexistent_fs_object'
3
2
  require 'chef/chef_fs/file_system/memory_file'
4
3
 
5
4
  class Chef
@@ -13,8 +12,8 @@ class Chef
13
12
 
14
13
  attr_reader :children
15
14
 
16
- def child(name)
17
- @children.select { |child| child.name == name }.first || Chef::ChefFS::FileSystem::NonexistentFSObject.new(name, self)
15
+ def make_child_entry(name)
16
+ @children.select { |child| child.name == name }.first
18
17
  end
19
18
 
20
19
  def add_child(child)
@@ -35,6 +35,21 @@ class Chef
35
35
  end
36
36
  end
37
37
 
38
+ def make_child_entry(name)
39
+ result = nil
40
+ multiplexed_dirs.each do |dir|
41
+ child_entry = dir.child(name)
42
+ if child_entry.exists?
43
+ if result
44
+ Chef::Log.warn("Child with name '#{child_entry.name}' found in multiple directories: #{result.parent.path_for_printing} and #{child_entry.parent.path_for_printing}")
45
+ else
46
+ result = child_entry
47
+ end
48
+ end
49
+ end
50
+ result
51
+ end
52
+
38
53
  def can_have_child?(name, is_dir)
39
54
  write_dir.can_have_child?(name, is_dir)
40
55
  end
@@ -33,7 +33,7 @@ class Chef
33
33
  def children
34
34
  begin
35
35
  @children ||= root.get_json(env_api_path).keys.sort.map do |key|
36
- _make_child_entry("#{key}.json", true)
36
+ make_child_entry("#{key}.json", true)
37
37
  end
38
38
  rescue Timeout::Error => e
39
39
  raise Chef::ChefFS::FileSystem::OperationFailedError.new(:children, self, e), "Timeout retrieving children: #{e}"
@@ -39,9 +39,9 @@ class Chef
39
39
  members = minimize_value(_read_json)
40
40
  (desired_members - members).each do |member|
41
41
  begin
42
- rest.post(File.join(api_path, member), {})
42
+ rest.post(api_path, 'username' => member)
43
43
  rescue Net::HTTPServerException => e
44
- if e.response.code == '404'
44
+ if %w(404 405).include?(e.response.code)
45
45
  raise "Chef server at #{api_path} does not allow you to directly add members. Please either upgrade your Chef server or move the users you want into invitations.json instead of members.json."
46
46
  else
47
47
  raise
@@ -33,12 +33,6 @@ class Chef
33
33
  attr_reader :api_path
34
34
  attr_reader :data_handler
35
35
 
36
- def child(name)
37
- result = @children.select { |child| child.name == name }.first if @children
38
- result ||= can_have_child?(name, false) ?
39
- _make_child_entry(name) : NonexistentFSObject.new(name, self)
40
- end
41
-
42
36
  def can_have_child?(name, is_dir)
43
37
  name =~ /\.json$/ && !is_dir
44
38
  end
@@ -46,7 +40,7 @@ class Chef
46
40
  def children
47
41
  begin
48
42
  @children ||= root.get_json(api_path).keys.sort.map do |key|
49
- _make_child_entry("#{key}.json", true)
43
+ make_child_entry("#{key}.json", true)
50
44
  end
51
45
  rescue Timeout::Error => e
52
46
  raise Chef::ChefFS::FileSystem::OperationFailedError.new(:children, self, e), "Timeout retrieving children: #{e}"
@@ -66,7 +60,7 @@ class Chef
66
60
  raise Chef::ChefFS::FileSystem::OperationFailedError.new(:create_child, self, e), "Parse error reading JSON creating child '#{name}': #{e}"
67
61
  end
68
62
 
69
- result = _make_child_entry(name, true)
63
+ result = make_child_entry(name, true)
70
64
 
71
65
  if data_handler
72
66
  object = data_handler.normalize_for_post(object, result)
@@ -106,7 +100,8 @@ class Chef
106
100
  parent.rest
107
101
  end
108
102
 
109
- def _make_child_entry(name, exists = nil)
103
+ def make_child_entry(name, exists = nil)
104
+ @children.select { |child| child.name == name }.first if @children
110
105
  RestListEntry.new(name, self, exists)
111
106
  end
112
107
  end
@@ -17,6 +17,7 @@
17
17
  #
18
18
 
19
19
  require 'chef/knife'
20
+ require 'pathname'
20
21
 
21
22
  class Chef
22
23
  module ChefFS
@@ -63,7 +64,7 @@ class Chef
63
64
  # --chef-repo-path forcibly overrides all other paths
64
65
  if config[:chef_repo_path]
65
66
  Chef::Config[:chef_repo_path] = config[:chef_repo_path]
66
- %w(acl client cookbook container data_bag environment group node role user).each do |variable_name|
67
+ Chef::ChefFS::Config::INFLECTIONS.each_value do |variable_name|
67
68
  Chef::Config.delete("#{variable_name}_path".to_sym)
68
69
  end
69
70
  end
@@ -98,14 +99,41 @@ class Chef
98
99
  end
99
100
 
100
101
  def pattern_arg_from(arg)
101
- # TODO support absolute file paths and not just patterns? Too much?
102
- # Could be super useful in a world with multiple repo paths
103
- if !@chef_fs_config.base_path && !Chef::ChefFS::PathUtils.is_absolute?(arg)
104
- # Check if chef repo path is specified to give a better error message
105
- ui.error("Attempt to use relative path '#{arg}' when current directory is outside the repository path")
102
+ inferred_path = nil
103
+ if Chef::ChefFS::PathUtils.is_absolute?(arg)
104
+ # We should be able to use this as-is - but the user might have incorrectly provided
105
+ # us with a path that is based off of the OS root path instead of the Chef-FS root.
106
+ # Do a quick and dirty sanity check.
107
+ if possible_server_path = @chef_fs_config.server_path(arg)
108
+ ui.warn("The absolute path provided is suspicious: #{arg}")
109
+ ui.warn("If you wish to refer to a file location, please provide a path that is rooted at the chef-repo.")
110
+ ui.warn("Consider writing '#{possible_server_path}' instead of '#{arg}'")
111
+ end
112
+ # Use the original path because we can't be sure.
113
+ inferred_path = arg
114
+ elsif arg[0,1] == '~'
115
+ # Let's be nice and fix it if possible - but warn the user.
116
+ ui.warn("A path relative to a user home directory has been provided: #{arg}")
117
+ ui.warn("Paths provided need to be rooted at the chef-repo being considered or be relative paths.")
118
+ inferred_path = @chef_fs_config.server_path(arg)
119
+ ui.warn("Using '#{inferred_path}' as the path instead of '#{arg}'.")
120
+ elsif Pathname.new(arg).absolute?
121
+ # It is definitely a system absolute path (such as C:\ or \\foo\bar) but it cannot be
122
+ # interpreted as a Chef-FS absolute path. Again attempt to be nice but warn the user.
123
+ ui.warn("An absolute file system path that isn't a server path was provided: #{arg}")
124
+ ui.warn("Paths provided need to be rooted at the chef-repo being considered or be relative paths.")
125
+ inferred_path = @chef_fs_config.server_path(arg)
126
+ ui.warn("Using '#{inferred_path}' as the path instead of '#{arg}'.")
127
+ elsif @chef_fs_config.base_path.nil?
128
+ # These are all relative paths. We can't resolve and root paths unless we are in the
129
+ # chef repo.
130
+ ui.error("Attempt to use relative path '#{arg}' when current directory is outside the repository path.")
131
+ ui.error("Current working directory is '#{@chef_fs_config.cwd}'.")
106
132
  exit(1)
133
+ else
134
+ inferred_path = Chef::ChefFS::PathUtils::join(@chef_fs_config.base_path, arg)
107
135
  end
108
- Chef::ChefFS::FilePattern.relative_to(@chef_fs_config.base_path, arg)
136
+ Chef::ChefFS::FilePattern.new(inferred_path)
109
137
  end
110
138
 
111
139
  def format_path(entry)