chef 12.18.31-universal-mingw32 → 12.19.33-universal-mingw32

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (305) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +5 -4
  3. data/README.md +12 -13
  4. data/VERSION +1 -1
  5. data/acceptance/Gemfile +4 -4
  6. data/acceptance/Gemfile.lock +70 -69
  7. data/chef-universal-mingw32.gemspec +2 -3
  8. data/chef.gemspec +6 -6
  9. data/lib/chef/api_client.rb +8 -10
  10. data/lib/chef/api_client_v1.rb +9 -11
  11. data/lib/chef/application/apply.rb +8 -10
  12. data/lib/chef/application/client.rb +1 -1
  13. data/lib/chef/application/exit_code.rb +3 -5
  14. data/lib/chef/application/knife.rb +2 -2
  15. data/lib/chef/application/windows_service.rb +29 -30
  16. data/lib/chef/application/windows_service_manager.rb +1 -1
  17. data/lib/chef/audit/audit_event_proxy.rb +2 -2
  18. data/lib/chef/audit/control_group_data.rb +1 -1
  19. data/lib/chef/chef_class.rb +1 -0
  20. data/lib/chef/chef_fs/chef_fs_data_store.rb +5 -7
  21. data/lib/chef/chef_fs/command_line.rb +15 -16
  22. data/lib/chef/chef_fs/data_handler/client_data_handler.rb +1 -1
  23. data/lib/chef/chef_fs/data_handler/container_data_handler.rb +1 -1
  24. data/lib/chef/chef_fs/data_handler/cookbook_data_handler.rb +1 -1
  25. data/lib/chef/chef_fs/data_handler/data_bag_item_data_handler.rb +1 -1
  26. data/lib/chef/chef_fs/data_handler/environment_data_handler.rb +1 -1
  27. data/lib/chef/chef_fs/data_handler/group_data_handler.rb +1 -1
  28. data/lib/chef/chef_fs/data_handler/node_data_handler.rb +1 -1
  29. data/lib/chef/chef_fs/data_handler/organization_data_handler.rb +1 -1
  30. data/lib/chef/chef_fs/data_handler/role_data_handler.rb +1 -1
  31. data/lib/chef/chef_fs/data_handler/user_data_handler.rb +1 -1
  32. data/lib/chef/chef_fs/file_pattern.rb +2 -2
  33. data/lib/chef/chef_fs/file_system.rb +1 -1
  34. data/lib/chef/chef_fs/file_system/chef_server/cookbook_dir.rb +5 -6
  35. data/lib/chef/chef_fs/file_system/chef_server/cookbook_file.rb +8 -10
  36. data/lib/chef/chef_fs/file_system/chef_server/data_bags_dir.rb +8 -10
  37. data/lib/chef/chef_fs/file_system/chef_server/nodes_dir.rb +10 -12
  38. data/lib/chef/chef_fs/file_system/chef_server/policies_dir.rb +28 -30
  39. data/lib/chef/chef_fs/file_system/chef_server/policy_group_entry.rb +1 -1
  40. data/lib/chef/chef_fs/file_system/chef_server/rest_list_dir.rb +27 -29
  41. data/lib/chef/chef_fs/file_system/chef_server/rest_list_entry.rb +18 -24
  42. data/lib/chef/chef_fs/file_system/memory/memory_file.rb +1 -1
  43. data/lib/chef/chef_fs/file_system/multiplexed_dir.rb +10 -12
  44. data/lib/chef/chef_fs/file_system/repository/chef_repository_file_system_cookbook_dir.rb +10 -12
  45. data/lib/chef/chef_fs/file_system/repository/chef_repository_file_system_cookbook_entry.rb +9 -13
  46. data/lib/chef/chef_fs/file_system/repository/chef_repository_file_system_root_dir.rb +2 -0
  47. data/lib/chef/chef_fs/file_system/repository/cookbooks_dir.rb +1 -1
  48. data/lib/chef/chef_fs/file_system/repository/nodes_dir.rb +3 -0
  49. data/lib/chef/chef_fs/parallelizer.rb +9 -11
  50. data/lib/chef/cookbook/cookbook_version_loader.rb +25 -31
  51. data/lib/chef/cookbook/metadata.rb +26 -26
  52. data/lib/chef/cookbook/syntax_check.rb +1 -1
  53. data/lib/chef/cookbook_version.rb +3 -3
  54. data/lib/chef/data_bag.rb +1 -1
  55. data/lib/chef/data_bag_item.rb +3 -3
  56. data/lib/chef/data_collector.rb +3 -4
  57. data/lib/chef/decorator.rb +1 -1
  58. data/lib/chef/deprecated.rb +30 -0
  59. data/lib/chef/dsl/audit.rb +2 -2
  60. data/lib/chef/dsl/declare_resource.rb +1 -1
  61. data/lib/chef/dsl/platform_introspection.rb +29 -31
  62. data/lib/chef/dsl/reboot_pending.rb +1 -1
  63. data/lib/chef/dsl/resources.rb +6 -8
  64. data/lib/chef/encrypted_data_bag_item.rb +2 -2
  65. data/lib/chef/environment.rb +9 -11
  66. data/lib/chef/event_loggers/windows_eventlog.rb +1 -1
  67. data/lib/chef/exceptions.rb +4 -1
  68. data/lib/chef/file_access_control/unix.rb +14 -14
  69. data/lib/chef/file_access_control/windows.rb +1 -1
  70. data/lib/chef/formatters/error_inspectors/api_error_formatting.rb +4 -5
  71. data/lib/chef/formatters/error_mapper.rb +6 -6
  72. data/lib/chef/http/api_versions.rb +50 -0
  73. data/lib/chef/http/validate_content_length.rb +2 -2
  74. data/lib/chef/json_compat.rb +6 -10
  75. data/lib/chef/key.rb +5 -5
  76. data/lib/chef/knife.rb +4 -4
  77. data/lib/chef/knife/cookbook_site_install.rb +2 -2
  78. data/lib/chef/knife/core/cookbook_scm_repo.rb +2 -2
  79. data/lib/chef/knife/core/gem_glob_loader.rb +1 -1
  80. data/lib/chef/knife/core/status_presenter.rb +1 -1
  81. data/lib/chef/knife/core/ui.rb +19 -25
  82. data/lib/chef/knife/data_bag_secret_options.rb +1 -1
  83. data/lib/chef/knife/deps.rb +32 -34
  84. data/lib/chef/knife/help.rb +1 -1
  85. data/lib/chef/knife/list.rb +1 -1
  86. data/lib/chef/knife/search.rb +2 -2
  87. data/lib/chef/knife/ssh.rb +37 -27
  88. data/lib/chef/knife/ssl_check.rb +1 -1
  89. data/lib/chef/knife/user_delete.rb +1 -1
  90. data/lib/chef/mash.rb +1 -1
  91. data/lib/chef/mixin/command.rb +2 -2
  92. data/lib/chef/mixin/create_path.rb +3 -5
  93. data/lib/chef/mixin/from_file.rb +2 -2
  94. data/lib/chef/mixin/get_source_from_package.rb +2 -2
  95. data/lib/chef/mixin/notifying_block.rb +7 -9
  96. data/lib/chef/mixin/params_validate.rb +3 -3
  97. data/lib/chef/mixin/securable.rb +1 -1
  98. data/lib/chef/mixin/shell_out.rb +23 -3
  99. data/lib/chef/mixin/unformatter.rb +2 -2
  100. data/lib/chef/mixin/uris.rb +4 -6
  101. data/lib/chef/mixin/versioned_api.rb +69 -0
  102. data/lib/chef/mixin/which.rb +25 -8
  103. data/lib/chef/mixin/windows_architecture_helper.rb +2 -2
  104. data/lib/chef/mixin/xml_escape.rb +3 -5
  105. data/lib/chef/monkey_patches/webrick-utils.rb +1 -1
  106. data/lib/chef/node.rb +8 -8
  107. data/lib/chef/node/attribute.rb +4 -4
  108. data/lib/chef/node/common_api.rb +5 -7
  109. data/lib/chef/org.rb +10 -12
  110. data/lib/chef/platform/provider_mapping.rb +7 -7
  111. data/lib/chef/platform/query_helpers.rb +1 -1
  112. data/lib/chef/policy_builder/policyfile.rb +1 -0
  113. data/lib/chef/property.rb +31 -0
  114. data/lib/chef/provider/batch.rb +1 -1
  115. data/lib/chef/provider/breakpoint.rb +1 -1
  116. data/lib/chef/provider/cookbook_file.rb +3 -3
  117. data/lib/chef/provider/cron.rb +38 -38
  118. data/lib/chef/provider/deploy.rb +81 -81
  119. data/lib/chef/provider/deploy/revision.rb +3 -5
  120. data/lib/chef/provider/directory.rb +32 -32
  121. data/lib/chef/provider/dsc_resource.rb +22 -6
  122. data/lib/chef/provider/env.rb +28 -28
  123. data/lib/chef/provider/env/windows.rb +1 -1
  124. data/lib/chef/provider/erl_call.rb +13 -13
  125. data/lib/chef/provider/execute.rb +5 -2
  126. data/lib/chef/provider/file.rb +49 -51
  127. data/lib/chef/provider/git.rb +55 -55
  128. data/lib/chef/provider/http_request.rb +36 -36
  129. data/lib/chef/provider/launchd.rb +2 -2
  130. data/lib/chef/provider/link.rb +50 -50
  131. data/lib/chef/provider/log.rb +2 -2
  132. data/lib/chef/provider/mdadm.rb +25 -25
  133. data/lib/chef/provider/mount/aix.rb +2 -2
  134. data/lib/chef/provider/mount/mount.rb +2 -2
  135. data/lib/chef/provider/ohai.rb +1 -1
  136. data/lib/chef/provider/osx_profile.rb +23 -23
  137. data/lib/chef/provider/package.rb +74 -56
  138. data/lib/chef/provider/package/aix.rb +55 -52
  139. data/lib/chef/provider/package/apt.rb +15 -13
  140. data/lib/chef/provider/package/cab.rb +49 -20
  141. data/lib/chef/provider/package/chocolatey.rb +9 -10
  142. data/lib/chef/provider/package/dnf.rb +20 -18
  143. data/lib/chef/provider/package/dnf/dnf_helper.py +1 -1
  144. data/lib/chef/provider/package/dnf/python_helper.rb +63 -26
  145. data/lib/chef/provider/package/dnf/version.rb +1 -1
  146. data/lib/chef/provider/package/dpkg.rb +8 -9
  147. data/lib/chef/provider/package/easy_install.rb +22 -22
  148. data/lib/chef/provider/package/freebsd/base.rb +10 -10
  149. data/lib/chef/provider/package/freebsd/pkg.rb +15 -15
  150. data/lib/chef/provider/package/freebsd/pkgng.rb +13 -15
  151. data/lib/chef/provider/package/freebsd/port.rb +7 -7
  152. data/lib/chef/provider/package/homebrew.rb +11 -10
  153. data/lib/chef/provider/package/ips.rb +18 -23
  154. data/lib/chef/provider/package/macports.rb +23 -23
  155. data/lib/chef/provider/package/msu.rb +11 -11
  156. data/lib/chef/provider/package/openbsd.rb +25 -22
  157. data/lib/chef/provider/package/pacman.rb +16 -16
  158. data/lib/chef/provider/package/paludis.rb +26 -27
  159. data/lib/chef/provider/package/portage.rb +22 -22
  160. data/lib/chef/provider/package/powershell.rb +17 -17
  161. data/lib/chef/provider/package/rpm.rb +25 -25
  162. data/lib/chef/provider/package/rubygems.rb +60 -60
  163. data/lib/chef/provider/package/smartos.rb +16 -16
  164. data/lib/chef/provider/package/solaris.rb +44 -44
  165. data/lib/chef/provider/package/windows.rb +3 -3
  166. data/lib/chef/provider/package/windows/exe.rb +6 -6
  167. data/lib/chef/provider/package/windows/msi.rb +6 -6
  168. data/lib/chef/provider/package/yum.rb +318 -268
  169. data/lib/chef/provider/package/yum/rpm_utils.rb +34 -34
  170. data/lib/chef/provider/package/yum/yum_cache.rb +12 -12
  171. data/lib/chef/provider/package/zypper.rb +11 -11
  172. data/lib/chef/provider/powershell_script.rb +15 -7
  173. data/lib/chef/provider/reboot.rb +10 -10
  174. data/lib/chef/provider/registry_key.rb +39 -39
  175. data/lib/chef/provider/remote_directory.rb +3 -3
  176. data/lib/chef/provider/remote_file.rb +3 -3
  177. data/lib/chef/provider/route.rb +1 -1
  178. data/lib/chef/provider/ruby_block.rb +3 -3
  179. data/lib/chef/provider/script.rb +42 -6
  180. data/lib/chef/provider/service.rb +49 -49
  181. data/lib/chef/provider/service/solaris.rb +1 -1
  182. data/lib/chef/provider/service/systemd.rb +1 -1
  183. data/lib/chef/provider/subversion.rb +39 -39
  184. data/lib/chef/provider/systemd_unit.rb +2 -0
  185. data/lib/chef/provider/template.rb +3 -3
  186. data/lib/chef/provider/user.rb +42 -42
  187. data/lib/chef/provider/whyrun_safe_ruby_block.rb +4 -4
  188. data/lib/chef/resource.rb +27 -16
  189. data/lib/chef/resource/apt_repository.rb +0 -1
  190. data/lib/chef/resource/chef_gem.rb +1 -1
  191. data/lib/chef/resource/dnf_package.rb +6 -3
  192. data/lib/chef/resource/dsc_resource.rb +9 -1
  193. data/lib/chef/resource/execute.rb +70 -6
  194. data/lib/chef/resource/file/verification/systemd_unit.rb +67 -0
  195. data/lib/chef/resource/freebsd_package.rb +1 -1
  196. data/lib/chef/resource/gem_package.rb +1 -1
  197. data/lib/chef/resource/launchd.rb +13 -1
  198. data/lib/chef/resource/package.rb +2 -2
  199. data/lib/chef/resource/registry_key.rb +1 -1
  200. data/lib/chef/resource/yum_package.rb +12 -3
  201. data/lib/chef/resource/yum_repository.rb +0 -1
  202. data/lib/chef/resource_collection/resource_collection_serialization.rb +3 -3
  203. data/lib/chef/resource_collection/resource_set.rb +2 -2
  204. data/lib/chef/resource_reporter.rb +1 -1
  205. data/lib/chef/run_context.rb +3 -3
  206. data/lib/chef/run_list/run_list_item.rb +1 -1
  207. data/lib/chef/run_list/versioned_recipe_list.rb +6 -6
  208. data/lib/chef/server_api.rb +2 -0
  209. data/lib/chef/server_api_versions.rb +40 -0
  210. data/lib/chef/shell.rb +1 -1
  211. data/lib/chef/shell/ext.rb +3 -3
  212. data/lib/chef/shell/shell_session.rb +1 -1
  213. data/lib/chef/user.rb +9 -11
  214. data/lib/chef/user_v1.rb +9 -11
  215. data/lib/chef/util/diff.rb +1 -1
  216. data/lib/chef/util/dsc/lcm_output_parser.rb +1 -1
  217. data/lib/chef/util/selinux.rb +1 -1
  218. data/lib/chef/util/windows/net_group.rb +18 -30
  219. data/lib/chef/util/windows/net_use.rb +7 -11
  220. data/lib/chef/util/windows/net_user.rb +11 -17
  221. data/lib/chef/util/windows/volume.rb +9 -15
  222. data/lib/chef/version.rb +1 -1
  223. data/lib/chef/version_class.rb +1 -1
  224. data/lib/chef/win32/api.rb +4 -6
  225. data/lib/chef/win32/api/file.rb +25 -31
  226. data/lib/chef/win32/api/installer.rb +2 -2
  227. data/lib/chef/win32/file.rb +4 -6
  228. data/lib/chef/win32/registry.rb +9 -9
  229. data/lib/chef/win32/security.rb +2 -2
  230. data/lib/chef/win32/security/acl.rb +2 -2
  231. data/lib/chef/win32/unicode.rb +2 -2
  232. data/lib/chef/win32/version.rb +1 -1
  233. data/spec/data/prefer_metadata_json/metadata.json +51 -0
  234. data/spec/data/prefer_metadata_json/metadata.rb +6 -0
  235. data/spec/data/prefer_metadata_json/recipes/default.rb +0 -0
  236. data/spec/functional/knife/ssh_spec.rb +5 -5
  237. data/spec/functional/resource/batch_spec.rb +5 -1
  238. data/spec/functional/resource/dsc_script_spec.rb +2 -4
  239. data/spec/functional/resource/execute_spec.rb +17 -0
  240. data/spec/functional/resource/user/dscl_spec.rb +2 -4
  241. data/spec/integration/client/client_spec.rb +33 -0
  242. data/spec/integration/recipes/recipe_dsl_spec.rb +58 -58
  243. data/spec/spec_helper.rb +4 -0
  244. data/spec/support/chef_helpers.rb +5 -7
  245. data/spec/support/platform_helpers.rb +6 -0
  246. data/spec/support/platforms/prof/gc.rb +4 -6
  247. data/spec/support/shared/context/client.rb +1 -1
  248. data/spec/support/shared/functional/execute_resource.rb +150 -0
  249. data/spec/support/shared/functional/windows_script.rb +74 -4
  250. data/spec/support/shared/unit/execute_resource.rb +37 -0
  251. data/spec/support/shared/unit/provider/file.rb +10 -0
  252. data/spec/unit/cookbook/cookbook_version_loader_spec.rb +9 -0
  253. data/spec/unit/cookbook/syntax_check_spec.rb +8 -2
  254. data/spec/unit/http/api_versions_spec.rb +69 -0
  255. data/spec/unit/knife/ssh_spec.rb +34 -36
  256. data/spec/unit/mixin/versioned_api_spec.rb +107 -0
  257. data/spec/unit/mixin/which.rb +160 -0
  258. data/spec/unit/platform_spec.rb +28 -1
  259. data/spec/unit/provider/deploy_spec.rb +1 -1
  260. data/spec/unit/provider/directory_spec.rb +10 -0
  261. data/spec/unit/provider/dsc_resource_spec.rb +175 -0
  262. data/spec/unit/provider/execute_spec.rb +0 -1
  263. data/spec/unit/provider/launchd_spec.rb +2 -2
  264. data/spec/unit/provider/package/aix_spec.rb +22 -22
  265. data/spec/unit/provider/package/apt_spec.rb +27 -27
  266. data/spec/unit/provider/package/cab_spec.rb +59 -5
  267. data/spec/unit/provider/package/dnf/python_helper_spec.rb +29 -0
  268. data/spec/unit/provider/package/dpkg_spec.rb +16 -16
  269. data/spec/unit/provider/package/easy_install_spec.rb +18 -18
  270. data/spec/unit/provider/package/freebsd/pkg_spec.rb +15 -15
  271. data/spec/unit/provider/package/freebsd/pkgng_spec.rb +9 -9
  272. data/spec/unit/provider/package/freebsd/port_spec.rb +9 -9
  273. data/spec/unit/provider/package/homebrew_spec.rb +9 -9
  274. data/spec/unit/provider/package/ips_spec.rb +37 -31
  275. data/spec/unit/provider/package/macports_spec.rb +10 -10
  276. data/spec/unit/provider/package/openbsd_spec.rb +10 -10
  277. data/spec/unit/provider/package/pacman_spec.rb +6 -6
  278. data/spec/unit/provider/package/paludis_spec.rb +7 -7
  279. data/spec/unit/provider/package/portage_spec.rb +6 -7
  280. data/spec/unit/provider/package/rpm_spec.rb +23 -23
  281. data/spec/unit/provider/package/rubygems_spec.rb +38 -38
  282. data/spec/unit/provider/package/solaris_spec.rb +15 -15
  283. data/spec/unit/provider/package/windows_spec.rb +2 -1
  284. data/spec/unit/provider/package/yum_spec.rb +51 -43
  285. data/spec/unit/provider/package/zypper_spec.rb +34 -34
  286. data/spec/unit/provider/package_spec.rb +8 -0
  287. data/spec/unit/provider/remote_file/sftp_spec.rb +3 -3
  288. data/spec/unit/provider/route_spec.rb +7 -1
  289. data/spec/unit/provider/script_spec.rb +49 -6
  290. data/spec/unit/resource/dsc_resource_spec.rb +6 -0
  291. data/spec/unit/resource/execute_spec.rb +214 -0
  292. data/spec/unit/resource/file/verification/systemd_unit_spec.rb +103 -0
  293. data/spec/unit/resource/freebsd_package_spec.rb +2 -2
  294. data/spec/unit/resource/package_spec.rb +5 -0
  295. data/spec/unit/resource/yum_package_spec.rb +42 -1
  296. data/spec/unit/resource_reporter_spec.rb +1 -1
  297. data/spec/unit/resource_spec.rb +18 -0
  298. data/spec/unit/server_api_versions_spec.rb +44 -0
  299. data/spec/unit/util/selinux_spec.rb +3 -14
  300. data/spec/unit/win32/error_spec.rb +67 -0
  301. data/spec/unit/win32/security_spec.rb +66 -0
  302. data/tasks/changelog.rb +1 -1
  303. data/tasks/dependencies.rb +20 -4
  304. metadata +39 -18
  305. data/lib/chef/monkey_patches/net-ssh-multi.rb +0 -141
@@ -1,6 +1,6 @@
1
1
  #
2
2
  # Author:: Adam Jacob (<adam@chef.io>)
3
- # Copyright:: Copyright 2008-2016, Chef Software, Inc.
3
+ # Copyright:: Copyright 2008-2017, Chef Software Inc.
4
4
  # License:: Apache License, Version 2.0
5
5
  #
6
6
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -52,6 +52,17 @@ class Chef
52
52
  @candidate_version = nil
53
53
  end
54
54
 
55
+ def options
56
+ if new_resource.options.is_a?(String)
57
+ # XXX: needs to handle double quotes, single quotes, nested quotes, etc and probably act
58
+ # more like a space-separated "C"SV file -- although users can fix this just by passing in
59
+ # a correctly pre-split Array.
60
+ new_resource.options.split(" ")
61
+ else
62
+ new_resource.options
63
+ end
64
+ end
65
+
55
66
  def whyrun_supported?
56
67
  true
57
68
  end
@@ -64,16 +75,15 @@ class Chef
64
75
  end
65
76
  end
66
77
 
67
- def load_current_resource
68
- end
78
+ def load_current_resource; end
69
79
 
70
80
  def define_resource_requirements
71
81
  # XXX: upgrade with a specific version doesn't make a whole lot of sense, but why don't we throw this anyway if it happens?
72
82
  # if not, shouldn't we raise to tell the user to use install instead of upgrade if they want to pin a version?
73
83
  requirements.assert(:install) do |a|
74
84
  a.assertion { candidates_exist_for_all_forced_changes? }
75
- a.failure_message(Chef::Exceptions::Package, "No version specified, and no candidate version available for #{forced_packages_missing_candidates.join(", ")}")
76
- a.whyrun("Assuming a repository that offers #{forced_packages_missing_candidates.join(", ")} would have been configured")
85
+ a.failure_message(Chef::Exceptions::Package, "No version specified, and no candidate version available for #{forced_packages_missing_candidates.join(', ')}")
86
+ a.whyrun("Assuming a repository that offers #{forced_packages_missing_candidates.join(', ')} would have been configured")
77
87
  end
78
88
 
79
89
  # XXX: Does it make sense to pass in a source with :upgrade? Probably
@@ -81,19 +91,19 @@ class Chef
81
91
  # so we'll just leave things as-is for now.
82
92
  requirements.assert(:upgrade, :install) do |a|
83
93
  a.assertion { candidates_exist_for_all_uninstalled? || new_resource.source }
84
- a.failure_message(Chef::Exceptions::Package, "No candidate version available for #{packages_missing_candidates.join(", ")}")
85
- a.whyrun("Assuming a repository that offers #{packages_missing_candidates.join(", ")} would have been configured")
94
+ a.failure_message(Chef::Exceptions::Package, "No candidate version available for #{packages_missing_candidates.join(', ')}")
95
+ a.whyrun("Assuming a repository that offers #{packages_missing_candidates.join(', ')} would have been configured")
86
96
  end
87
97
  end
88
98
 
89
99
  action :install do
90
100
  unless target_version_array.any?
91
- Chef::Log.debug("#{@new_resource} is already installed - nothing to do")
101
+ Chef::Log.debug("#{new_resource} is already installed - nothing to do")
92
102
  return
93
103
  end
94
104
 
95
105
  # @todo: move the preseed code out of the base class (and complete the fix for Array of preseeds? ugh...)
96
- if @new_resource.response_file
106
+ if new_resource.response_file
97
107
  if preseed_file = get_preseed_file(package_names_for_targets, versions_for_targets)
98
108
  converge_by("preseed package #{package_names_for_targets}") do
99
109
  preseed_package(preseed_file)
@@ -105,7 +115,7 @@ class Chef
105
115
  multipackage_api_adapter(package_names_for_targets, versions_for_targets) do |name, version|
106
116
  install_package(name, version)
107
117
  end
108
- Chef::Log.info("#{@new_resource} installed #{package_names_for_targets} at #{versions_for_targets}")
118
+ Chef::Log.info("#{new_resource} installed #{package_names_for_targets} at #{versions_for_targets}")
109
119
  end
110
120
  end
111
121
 
@@ -122,8 +132,8 @@ class Chef
122
132
  private :install_description
123
133
 
124
134
  action :upgrade do
125
- if !target_version_array.any?
126
- Chef::Log.debug("#{@new_resource} no versions to upgrade - nothing to do")
135
+ unless target_version_array.any?
136
+ Chef::Log.debug("#{new_resource} no versions to upgrade - nothing to do")
127
137
  return
128
138
  end
129
139
 
@@ -132,7 +142,7 @@ class Chef
132
142
  upgrade_package(name, version)
133
143
  end
134
144
  log_allow_downgrade = allow_downgrade ? "(allow_downgrade)" : ""
135
- Chef::Log.info("#{@new_resource} upgraded#{log_allow_downgrade} #{package_names_for_targets} to #{versions_for_targets}")
145
+ Chef::Log.info("#{new_resource} upgraded#{log_allow_downgrade} #{package_names_for_targets} to #{versions_for_targets}")
136
146
  end
137
147
  end
138
148
 
@@ -153,15 +163,15 @@ class Chef
153
163
 
154
164
  action :remove do
155
165
  if removing_package?
156
- description = @new_resource.version ? "version #{@new_resource.version} of " : ""
157
- converge_by("remove #{description}package #{@current_resource.package_name}") do
158
- multipackage_api_adapter(@current_resource.package_name, @new_resource.version) do |name, version|
166
+ description = new_resource.version ? "version #{new_resource.version} of " : ""
167
+ converge_by("remove #{description}package #{current_resource.package_name}") do
168
+ multipackage_api_adapter(current_resource.package_name, new_resource.version) do |name, version|
159
169
  remove_package(name, version)
160
170
  end
161
- Chef::Log.info("#{@new_resource} removed")
171
+ Chef::Log.info("#{new_resource} removed")
162
172
  end
163
173
  else
164
- Chef::Log.debug("#{@new_resource} package does not exist - nothing to do")
174
+ Chef::Log.debug("#{new_resource} package does not exist - nothing to do")
165
175
  end
166
176
  end
167
177
 
@@ -188,48 +198,48 @@ class Chef
188
198
 
189
199
  action :purge do
190
200
  if removing_package?
191
- description = @new_resource.version ? "version #{@new_resource.version} of" : ""
192
- converge_by("purge #{description} package #{@current_resource.package_name}") do
193
- multipackage_api_adapter(@current_resource.package_name, @new_resource.version) do |name, version|
201
+ description = new_resource.version ? "version #{new_resource.version} of" : ""
202
+ converge_by("purge #{description} package #{current_resource.package_name}") do
203
+ multipackage_api_adapter(current_resource.package_name, new_resource.version) do |name, version|
194
204
  purge_package(name, version)
195
205
  end
196
- Chef::Log.info("#{@new_resource} purged")
206
+ Chef::Log.info("#{new_resource} purged")
197
207
  end
198
208
  end
199
209
  end
200
210
 
201
211
  action :reconfig do
202
- if @current_resource.version.nil?
203
- Chef::Log.debug("#{@new_resource} is NOT installed - nothing to do")
212
+ if current_resource.version.nil?
213
+ Chef::Log.debug("#{new_resource} is NOT installed - nothing to do")
204
214
  return
205
215
  end
206
216
 
207
- unless @new_resource.response_file
208
- Chef::Log.debug("#{@new_resource} no response_file provided - nothing to do")
217
+ unless new_resource.response_file
218
+ Chef::Log.debug("#{new_resource} no response_file provided - nothing to do")
209
219
  return
210
220
  end
211
221
 
212
- if preseed_file = get_preseed_file(@new_resource.package_name, @current_resource.version)
213
- converge_by("reconfigure package #{@new_resource.package_name}") do
222
+ if preseed_file = get_preseed_file(new_resource.package_name, current_resource.version)
223
+ converge_by("reconfigure package #{new_resource.package_name}") do
214
224
  preseed_package(preseed_file)
215
- multipackage_api_adapter(@new_resource.package_name, @current_resource.version) do |name, version|
225
+ multipackage_api_adapter(new_resource.package_name, current_resource.version) do |name, version|
216
226
  reconfig_package(name, version)
217
227
 
218
228
  end
219
- Chef::Log.info("#{@new_resource} reconfigured")
229
+ Chef::Log.info("#{new_resource} reconfigured")
220
230
  end
221
231
  else
222
- Chef::Log.debug("#{@new_resource} preseeding has not changed - nothing to do")
232
+ Chef::Log.debug("#{new_resource} preseeding has not changed - nothing to do")
223
233
  end
224
234
  end
225
235
 
226
236
  def action_lock
227
- if package_locked(@new_resource.name, @new_resource.version) == false
228
- description = @new_resource.version ? "version #{@new_resource.version} of " : ""
229
- converge_by("lock #{description}package #{@current_resource.package_name}") do
230
- multipackage_api_adapter(@current_resource.package_name, @new_resource.version) do |name, version|
237
+ if package_locked(new_resource.name, new_resource.version) == false
238
+ description = new_resource.version ? "version #{new_resource.version} of " : ""
239
+ converge_by("lock #{description}package #{current_resource.package_name}") do
240
+ multipackage_api_adapter(current_resource.package_name, new_resource.version) do |name, version|
231
241
  lock_package(name, version)
232
- Chef::Log.info("#{@new_resource} locked")
242
+ Chef::Log.info("#{new_resource} locked")
233
243
  end
234
244
  end
235
245
  else
@@ -238,12 +248,12 @@ class Chef
238
248
  end
239
249
 
240
250
  def action_unlock
241
- if package_locked(@new_resource.name, @new_resource.version) == true
242
- description = @new_resource.version ? "version #{@new_resource.version} of " : ""
243
- converge_by("unlock #{description}package #{@current_resource.package_name}") do
244
- multipackage_api_adapter(@current_resource.package_name, @new_resource.version) do |name, version|
251
+ if package_locked(new_resource.name, new_resource.version) == true
252
+ description = new_resource.version ? "version #{new_resource.version} of " : ""
253
+ converge_by("unlock #{description}package #{current_resource.package_name}") do
254
+ multipackage_api_adapter(current_resource.package_name, new_resource.version) do |name, version|
245
255
  unlock_package(name, version)
246
- Chef::Log.info("#{@new_resource} unlocked")
256
+ Chef::Log.info("#{new_resource} unlocked")
247
257
  end
248
258
  end
249
259
  else
@@ -251,6 +261,10 @@ class Chef
251
261
  end
252
262
  end
253
263
 
264
+ def package_locked(name, version)
265
+ raise Chef::Exceptions::UnsupportedAction, "#{self} has no way to detect if package is locked"
266
+ end
267
+
254
268
  # @todo use composition rather than inheritance
255
269
 
256
270
  def multipackage_api_adapter(name, version)
@@ -295,6 +309,8 @@ class Chef
295
309
 
296
310
  # used by subclasses. deprecated. use #a_to_s instead.
297
311
  def expand_options(options)
312
+ # its deprecated but still work to do to deprecate it fully
313
+ #Chef.deprecated(:package_misc, "expand_options is deprecated, use shell_out_compact or shell_out_compact_timeout instead")
298
314
  options ? " #{options}" : ""
299
315
  end
300
316
 
@@ -339,7 +355,7 @@ class Chef
339
355
  def get_preseed_file(name, version)
340
356
  resource = preseed_resource(name, version)
341
357
  resource.run_action(:create)
342
- Chef::Log.debug("#{@new_resource} fetched preseed file to #{resource.path}")
358
+ Chef::Log.debug("#{new_resource} fetched preseed file to #{resource.path}")
343
359
 
344
360
  if resource.updated_by_last_action?
345
361
  resource.path
@@ -351,26 +367,26 @@ class Chef
351
367
  # @todo: extract apt/dpkg specific preseeding to a helper class
352
368
  def preseed_resource(name, version)
353
369
  # A directory in our cache to store this cookbook's preseed files in
354
- file_cache_dir = Chef::FileCache.create_cache_path("preseed/#{@new_resource.cookbook_name}")
370
+ file_cache_dir = Chef::FileCache.create_cache_path("preseed/#{new_resource.cookbook_name}")
355
371
  # The full path where the preseed file will be stored
356
372
  cache_seed_to = "#{file_cache_dir}/#{name}-#{version}.seed"
357
373
 
358
- Chef::Log.debug("#{@new_resource} fetching preseed file to #{cache_seed_to}")
374
+ Chef::Log.debug("#{new_resource} fetching preseed file to #{cache_seed_to}")
359
375
 
360
- if template_available?(@new_resource.response_file)
361
- Chef::Log.debug("#{@new_resource} fetching preseed file via Template")
376
+ if template_available?(new_resource.response_file)
377
+ Chef::Log.debug("#{new_resource} fetching preseed file via Template")
362
378
  remote_file = Chef::Resource::Template.new(cache_seed_to, run_context)
363
- remote_file.variables(@new_resource.response_file_variables)
364
- elsif cookbook_file_available?(@new_resource.response_file)
365
- Chef::Log.debug("#{@new_resource} fetching preseed file via cookbook_file")
379
+ remote_file.variables(new_resource.response_file_variables)
380
+ elsif cookbook_file_available?(new_resource.response_file)
381
+ Chef::Log.debug("#{new_resource} fetching preseed file via cookbook_file")
366
382
  remote_file = Chef::Resource::CookbookFile.new(cache_seed_to, run_context)
367
383
  else
368
- message = "No template or cookbook file found for response file #{@new_resource.response_file}"
384
+ message = "No template or cookbook file found for response file #{new_resource.response_file}"
369
385
  raise Chef::Exceptions::FileNotFound, message
370
386
  end
371
387
 
372
- remote_file.cookbook_name = @new_resource.cookbook_name
373
- remote_file.source(@new_resource.response_file)
388
+ remote_file.cookbook_name = new_resource.cookbook_name
389
+ remote_file.source(new_resource.response_file)
374
390
  remote_file.backup(false)
375
391
  remote_file
376
392
  end
@@ -608,8 +624,8 @@ class Chef
608
624
  end
609
625
 
610
626
  def allow_downgrade
611
- if @new_resource.respond_to?("allow_downgrade")
612
- @new_resource.allow_downgrade
627
+ if new_resource.respond_to?("allow_downgrade")
628
+ new_resource.allow_downgrade
613
629
  else
614
630
  false
615
631
  end
@@ -624,14 +640,16 @@ class Chef
624
640
  end
625
641
 
626
642
  def add_timeout_option(command_args)
643
+ # this is deprecated but its not quite done yet
644
+ #Chef.deprecated(:package_misc, "shell_out_with_timeout and add_timeout_option are deprecated methods, use shell_out_compact_timeout instead")
627
645
  args = command_args.dup
628
646
  if args.last.is_a?(Hash)
629
647
  options = args.pop.dup
630
648
  options[:timeout] = new_resource.timeout if new_resource.timeout
631
- options[:timeout] = 900 unless options.has_key?(:timeout)
649
+ options[:timeout] = 900 unless options.key?(:timeout)
632
650
  args << options
633
651
  else
634
- args << { :timeout => new_resource.timeout ? new_resource.timeout : 900 }
652
+ args << { timeout: new_resource.timeout ? new_resource.timeout : 900 }
635
653
  end
636
654
  args
637
655
  end
@@ -34,48 +34,45 @@ class Chef
34
34
  def define_resource_requirements
35
35
  super
36
36
  requirements.assert(:install) do |a|
37
- a.assertion { @new_resource.source }
38
- a.failure_message Chef::Exceptions::Package, "Source for package #{@new_resource.name} required for action install"
37
+ a.assertion { new_resource.source }
38
+ a.failure_message Chef::Exceptions::Package, "Source for package #{new_resource.name} required for action install"
39
39
  end
40
40
  requirements.assert(:all_actions) do |a|
41
- a.assertion { !@new_resource.source || @package_source_found }
42
- a.failure_message Chef::Exceptions::Package, "Package #{@new_resource.name} not found: #{@new_resource.source}"
43
- a.whyrun "would assume #{@new_resource.source} would be have previously been made available"
41
+ a.assertion { !new_resource.source || package_source_found? }
42
+ a.failure_message Chef::Exceptions::Package, "Package #{new_resource.name} not found: #{new_resource.source}"
43
+ a.whyrun "would assume #{new_resource.source} would be have previously been made available"
44
44
  end
45
45
  end
46
46
 
47
47
  def load_current_resource
48
- @current_resource = Chef::Resource::Package.new(@new_resource.name)
49
- @current_resource.package_name(@new_resource.package_name)
48
+ @current_resource = Chef::Resource::Package.new(new_resource.name)
49
+ current_resource.package_name(new_resource.package_name)
50
50
 
51
- if @new_resource.source
52
- @package_source_found = ::File.exists?(@new_resource.source)
53
- if @package_source_found
54
- Chef::Log.debug("#{@new_resource} checking pkg status")
55
- ret = shell_out_with_timeout("installp -L -d #{@new_resource.source}")
56
- ret.stdout.each_line do |line|
57
- case line
58
- when /:#{@new_resource.package_name}:/
59
- fields = line.split(":")
60
- @new_resource.version(fields[2])
61
- when /^#{@new_resource.package_name}:/
62
- Chef::Log.warn("You are installing a bff package by product name. For idempotent installs, please install individual filesets")
63
- fields = line.split(":")
64
- @new_resource.version(fields[2])
65
- end
51
+ if package_source_found?
52
+ Chef::Log.debug("#{new_resource} checking pkg status")
53
+ ret = shell_out_compact_timeout("installp", "-L", "-d", new_resource.source)
54
+ ret.stdout.each_line do |line|
55
+ case line
56
+ when /:#{new_resource.package_name}:/
57
+ fields = line.split(":")
58
+ new_resource.version(fields[2])
59
+ when /^#{new_resource.package_name}:/
60
+ Chef::Log.warn("You are installing a bff package by product name. For idempotent installs, please install individual filesets")
61
+ fields = line.split(":")
62
+ new_resource.version(fields[2])
66
63
  end
67
- raise Chef::Exceptions::Package, "package source #{@new_resource.source} does not provide package #{@new_resource.package_name}" unless @new_resource.version
68
64
  end
65
+ raise Chef::Exceptions::Package, "package source #{new_resource.source} does not provide package #{new_resource.package_name}" unless new_resource.version
69
66
  end
70
67
 
71
- Chef::Log.debug("#{@new_resource} checking install state")
72
- ret = shell_out_with_timeout("lslpp -lcq #{@current_resource.package_name}")
68
+ Chef::Log.debug("#{new_resource} checking install state")
69
+ ret = shell_out_compact_timeout("lslpp", "-lcq", current_resource.package_name)
73
70
  ret.stdout.each_line do |line|
74
71
  case line
75
- when /#{@current_resource.package_name}/
72
+ when /#{current_resource.package_name}/
76
73
  fields = line.split(":")
77
- Chef::Log.debug("#{@new_resource} version #{fields[2]} is already installed")
78
- @current_resource.version(fields[2])
74
+ Chef::Log.debug("#{new_resource} version #{fields[2]} is already installed")
75
+ current_resource.version(fields[2])
79
76
  end
80
77
  end
81
78
 
@@ -83,23 +80,25 @@ class Chef
83
80
  raise Chef::Exceptions::Package, "lslpp failed - #{ret.format_for_exception}!"
84
81
  end
85
82
 
86
- @current_resource
83
+ current_resource
87
84
  end
88
85
 
89
86
  def candidate_version
90
87
  return @candidate_version if @candidate_version
91
- ret = shell_out_with_timeout("installp -L -d #{@new_resource.source}")
92
- ret.stdout.each_line do |line|
93
- case line
94
- when /\w:#{Regexp.escape(@new_resource.package_name)}:(.*)/
95
- fields = line.split(":")
96
- @candidate_version = fields[2]
97
- @new_resource.version(fields[2])
98
- Chef::Log.debug("#{@new_resource} setting install candidate version to #{@candidate_version}")
88
+ if package_source_found?
89
+ ret = shell_out_compact_timeout("installp", "-L", "-d", new_resource.source)
90
+ ret.stdout.each_line do |line|
91
+ case line
92
+ when /\w:#{Regexp.escape(new_resource.package_name)}:(.*)/
93
+ fields = line.split(":")
94
+ @candidate_version = fields[2]
95
+ new_resource.version(fields[2])
96
+ Chef::Log.debug("#{new_resource} setting install candidate version to #{@candidate_version}")
97
+ end
98
+ end
99
+ unless ret.exitstatus == 0
100
+ raise Chef::Exceptions::Package, "installp -L -d #{new_resource.source} - #{ret.format_for_exception}!"
99
101
  end
100
- end
101
- unless ret.exitstatus == 0
102
- raise Chef::Exceptions::Package, "installp -L -d #{@new_resource.source} - #{ret.format_for_exception}!"
103
102
  end
104
103
  @candidate_version
105
104
  end
@@ -112,28 +111,32 @@ class Chef
112
111
  # So far, the code has been tested only with standalone packages.
113
112
  #
114
113
  def install_package(name, version)
115
- Chef::Log.debug("#{@new_resource} package install options: #{@new_resource.options}")
116
- if @new_resource.options.nil?
117
- shell_out_with_timeout!( "installp -aYF -d #{@new_resource.source} #{@new_resource.package_name}" )
118
- Chef::Log.debug("#{@new_resource} installed version #{@new_resource.version} from: #{@new_resource.source}")
114
+ Chef::Log.debug("#{new_resource} package install options: #{options}")
115
+ if options.nil?
116
+ shell_out_compact_timeout!("installp", "-aYF", "-d", new_resource.source, new_resource.package_name)
117
+ Chef::Log.debug("#{new_resource} installed version #{new_resource.version} from: #{new_resource.source}")
119
118
  else
120
- shell_out_with_timeout!( "installp -aYF #{expand_options(@new_resource.options)} -d #{@new_resource.source} #{@new_resource.package_name}" )
121
- Chef::Log.debug("#{@new_resource} installed version #{@new_resource.version} from: #{@new_resource.source}")
119
+ shell_out_compact_timeout!("installp", "-aYF", options, "-d", new_resource.source, new_resource.package_name)
120
+ Chef::Log.debug("#{new_resource} installed version #{new_resource.version} from: #{new_resource.source}")
122
121
  end
123
122
  end
124
123
 
125
- alias_method :upgrade_package, :install_package
124
+ alias upgrade_package install_package
126
125
 
127
126
  def remove_package(name, version)
128
- if @new_resource.options.nil?
129
- shell_out_with_timeout!( "installp -u #{name}" )
130
- Chef::Log.debug("#{@new_resource} removed version #{@new_resource.version}")
127
+ if options.nil?
128
+ shell_out_compact_timeout!("installp", "-u", name)
129
+ Chef::Log.debug("#{new_resource} removed version #{new_resource.version}")
131
130
  else
132
- shell_out_with_timeout!( "installp -u #{expand_options(@new_resource.options)} #{name}" )
133
- Chef::Log.debug("#{@new_resource} removed version #{@new_resource.version}")
131
+ shell_out_compact_timeout!("installp", "-u", options, name)
132
+ Chef::Log.debug("#{new_resource} removed version #{new_resource.version}")
134
133
  end
135
134
  end
136
135
 
136
+ def package_source_found?
137
+ @package_source_found ||= new_resource.source && ::File.exist?(new_resource.source)
138
+ end
139
+
137
140
  end
138
141
  end
139
142
  end
@@ -1,6 +1,6 @@
1
1
  #
2
2
  # Author:: Adam Jacob (<adam@chef.io>)
3
- # Copyright:: Copyright 2008-2016, Chef Software Inc.
3
+ # Copyright:: Copyright 2008-2017, Chef Software Inc.
4
4
  # License:: Apache License, Version 2.0
5
5
  #
6
6
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -72,21 +72,21 @@ class Chef
72
72
 
73
73
  def package_locked(name, version)
74
74
  islocked = false
75
- locked = shell_out_with_timeout!("apt-mark showhold")
75
+ locked = shell_out_compact_timeout!("apt-mark", "showhold")
76
76
  locked.stdout.each_line do |line|
77
77
  line_package = line.strip
78
78
  if line_package == name
79
79
  islocked = true
80
80
  end
81
81
  end
82
- return islocked
82
+ islocked
83
83
  end
84
84
 
85
85
  def install_package(name, version)
86
86
  package_name = name.zip(version).map do |n, v|
87
87
  package_data[n][:virtual] ? n : "#{n}=#{v}"
88
88
  end
89
- run_noninteractive("apt-get -q -y", default_release_options, new_resource.options, "install", package_name)
89
+ run_noninteractive("apt-get", "-q", "-y", default_release_options, options, "install", package_name)
90
90
  end
91
91
 
92
92
  def upgrade_package(name, version)
@@ -97,14 +97,14 @@ class Chef
97
97
  package_name = name.map do |n|
98
98
  package_data[n][:virtual] ? resolve_virtual_package_name(n) : n
99
99
  end
100
- run_noninteractive("apt-get -q -y", new_resource.options, "remove", package_name)
100
+ run_noninteractive("apt-get", "-q", "-y", options, "remove", package_name)
101
101
  end
102
102
 
103
103
  def purge_package(name, version)
104
104
  package_name = name.map do |n|
105
105
  package_data[n][:virtual] ? resolve_virtual_package_name(n) : n
106
106
  end
107
- run_noninteractive("apt-get -q -y", new_resource.options, "purge", package_name)
107
+ run_noninteractive("apt-get", "-q", "-y", options, "purge", package_name)
108
108
  end
109
109
 
110
110
  def preseed_package(preseed_file)
@@ -118,11 +118,11 @@ class Chef
118
118
  end
119
119
 
120
120
  def lock_package(name, version)
121
- run_noninteractive("apt-mark", new_resource.options, "hold", name)
121
+ run_noninteractive("apt-mark", options, "hold", name)
122
122
  end
123
123
 
124
124
  def unlock_package(name, version)
125
- run_noninteractive("apt-mark", new_resource.options, "unhold", name)
125
+ run_noninteractive("apt-mark", options, "unhold", name)
126
126
  end
127
127
 
128
128
  private
@@ -131,12 +131,14 @@ class Chef
131
131
  # interactive prompts. Command is run with default localization rather
132
132
  # than forcing locale to "C", so command output may not be stable.
133
133
  def run_noninteractive(*args)
134
- shell_out_with_timeout!(a_to_s(*args), :env => { "DEBIAN_FRONTEND" => "noninteractive" })
134
+ shell_out_compact_timeout!(*args, env: { "DEBIAN_FRONTEND" => "noninteractive" })
135
135
  end
136
136
 
137
137
  def default_release_options
138
138
  # Use apt::Default-Release option only if provider supports it
139
- "-o APT::Default-Release=#{new_resource.default_release}" if new_resource.respond_to?(:default_release) && new_resource.default_release
139
+ if new_resource.respond_to?(:default_release) && new_resource.default_release
140
+ [ "-o", "APT::Default-Release=#{new_resource.default_release}" ]
141
+ end
140
142
  end
141
143
 
142
144
  def resolve_package_versions(pkg)
@@ -156,7 +158,7 @@ class Chef
156
158
  end
157
159
 
158
160
  def resolve_virtual_package_name(pkg)
159
- showpkg = run_noninteractive("apt-cache showpkg", pkg).stdout
161
+ showpkg = run_noninteractive("apt-cache", "showpkg", pkg).stdout
160
162
  partitions = showpkg.rpartition(/Reverse Provides: ?#{$/}/)
161
163
  return nil if partitions[0] == "" && partitions[1] == "" # not found in output
162
164
  set = partitions[2].lines.each_with_object(Set.new) do |line, acc|
@@ -166,7 +168,7 @@ class Chef
166
168
  if set.size > 1
167
169
  raise Chef::Exceptions::Package, "#{new_resource.package_name} is a virtual package provided by multiple packages, you must explicitly select one"
168
170
  end
169
- return set.to_a.first
171
+ set.to_a.first
170
172
  end
171
173
 
172
174
  def package_data_for(pkg)
@@ -186,7 +188,7 @@ class Chef
186
188
  end
187
189
  end
188
190
 
189
- return {
191
+ {
190
192
  current_version: current_version,
191
193
  candidate_version: candidate_version,
192
194
  virtual: virtual,