diff options
author | Bryan McLellan <btm@loftninjas.org> | 2016-09-30 12:17:29 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2016-09-30 12:17:29 -0400 |
commit | f9a8e2c16f8073f7af6a4414f51d69f644ef97aa (patch) | |
tree | 9473f69d46b97e9e36b8067ed4d2e43ebd2cdec5 /lib | |
parent | e56ed315fb7a3cd07724985349f67bc6d7afc0a5 (diff) | |
parent | a53f31ceba2fc7ce51b6e5713dcb628c401f7ea9 (diff) | |
download | chef-f9a8e2c16f8073f7af6a4414f51d69f644ef97aa.tar.gz |
Merge pull request #5359 from MsysTechnologiesllc/ali/windows_registry_key_resource_delete_fix
Allow deletion of registry_key without the need for users to pass data key in values hash.
Diffstat (limited to 'lib')
-rw-r--r-- | lib/chef/exceptions.rb | 4 | ||||
-rw-r--r-- | lib/chef/provider/registry_key.rb | 28 | ||||
-rw-r--r-- | lib/chef/resource/registry_key.rb | 6 |
3 files changed, 33 insertions, 5 deletions
diff --git a/lib/chef/exceptions.rb b/lib/chef/exceptions.rb index a4d5ff60e2..ea779754e2 100644 --- a/lib/chef/exceptions.rb +++ b/lib/chef/exceptions.rb @@ -245,6 +245,10 @@ class Chef class Win32RegBadValueSize < ArgumentError; end class Win32RegTypesMismatch < ArgumentError; end + # incorrect input for registry_key create action throws following error + class RegKeyValuesTypeMissing < ArgumentError; end + class RegKeyValuesDataMissing < ArgumentError; end + class InvalidEnvironmentPath < ArgumentError; end class EnvironmentNotFound < RuntimeError; end diff --git a/lib/chef/provider/registry_key.rb b/lib/chef/provider/registry_key.rb index 5e8dbe9bd8..58b0a19586 100644 --- a/lib/chef/provider/registry_key.rb +++ b/lib/chef/provider/registry_key.rb @@ -70,27 +70,51 @@ class Chef end end + def key_missing?(values, name) + values.each do |v| + return true unless v.has_key?(name) + end + false + end + def define_resource_requirements requirements.assert(:create, :create_if_missing, :delete, :delete_key) do |a| a.assertion { registry.hive_exists?(@new_resource.key) } a.failure_message(Chef::Exceptions::Win32RegHiveMissing, "Hive #{@new_resource.key.split("\\").shift} does not exist") end + requirements.assert(:create) do |a| a.assertion { registry.key_exists?(@new_resource.key) } a.whyrun("Key #{@new_resource.key} does not exist. Unless it would have been created before, attempt to modify its values would fail.") end + requirements.assert(:create, :create_if_missing) do |a| - #If keys missing in the path and recursive == false + # If keys missing in the path and recursive == false a.assertion { !registry.keys_missing?(@current_resource.key) || @new_resource.recursive } a.failure_message(Chef::Exceptions::Win32RegNoRecursive, "Intermediate keys missing but recursive is set to false") a.whyrun("Intermediate keys in #{@new_resource.key} do not exist. Unless they would have been created earlier, attempt to modify them would fail.") end + requirements.assert(:delete_key) do |a| - #If key to be deleted has subkeys but recurssive == false + # If key to be deleted has subkeys but recurssive == false a.assertion { !registry.key_exists?(@new_resource.key) || !registry.has_subkeys?(@new_resource.key) || @new_resource.recursive } a.failure_message(Chef::Exceptions::Win32RegNoRecursive, "#{@new_resource.key} has subkeys but recursive is set to false.") a.whyrun("#{@current_resource.key} has subkeys, but recursive is set to false. attempt to delete would fails unless subkeys were deleted prior to this action.") end + + requirements.assert(:create, :create_if_missing) do |a| + # If type key missing in the RegistryKey values hash + a.assertion { !key_missing?(@new_resource.values, :type) } + a.failure_message(Chef::Exceptions::RegKeyValuesTypeMissing, "Missing type key in RegistryKey values hash") + a.whyrun("Type key does not exist. Attempt would fail unless the complete values hash containing all the keys does not exist for registry_key resource's create action.") + end + + requirements.assert(:create, :create_if_missing) do |a| + # If data key missing in the RegistryKey values hash + a.assertion { !key_missing?(@new_resource.values, :data) } + a.failure_message(Chef::Exceptions::RegKeyValuesDataMissing, "Missing data key in RegistryKey values hash") + a.whyrun("Data key does not exist. Attempt would fail unless the complete values hash containing all the keys does not exist for registry_key resource's create action.") + end end def action_create diff --git a/lib/chef/resource/registry_key.rb b/lib/chef/resource/registry_key.rb index d11f826c38..da09b9668b 100644 --- a/lib/chef/resource/registry_key.rb +++ b/lib/chef/resource/registry_key.rb @@ -87,13 +87,13 @@ class Chef @values.each do |v| raise ArgumentError, "Missing name key in RegistryKey values hash" unless v.has_key?(:name) - raise ArgumentError, "Missing type key in RegistryKey values hash" unless v.has_key?(:type) - raise ArgumentError, "Missing data key in RegistryKey values hash" unless v.has_key?(:data) v.each_key do |key| raise ArgumentError, "Bad key #{key} in RegistryKey values hash" unless [:name, :type, :data].include?(key) end raise ArgumentError, "Type of name => #{v[:name]} should be string" unless v[:name].is_a?(String) - raise ArgumentError, "Type of type => #{v[:type]} should be symbol" unless v[:type].is_a?(Symbol) + if v[:type] + raise ArgumentError, "Type of type => #{v[:type]} should be symbol" unless v[:type].is_a?(Symbol) + end end @unscrubbed_values = @values elsif self.instance_variable_defined?(:@values) |