chef 12.5.1 → 12.6.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +6 -1
- data/README.md +6 -4
- data/Rakefile +1 -4
- data/chef-windows.gemspec +21 -0
- data/chef.gemspec +58 -0
- data/lib/chef/api_client/registration.rb +9 -4
- data/lib/chef/application.rb +3 -84
- data/lib/chef/application/apply.rb +9 -2
- data/lib/chef/application/client.rb +8 -3
- data/lib/chef/application/solo.rb +7 -1
- data/lib/chef/application/windows_service.rb +21 -6
- data/lib/chef/application/windows_service_manager.rb +2 -3
- data/lib/chef/audit/runner.rb +1 -0
- data/lib/chef/chef_class.rb +1 -11
- data/lib/chef/chef_fs/chef_fs_data_store.rb +181 -2
- data/lib/chef/chef_fs/file_system/cookbook_subdir.rb +5 -0
- data/lib/chef/chef_fs/file_system/file_system_entry.rb +11 -7
- data/lib/chef/client.rb +28 -1
- data/lib/chef/cookbook/cookbook_collection.rb +14 -1
- data/lib/chef/cookbook/cookbook_version_loader.rb +1 -1
- data/lib/chef/cookbook/metadata.rb +115 -9
- data/lib/chef/cookbook/remote_file_vendor.rb +1 -1
- data/lib/chef/cookbook_version.rb +6 -2
- data/lib/chef/data_bag.rb +1 -1
- data/lib/chef/data_bag_item.rb +1 -1
- data/lib/chef/digester.rb +5 -1
- data/lib/chef/dsl/chef_provisioning.rb +57 -0
- data/lib/chef/dsl/cheffish.rb +64 -0
- data/lib/chef/dsl/declare_resource.rb +108 -0
- data/lib/chef/dsl/platform_introspection.rb +3 -3
- data/lib/chef/dsl/recipe.rb +3 -73
- data/lib/chef/dsl/resources.rb +27 -1
- data/lib/chef/event_dispatch/base.rb +3 -0
- data/lib/chef/event_dispatch/dispatcher.rb +5 -0
- data/lib/chef/event_dispatch/events_output_stream.rb +8 -0
- data/lib/chef/exceptions.rb +21 -1
- data/lib/chef/file_access_control/unix.rb +12 -12
- data/lib/chef/file_content_management/deploy/cp.rb +2 -2
- data/lib/chef/file_content_management/deploy/mv_unix.rb +4 -4
- data/lib/chef/file_content_management/deploy/mv_windows.rb +1 -1
- data/lib/chef/formatters/base.rb +7 -0
- data/lib/chef/formatters/error_inspectors/compile_error_inspector.rb +2 -2
- data/lib/chef/formatters/indentable_output_stream.rb +5 -0
- data/lib/chef/http.rb +19 -3
- data/lib/chef/http/decompressor.rb +2 -2
- data/lib/chef/json_compat.rb +1 -0
- data/lib/chef/knife.rb +16 -2
- data/lib/chef/knife/bootstrap.rb +55 -10
- data/lib/chef/knife/cookbook_site_install.rb +5 -1
- data/lib/chef/knife/core/bootstrap_context.rb +2 -1
- data/lib/chef/knife/core/node_presenter.rb +1 -1
- data/lib/chef/knife/ssh.rb +30 -16
- data/lib/chef/knife/ssl_check.rb +4 -2
- data/lib/chef/knife/ssl_fetch.rb +3 -2
- data/lib/chef/knife/status.rb +14 -1
- data/lib/chef/log.rb +14 -0
- data/lib/chef/mixin/get_source_from_package.rb +7 -2
- data/lib/chef/mixin/properties.rb +302 -0
- data/lib/chef/mixin/proxified_socket.rb +38 -0
- data/lib/chef/mixin/subclass_directive.rb +37 -0
- data/lib/chef/node.rb +13 -5
- data/lib/chef/platform/query_helpers.rb +14 -3
- data/lib/chef/platform/service_helpers.rb +20 -38
- data/lib/chef/policy_builder/expand_node_object.rb +3 -0
- data/lib/chef/policy_builder/policyfile.rb +1 -0
- data/lib/chef/property.rb +51 -12
- data/lib/chef/provider.rb +40 -35
- data/lib/chef/provider/deploy.rb +1 -1
- data/lib/chef/provider/dsc_resource.rb +54 -20
- data/lib/chef/provider/execute.rb +25 -4
- data/lib/chef/provider/group.rb +1 -1
- data/lib/chef/provider/lwrp_base.rb +1 -0
- data/lib/chef/provider/package.rb +76 -30
- data/lib/chef/provider/package/dpkg.rb +152 -69
- data/lib/chef/provider/package/openbsd.rb +6 -8
- data/lib/chef/provider/package/solaris.rb +2 -0
- data/lib/chef/provider/package/windows.rb +95 -14
- data/lib/chef/provider/package/windows/exe.rb +129 -0
- data/lib/chef/provider/package/windows/msi.rb +37 -13
- data/lib/chef/provider/package/windows/registry_uninstall_entry.rb +89 -0
- data/lib/chef/provider/package/yum.rb +13 -3
- data/lib/chef/provider/powershell_script.rb +3 -0
- data/lib/chef/provider/remote_file/cache_control_data.rb +37 -4
- data/lib/chef/provider/remote_file/http.rb +1 -1
- data/lib/chef/provider/script.rb +1 -0
- data/lib/chef/provider/service.rb +13 -10
- data/lib/chef/provider/service/solaris.rb +43 -17
- data/lib/chef/provider/service/upstart.rb +3 -3
- data/lib/chef/provider/user.rb +1 -1
- data/lib/chef/provider/user/dscl.rb +111 -100
- data/lib/chef/provider/user/windows.rb +5 -3
- data/lib/chef/recipe.rb +3 -5
- data/lib/chef/resource.rb +77 -320
- data/lib/chef/resource/action_class.rb +4 -0
- data/lib/chef/resource/dpkg_package.rb +4 -3
- data/lib/chef/resource/dsc_resource.rb +40 -2
- data/lib/chef/resource/execute.rb +9 -1
- data/lib/chef/resource/ksh.rb +32 -0
- data/lib/chef/resource/lwrp_base.rb +6 -10
- data/lib/chef/resource/package.rb +8 -9
- data/lib/chef/resource/registry_key.rb +1 -1
- data/lib/chef/resource/resource_notification.rb +14 -1
- data/lib/chef/resource/script.rb +1 -1
- data/lib/chef/resource/windows_package.rb +1 -1
- data/lib/chef/resource_builder.rb +14 -7
- data/lib/chef/resource_reporter.rb +6 -0
- data/lib/chef/resources.rb +1 -7
- data/lib/chef/rest.rb +1 -1
- data/lib/chef/run_context.rb +45 -2
- data/lib/chef/run_list/run_list_expansion.rb +47 -0
- data/lib/chef/runner.rb +25 -0
- data/lib/chef/search/query.rb +16 -2
- data/lib/chef/util/diff.rb +2 -2
- data/lib/chef/util/powershell/ps_credential.rb +2 -3
- data/lib/chef/version.rb +1 -1
- data/lib/chef/win32/api/file.rb +51 -1
- data/lib/chef/win32/file.rb +5 -0
- data/lib/chef/win32/file/version_info.rb +93 -0
- data/lib/chef/win32/mutex.rb +1 -1
- data/spec/data/apt/chef-integration-test2-1.0/debian/changelog +5 -0
- data/spec/data/apt/chef-integration-test2-1.0/debian/chef-integration-test2.debhelper.log +45 -0
- data/spec/data/apt/chef-integration-test2-1.0/debian/chef-integration-test2.substvars +1 -0
- data/spec/data/apt/chef-integration-test2-1.0/debian/chef-integration-test2/DEBIAN/conffiles +1 -0
- data/spec/data/apt/chef-integration-test2-1.0/debian/chef-integration-test2/DEBIAN/control +10 -0
- data/spec/data/apt/chef-integration-test2-1.0/debian/chef-integration-test2/DEBIAN/md5sums +1 -0
- data/spec/data/apt/chef-integration-test2-1.0/debian/compat +1 -0
- data/spec/data/apt/chef-integration-test2-1.0/debian/conffiles +1 -0
- data/spec/data/apt/chef-integration-test2-1.0/debian/control +13 -0
- data/spec/data/apt/chef-integration-test2-1.0/debian/copyright +34 -0
- data/spec/data/apt/chef-integration-test2-1.0/debian/files +1 -0
- data/spec/data/apt/chef-integration-test2-1.0/debian/rules +13 -0
- data/spec/data/apt/chef-integration-test2-1.0/debian/source/format +1 -0
- data/spec/data/apt/chef-integration-test2_1.0-1.debian.tar.gz +0 -0
- data/spec/data/apt/chef-integration-test2_1.0-1.dsc +18 -0
- data/spec/data/apt/chef-integration-test2_1.0-1_amd64.build +91 -0
- data/spec/data/apt/chef-integration-test2_1.0-1_amd64.changes +31 -0
- data/spec/data/apt/chef-integration-test2_1.0-1_amd64.deb +0 -0
- data/spec/data/apt/chef-integration-test2_1.0.orig.tar.gz +0 -0
- data/spec/functional/application_spec.rb +1 -1
- data/spec/functional/audit/runner_spec.rb +4 -0
- data/spec/functional/knife/ssh_spec.rb +5 -5
- data/spec/functional/notifications_spec.rb +74 -4
- data/spec/functional/resource/aix_service_spec.rb +2 -2
- data/spec/functional/resource/dpkg_package_spec.rb +339 -0
- data/spec/functional/resource/ifconfig_spec.rb +3 -1
- data/spec/functional/resource/mount_spec.rb +5 -2
- data/spec/functional/resource/package_spec.rb +1 -1
- data/spec/functional/resource/user/windows_spec.rb +8 -0
- data/spec/functional/resource/windows_package_spec.rb +177 -0
- data/spec/functional/win32/version_info_spec.rb +50 -0
- data/spec/integration/client/client_spec.rb +80 -0
- data/spec/integration/knife/download_spec.rb +9 -0
- data/spec/integration/knife/upload_spec.rb +28 -1
- data/spec/integration/recipes/lwrp_inline_resources_spec.rb +93 -23
- data/spec/integration/recipes/resource_action_spec.rb +211 -116
- data/spec/integration/recipes/resource_converge_if_changed_spec.rb +72 -0
- data/spec/integration/solo/solo_spec.rb +34 -0
- data/spec/spec_helper.rb +11 -1
- data/spec/support/platform_helpers.rb +8 -0
- data/spec/support/shared/integration/integration_helper.rb +6 -0
- data/spec/support/shared/unit/execute_resource.rb +5 -0
- data/spec/support/shared/unit/platform_introspector.rb +7 -0
- data/spec/tiny_server.rb +6 -2
- data/spec/unit/api_client/registration_spec.rb +5 -4
- data/spec/unit/application_spec.rb +1 -181
- data/spec/unit/chef_fs/file_system/cookbook_subdir_spec.rb +34 -0
- data/spec/unit/cookbook/metadata_spec.rb +122 -2
- data/spec/unit/http_spec.rb +102 -0
- data/spec/unit/knife/bootstrap_spec.rb +55 -13
- data/spec/unit/knife/core/bootstrap_context_spec.rb +10 -3
- data/spec/unit/knife/ssl_check_spec.rb +7 -3
- data/spec/unit/knife/ssl_fetch_spec.rb +2 -2
- data/spec/unit/knife/status_spec.rb +13 -13
- data/spec/unit/knife_spec.rb +26 -2
- data/spec/unit/lwrp_spec.rb +1 -1
- data/spec/unit/mixin/properties_spec.rb +97 -0
- data/spec/unit/mixin/proxified_socket_spec.rb +94 -0
- data/spec/unit/mixin/subclass_directive_spec.rb +45 -0
- data/spec/unit/node_spec.rb +9 -1
- data/spec/unit/policy_builder/policyfile_spec.rb +2 -0
- data/spec/unit/property/validation_spec.rb +14 -12
- data/spec/unit/property_spec.rb +56 -0
- data/spec/unit/provider/deploy_spec.rb +1 -1
- data/spec/unit/provider/dsc_resource_spec.rb +63 -24
- data/spec/unit/provider/execute_spec.rb +95 -28
- data/spec/unit/provider/package/dpkg_spec.rb +185 -96
- data/spec/unit/provider/package/windows/exe_spec.rb +251 -0
- data/spec/unit/provider/package/windows/msi_spec.rb +94 -10
- data/spec/unit/provider/package/windows_spec.rb +227 -26
- data/spec/unit/provider/package/yum_spec.rb +6 -0
- data/spec/unit/provider/package_spec.rb +495 -366
- data/spec/unit/provider/remote_file/cache_control_data_spec.rb +62 -36
- data/spec/unit/provider/script_spec.rb +2 -2
- data/spec/unit/provider/service/solaris_smf_service_spec.rb +110 -39
- data/spec/unit/provider/service/upstart_service_spec.rb +19 -0
- data/spec/unit/provider/user/dscl_spec.rb +14 -0
- data/spec/unit/provider/user/windows_spec.rb +2 -2
- data/spec/unit/provider/user_spec.rb +9 -0
- data/spec/unit/provider_resolver_spec.rb +6 -30
- data/spec/unit/recipe_spec.rb +46 -20
- data/spec/unit/resource/chef_gem_spec.rb +1 -1
- data/spec/unit/resource/dsc_resource_spec.rb +14 -3
- data/spec/unit/resource/ksh_spec.rb +40 -0
- data/spec/unit/resource/registry_key_spec.rb +2 -2
- data/spec/unit/resource/resource_notification_spec.rb +44 -45
- data/spec/unit/resource_reporter_spec.rb +7 -0
- data/spec/unit/resource_spec.rb +268 -253
- data/spec/unit/rest_spec.rb +2 -2
- data/spec/unit/run_list/run_list_expansion_spec.rb +18 -3
- data/spec/unit/search/query_spec.rb +19 -1
- data/spec/unit/util/powershell/ps_credential_spec.rb +8 -1
- data/spec/unit/windows_service_spec.rb +83 -38
- data/tasks/external_tests.rb +19 -9
- data/tasks/rspec.rb +1 -1
- metadata +64 -15
- data/spec/support/pedant/Gemfile +0 -3
- data/spec/support/pedant/pedant_config.rb +0 -129
- data/spec/support/pedant/run_pedant.rb +0 -63
- data/spec/support/pedant/stickywicket.pem +0 -27
- data/spec/unit/provider/package_spec.rbe +0 -0
data/lib/chef/provider/deploy.rb
CHANGED
@@ -276,7 +276,7 @@ class Chef
|
|
276
276
|
|
277
277
|
def enforce_ownership
|
278
278
|
converge_by("force ownership of #{@new_resource.deploy_to} to #{@new_resource.group}:#{@new_resource.user}") do
|
279
|
-
FileUtils.chown_R(@new_resource.user, @new_resource.group, @new_resource.deploy_to)
|
279
|
+
FileUtils.chown_R(@new_resource.user, @new_resource.group, @new_resource.deploy_to, :force => true)
|
280
280
|
Chef::Log.info("#{@new_resource} set user to #{@new_resource.user}") if @new_resource.user
|
281
281
|
Chef::Log.info("#{@new_resource} set group to #{@new_resource.group}") if @new_resource.group
|
282
282
|
end
|
@@ -15,7 +15,6 @@
|
|
15
15
|
# See the License for the specific language governing permissions and
|
16
16
|
# limitations under the License.
|
17
17
|
#
|
18
|
-
|
19
18
|
require 'chef/util/powershell/cmdlet'
|
20
19
|
require 'chef/util/dsc/local_configuration_manager'
|
21
20
|
require 'chef/mixin/powershell_type_coercions'
|
@@ -25,19 +24,19 @@ class Chef
|
|
25
24
|
class Provider
|
26
25
|
class DscResource < Chef::Provider
|
27
26
|
include Chef::Mixin::PowershellTypeCoercions
|
28
|
-
|
29
27
|
provides :dsc_resource, os: "windows"
|
30
|
-
|
31
28
|
def initialize(new_resource, run_context)
|
32
29
|
super
|
33
30
|
@new_resource = new_resource
|
34
31
|
@module_name = new_resource.module_name
|
32
|
+
@reboot_resource = nil
|
35
33
|
end
|
36
34
|
|
37
35
|
def action_run
|
38
36
|
if ! test_resource
|
39
37
|
converge_by(generate_description) do
|
40
38
|
result = set_resource
|
39
|
+
reboot_if_required
|
41
40
|
end
|
42
41
|
end
|
43
42
|
end
|
@@ -59,8 +58,9 @@ class Chef
|
|
59
58
|
a.block_action!
|
60
59
|
end
|
61
60
|
requirements.assert(:run) do |a|
|
62
|
-
a.assertion { dsc_refresh_mode_disabled? }
|
63
|
-
err = ["The LCM must have its RefreshMode set to Disabled
|
61
|
+
a.assertion { supports_refresh_mode_enabled? || dsc_refresh_mode_disabled? }
|
62
|
+
err = ["The LCM must have its RefreshMode set to Disabled for" \
|
63
|
+
" PowerShell versions before 5.0.10586.0."]
|
64
64
|
a.failure_message Chef::Exceptions::ProviderNotFound, err.join(' ')
|
65
65
|
a.whyrun err + ["Assuming a previous resource sets the RefreshMode."]
|
66
66
|
a.block_action!
|
@@ -83,11 +83,15 @@ class Chef
|
|
83
83
|
def supports_dsc_invoke_resource?
|
84
84
|
run_context && Chef::Platform.supports_dsc_invoke_resource?(node)
|
85
85
|
end
|
86
|
-
|
86
|
+
|
87
87
|
def dsc_refresh_mode_disabled?
|
88
88
|
Chef::Platform.dsc_refresh_mode_disabled?(node)
|
89
89
|
end
|
90
90
|
|
91
|
+
def supports_refresh_mode_enabled?
|
92
|
+
Chef::Platform.supports_refresh_mode_enabled?(node)
|
93
|
+
end
|
94
|
+
|
91
95
|
def generate_description
|
92
96
|
@converge_description
|
93
97
|
end
|
@@ -99,7 +103,6 @@ class Chef
|
|
99
103
|
def module_name
|
100
104
|
@module_name ||= begin
|
101
105
|
found = resource_store.find(dsc_resource_name)
|
102
|
-
|
103
106
|
r = case found.length
|
104
107
|
when 0
|
105
108
|
raise Chef::Exceptions::ResourceNotFound,
|
@@ -119,22 +122,23 @@ class Chef
|
|
119
122
|
|
120
123
|
def test_resource
|
121
124
|
result = invoke_resource(:test)
|
122
|
-
|
123
|
-
# however Invoke-DscResource is not correctly writing to that
|
124
|
-
# stream and instead just dumping to stdout
|
125
|
-
@converge_description = result.stdout
|
125
|
+
@converge_description = result.stream(:verbose)
|
126
126
|
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
result.return_value["InDesiredState"]
|
127
|
+
# We really want this information from the verbose stream,
|
128
|
+
# however in some versions of WMF, Invoke-DscResource is not correctly
|
129
|
+
# writing to that stream and instead just dumping to stdout
|
130
|
+
if @converge_description.empty?
|
131
|
+
@converge_description = result.stdout
|
133
132
|
end
|
133
|
+
|
134
|
+
return_dsc_resource_result(result, "InDesiredState")
|
134
135
|
end
|
135
136
|
|
136
137
|
def set_resource
|
137
138
|
result = invoke_resource(:set)
|
139
|
+
if return_dsc_resource_result(result, 'RebootRequired')
|
140
|
+
create_reboot_resource
|
141
|
+
end
|
138
142
|
result.return_value
|
139
143
|
end
|
140
144
|
|
@@ -142,19 +146,49 @@ class Chef
|
|
142
146
|
properties = translate_type(@new_resource.properties)
|
143
147
|
switches = "-Method #{method.to_s} -Name #{@new_resource.resource}"\
|
144
148
|
" -Property #{properties} -Verbose"
|
145
|
-
|
146
149
|
if module_name != :none
|
147
150
|
switches += " -Module #{module_name}"
|
148
151
|
end
|
149
|
-
|
150
152
|
cmdlet = Chef::Util::Powershell::Cmdlet.new(
|
151
153
|
node,
|
152
154
|
"Invoke-DscResource #{switches}",
|
153
155
|
output_format
|
154
156
|
)
|
155
|
-
cmdlet.run!
|
157
|
+
cmdlet.run!({}, {:timeout => new_resource.timeout})
|
156
158
|
end
|
157
159
|
|
160
|
+
def return_dsc_resource_result(result, property_name)
|
161
|
+
if result.return_value.is_a?(Array)
|
162
|
+
# WMF Feb 2015 Preview
|
163
|
+
result.return_value[0][property_name]
|
164
|
+
else
|
165
|
+
# WMF April 2015 Preview
|
166
|
+
result.return_value[property_name]
|
167
|
+
end
|
168
|
+
end
|
169
|
+
|
170
|
+
def create_reboot_resource
|
171
|
+
@reboot_resource = Chef::Resource::Reboot.new(
|
172
|
+
"Reboot for #{@new_resource.name}",
|
173
|
+
run_context
|
174
|
+
).tap do |r|
|
175
|
+
r.reason("Reboot for #{@new_resource.resource}.")
|
176
|
+
end
|
177
|
+
end
|
178
|
+
|
179
|
+
def reboot_if_required
|
180
|
+
reboot_action = @new_resource.reboot_action
|
181
|
+
unless @reboot_resource.nil?
|
182
|
+
case reboot_action
|
183
|
+
when :nothing
|
184
|
+
Chef::Log.debug("A reboot was requested by the DSC resource, but reboot_action is :nothing.")
|
185
|
+
Chef::Log.debug("This dsc_resource will not reboot the node.")
|
186
|
+
else
|
187
|
+
Chef::Log.debug("Requesting node reboot with #{reboot_action}.")
|
188
|
+
@reboot_resource.run_action(reboot_action)
|
189
|
+
end
|
190
|
+
end
|
191
|
+
end
|
158
192
|
end
|
159
193
|
end
|
160
194
|
end
|
@@ -41,7 +41,7 @@ class Chef
|
|
41
41
|
def define_resource_requirements
|
42
42
|
# @todo: this should change to raise in some appropriate major version bump.
|
43
43
|
if creates && creates_relative? && !cwd
|
44
|
-
Chef::Log.warn "Providing a relative path for the creates attribute without the cwd is deprecated and will be changed to fail (CHEF-3819)"
|
44
|
+
Chef::Log.warn "Providing a relative path for the creates attribute without the cwd is deprecated and will be changed to fail in the future (CHEF-3819)"
|
45
45
|
end
|
46
46
|
end
|
47
47
|
|
@@ -58,7 +58,16 @@ class Chef
|
|
58
58
|
end
|
59
59
|
|
60
60
|
converge_by("execute #{description}") do
|
61
|
-
|
61
|
+
begin
|
62
|
+
shell_out!(command, opts)
|
63
|
+
rescue Mixlib::ShellOut::ShellCommandFailed
|
64
|
+
if sensitive?
|
65
|
+
raise Mixlib::ShellOut::ShellCommandFailed,
|
66
|
+
"Command execution failed. STDOUT/STDERR suppressed for sensitive resource"
|
67
|
+
else
|
68
|
+
raise
|
69
|
+
end
|
70
|
+
end
|
62
71
|
Chef::Log.info("#{new_resource} ran successfully")
|
63
72
|
end
|
64
73
|
end
|
@@ -69,6 +78,14 @@ class Chef
|
|
69
78
|
!!new_resource.sensitive
|
70
79
|
end
|
71
80
|
|
81
|
+
def live_stream?
|
82
|
+
Chef::Config[:stream_execute_output] || !!new_resource.live_stream
|
83
|
+
end
|
84
|
+
|
85
|
+
def stream_to_stdout?
|
86
|
+
STDOUT.tty? && !Chef::Config[:daemon]
|
87
|
+
end
|
88
|
+
|
72
89
|
def opts
|
73
90
|
opts = {}
|
74
91
|
opts[:timeout] = timeout
|
@@ -80,8 +97,12 @@ class Chef
|
|
80
97
|
opts[:umask] = umask if umask
|
81
98
|
opts[:log_level] = :info
|
82
99
|
opts[:log_tag] = new_resource.to_s
|
83
|
-
if
|
84
|
-
|
100
|
+
if (Chef::Log.info? || live_stream?) && !sensitive?
|
101
|
+
if run_context.events.formatter?
|
102
|
+
opts[:live_stream] = Chef::EventDispatch::EventsOutputStream.new(run_context.events, :name => :execute)
|
103
|
+
elsif stream_to_stdout?
|
104
|
+
opts[:live_stream] = STDOUT
|
105
|
+
end
|
85
106
|
end
|
86
107
|
opts
|
87
108
|
end
|
data/lib/chef/provider/group.rb
CHANGED
@@ -125,7 +125,7 @@ class Chef
|
|
125
125
|
def action_create
|
126
126
|
case @group_exists
|
127
127
|
when false
|
128
|
-
converge_by("create #{@new_resource.group_name}") do
|
128
|
+
converge_by("create group #{@new_resource.group_name}") do
|
129
129
|
create_group
|
130
130
|
Chef::Log.info("#{@new_resource} created")
|
131
131
|
end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
#
|
2
2
|
# Author:: Adam Jacob (<adam@opscode.com>)
|
3
|
-
# Copyright:: Copyright (c) 2008
|
3
|
+
# Copyright:: Copyright (c) 2008-2015 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");
|
@@ -18,6 +18,7 @@
|
|
18
18
|
|
19
19
|
require 'chef/mixin/shell_out'
|
20
20
|
require 'chef/mixin/command'
|
21
|
+
require 'chef/mixin/subclass_directive'
|
21
22
|
require 'chef/log'
|
22
23
|
require 'chef/file_cache'
|
23
24
|
require 'chef/platform'
|
@@ -27,6 +28,12 @@ class Chef
|
|
27
28
|
class Package < Chef::Provider
|
28
29
|
include Chef::Mixin::Command
|
29
30
|
include Chef::Mixin::ShellOut
|
31
|
+
extend Chef::Mixin::SubclassDirective
|
32
|
+
|
33
|
+
# subclasses declare this if they want all their arguments as arrays of packages and names
|
34
|
+
subclass_directive :use_multipackage_api
|
35
|
+
# subclasses declare this if they want sources (filenames) pulled from their package names
|
36
|
+
subclass_directive :use_package_name_for_source
|
30
37
|
|
31
38
|
#
|
32
39
|
# Hook that subclasses use to populate the candidate_version(s)
|
@@ -44,6 +51,8 @@ class Chef
|
|
44
51
|
end
|
45
52
|
|
46
53
|
def check_resource_semantics!
|
54
|
+
# FIXME: this is not universally true and subclasses are needing to override this and no-ops it. It should be turned into
|
55
|
+
# another "subclass_directive" and the apt and yum providers should declare that they need this behavior.
|
47
56
|
if new_resource.package_name.is_a?(Array) && new_resource.source != nil
|
48
57
|
raise Chef::Exceptions::InvalidResourceSpecification, "You may not specify both multipackage and source"
|
49
58
|
end
|
@@ -86,11 +95,10 @@ class Chef
|
|
86
95
|
end
|
87
96
|
end
|
88
97
|
|
89
|
-
# XXX: mutating the new resource is generally bad
|
90
|
-
@new_resource.version(versions_for_new_resource)
|
91
|
-
|
92
98
|
converge_by(install_description) do
|
93
|
-
|
99
|
+
multipackage_api_adapter(package_names_for_targets, versions_for_targets) do |name, version|
|
100
|
+
install_package(name, version)
|
101
|
+
end
|
94
102
|
Chef::Log.info("#{@new_resource} installed #{package_names_for_targets} at #{versions_for_targets}")
|
95
103
|
end
|
96
104
|
end
|
@@ -113,11 +121,10 @@ class Chef
|
|
113
121
|
return
|
114
122
|
end
|
115
123
|
|
116
|
-
# XXX: mutating the new resource is generally bad
|
117
|
-
@new_resource.version(versions_for_new_resource)
|
118
|
-
|
119
124
|
converge_by(upgrade_description) do
|
120
|
-
|
125
|
+
multipackage_api_adapter(package_names_for_targets, versions_for_targets) do |name, version|
|
126
|
+
upgrade_package(name, version)
|
127
|
+
end
|
121
128
|
log_allow_downgrade = allow_downgrade ? '(allow_downgrade)' : ''
|
122
129
|
Chef::Log.info("#{@new_resource} upgraded#{log_allow_downgrade} #{package_names_for_targets} to #{versions_for_targets}")
|
123
130
|
end
|
@@ -138,12 +145,13 @@ class Chef
|
|
138
145
|
|
139
146
|
private :upgrade_description
|
140
147
|
|
141
|
-
# @todo: ability to remove an array of packages
|
142
148
|
def action_remove
|
143
149
|
if removing_package?
|
144
150
|
description = @new_resource.version ? "version #{@new_resource.version} of " : ""
|
145
151
|
converge_by("remove #{description}package #{@current_resource.package_name}") do
|
146
|
-
|
152
|
+
multipackage_api_adapter(@current_resource.package_name, @new_resource.version) do |name, version|
|
153
|
+
remove_package(name, version)
|
154
|
+
end
|
147
155
|
Chef::Log.info("#{@new_resource} removed")
|
148
156
|
end
|
149
157
|
else
|
@@ -172,18 +180,18 @@ class Chef
|
|
172
180
|
end
|
173
181
|
end
|
174
182
|
|
175
|
-
# @todo: ability to purge an array of packages
|
176
183
|
def action_purge
|
177
184
|
if removing_package?
|
178
185
|
description = @new_resource.version ? "version #{@new_resource.version} of" : ""
|
179
186
|
converge_by("purge #{description} package #{@current_resource.package_name}") do
|
180
|
-
|
187
|
+
multipackage_api_adapter(@current_resource.package_name, @new_resource.version) do |name, version|
|
188
|
+
purge_package(name, version)
|
189
|
+
end
|
181
190
|
Chef::Log.info("#{@new_resource} purged")
|
182
191
|
end
|
183
192
|
end
|
184
193
|
end
|
185
194
|
|
186
|
-
# @todo: ability to reconfigure an array of packages
|
187
195
|
def action_reconfig
|
188
196
|
if @current_resource.version == nil then
|
189
197
|
Chef::Log.debug("#{@new_resource} is NOT installed - nothing to do")
|
@@ -198,7 +206,10 @@ class Chef
|
|
198
206
|
if preseed_file = get_preseed_file(@new_resource.package_name, @current_resource.version)
|
199
207
|
converge_by("reconfigure package #{@new_resource.package_name}") do
|
200
208
|
preseed_package(preseed_file)
|
201
|
-
|
209
|
+
multipackage_api_adapter(@new_resource.package_name, @current_resource.version) do |name, version|
|
210
|
+
reconfig_package(name, version)
|
211
|
+
|
212
|
+
end
|
202
213
|
Chef::Log.info("#{@new_resource} reconfigured")
|
203
214
|
end
|
204
215
|
else
|
@@ -207,6 +218,15 @@ class Chef
|
|
207
218
|
end
|
208
219
|
|
209
220
|
# @todo use composition rather than inheritance
|
221
|
+
|
222
|
+
def multipackage_api_adapter(name, version)
|
223
|
+
if use_multipackage_api?
|
224
|
+
yield [name].flatten, [version].flatten
|
225
|
+
else
|
226
|
+
yield name, version
|
227
|
+
end
|
228
|
+
end
|
229
|
+
|
210
230
|
def install_package(name, version)
|
211
231
|
raise Chef::Exceptions::UnsupportedAction, "#{self.to_s} does not support :install"
|
212
232
|
end
|
@@ -231,7 +251,7 @@ class Chef
|
|
231
251
|
raise( Chef::Exceptions::UnsupportedAction, "#{self.to_s} does not support :reconfig" )
|
232
252
|
end
|
233
253
|
|
234
|
-
#
|
254
|
+
# used by subclasses. deprecated. use #a_to_s instead.
|
235
255
|
def expand_options(options)
|
236
256
|
options ? " #{options}" : ""
|
237
257
|
end
|
@@ -322,18 +342,6 @@ class Chef
|
|
322
342
|
multipackage? ? versions_for_targets : versions_for_targets[0]
|
323
343
|
end
|
324
344
|
|
325
|
-
# We need to mutate @new_resource.version() for some reason and this is a helper so that we inject the right
|
326
|
-
# class (String or Array) into that attribute based on if we're handling an array of package names or not.
|
327
|
-
#
|
328
|
-
# @return [String, Array<String>] target_versions coerced into the correct type for back-compat
|
329
|
-
def versions_for_new_resource
|
330
|
-
if multipackage?
|
331
|
-
target_version_array
|
332
|
-
else
|
333
|
-
target_version_array[0]
|
334
|
-
end
|
335
|
-
end
|
336
|
-
|
337
345
|
# Return an array indexed the same as *_version_array which contains either the target version to install/upgrade to
|
338
346
|
# or else nil if the package is not being modified.
|
339
347
|
#
|
@@ -473,6 +481,37 @@ class Chef
|
|
473
481
|
[ new_resource.version ].flatten.map { |v| v.to_s.empty? ? nil : v }
|
474
482
|
end
|
475
483
|
|
484
|
+
# TIP: less error prone to simply always call resolved_source_array, even if you
|
485
|
+
# don't think that you need to.
|
486
|
+
#
|
487
|
+
# @return [Array] new_resource.source as an array
|
488
|
+
def source_array
|
489
|
+
if new_resource.source.nil?
|
490
|
+
package_name_array.map { nil }
|
491
|
+
else
|
492
|
+
[ new_resource.source ].flatten
|
493
|
+
end
|
494
|
+
end
|
495
|
+
|
496
|
+
# Helper to handle use_package_name_for_source to convert names into local packages to install.
|
497
|
+
#
|
498
|
+
# @return [Array] Array of sources with package_names converted to sources
|
499
|
+
def resolved_source_array
|
500
|
+
@resolved_source_array ||=
|
501
|
+
begin
|
502
|
+
source_array.each_with_index.map do |source, i|
|
503
|
+
package_name = package_name_array[i]
|
504
|
+
# we require at least one '/' in the package_name to avoid [XXX_]package 'foo' breaking due to a random 'foo' file in cwd
|
505
|
+
if use_package_name_for_source? && source.nil? && package_name.match(/#{::File::SEPARATOR}/) && ::File.exist?(package_name)
|
506
|
+
Chef::Log.debug("No package source specified, but #{package_name} exists on filesystem, using #{package_name} as source.")
|
507
|
+
package_name
|
508
|
+
else
|
509
|
+
source
|
510
|
+
end
|
511
|
+
end
|
512
|
+
end
|
513
|
+
end
|
514
|
+
|
476
515
|
# @todo: extract apt/dpkg specific preseeding to a helper class
|
477
516
|
def template_available?(path)
|
478
517
|
run_context.has_template_in_cookbook?(new_resource.cookbook_name, path)
|
@@ -491,8 +530,6 @@ class Chef
|
|
491
530
|
end
|
492
531
|
end
|
493
532
|
|
494
|
-
private
|
495
|
-
|
496
533
|
def shell_out_with_timeout(*command_args)
|
497
534
|
shell_out(*add_timeout_option(command_args))
|
498
535
|
end
|
@@ -514,6 +551,15 @@ class Chef
|
|
514
551
|
args
|
515
552
|
end
|
516
553
|
|
554
|
+
# Helper for sublcasses to convert an array of string args into a string. It
|
555
|
+
# will compact nil or empty strings in the array and will join the array elements
|
556
|
+
# with spaces, without introducing any double spaces for nil/empty elements.
|
557
|
+
#
|
558
|
+
# @param args [String] variable number of string arguments
|
559
|
+
# @return [String] nicely concatenated string or empty string
|
560
|
+
def a_to_s(*args)
|
561
|
+
args.reject {|i| i.nil? || i == "" }.join(" ")
|
562
|
+
end
|
517
563
|
end
|
518
564
|
end
|
519
565
|
end
|