summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTim Smith <tsmith@chef.io>2021-09-16 12:58:39 -0700
committerGitHub <noreply@github.com>2021-09-16 12:58:39 -0700
commit03636b8734edd20a10231df9d74dc8e3f7a05fdf (patch)
tree929dee9115669e75718bb5c20e549db384399d17
parentecb2186f390f29756e5f82e7ec8c0149054951ba (diff)
parent9fd96e5a1aaff29a75e398d1f3a435891667b197 (diff)
downloadchef-03636b8734edd20a10231df9d74dc8e3f7a05fdf.tar.gz
Merge pull request #12018 from chef/registry-key-resource-value-property-via-dsl
registry_key: convert values to a real property
-rw-r--r--lib/chef/provider/registry_key.rb5
-rw-r--r--lib/chef/resource/registry_key.rb77
2 files changed, 35 insertions, 47 deletions
diff --git a/lib/chef/provider/registry_key.rb b/lib/chef/provider/registry_key.rb
index 5d723feb29..d6d46fecac 100644
--- a/lib/chef/provider/registry_key.rb
+++ b/lib/chef/provider/registry_key.rb
@@ -19,7 +19,7 @@
require_relative "../config"
require_relative "../log"
-require_relative "../resource/file"
+require_relative "../resource/registry_key"
require_relative "../mixin/checksum"
require_relative "../provider"
require "etc" unless defined?(Etc)
@@ -50,7 +50,8 @@ class Chef
current_resource.architecture(new_resource.architecture)
current_resource.recursive(new_resource.recursive)
if registry.key_exists?(new_resource.key)
- current_resource.values(registry.get_values(new_resource.key))
+ current_registry_values = registry.get_values(new_resource.key) || []
+ current_resource.values(current_registry_values)
end
values_to_hash(current_resource.unscrubbed_values)
current_resource
diff --git a/lib/chef/resource/registry_key.rb b/lib/chef/resource/registry_key.rb
index df10820fd8..a643ad3344 100644
--- a/lib/chef/resource/registry_key.rb
+++ b/lib/chef/resource/registry_key.rb
@@ -119,11 +119,39 @@ class Chef
Note: Be careful when using the :delete_key action with the recursive attribute. This will delete the registry key, all of its values and all of the names, types, and data associated with them. This cannot be undone by #{ChefUtils::Dist::Infra::PRODUCT}.
DOC
- state_attrs :values
-
default_action :create
allowed_actions :create, :create_if_missing, :delete, :delete_key
+ VALID_VALUE_HASH_KEYS = %i{name type data}.freeze
+
+ property :key, String, name_property: true
+ property :values, [Hash, Array],
+ default: [],
+ coerce: proc { |v|
+ @unscrubbed_values =
+ case v
+ when Hash
+ [ Mash.new(v).symbolize_keys ]
+ when Array
+ v.map { |value| Mash.new(value).symbolize_keys }
+ else
+ raise ArgumentError, "Bad type for RegistryKey resource, use Hash or Array"
+ end
+ scrub_values(@unscrubbed_values)
+ },
+ callbacks: {
+ "Missing name key in RegistryKey values hash" => lambda { |v| v.all? { |value| value.key?(:name) } },
+ "Bad key in RegistryKey values hash. Should be one of: #{VALID_VALUE_HASH_KEYS}" => lambda do |v|
+ v.all? do |value|
+ value.keys.all? { |key| VALID_VALUE_HASH_KEYS.include?(key) }
+ end
+ end,
+ "Type of name should be a string" => lambda { |v| v.all? { |value| value[:name].is_a?(String) } },
+ "Type of type should be a symbol" => lambda { |v| v.all? { |value| value[:type] ? value[:type].is_a?(Symbol) : true } },
+ }
+ property :recursive, [TrueClass, FalseClass], default: false
+ property :architecture, Symbol, default: :machine, equal_to: %i{machine x86_64 i386}
+
# Some registry key data types may not be safely reported as json.
# Example (CHEF-5323):
#
@@ -153,51 +181,10 @@ class Chef
# may want to extend the state_attrs API with the ability to rename POST'd attrs.
#
# See lib/chef/resource_reporter.rb for more information.
- attr_reader :unscrubbed_values
-
- def initialize(name, run_context = nil)
- super
- @values, @unscrubbed_values = [], []
- end
-
- property :key, String, name_property: true
-
- VALID_VALUE_HASH_KEYS = %i{name type data}.freeze
-
- def values(arg = nil)
- if not arg.nil?
- if arg.is_a?(Hash)
- @values = [ Mash.new(arg).symbolize_keys ]
- elsif arg.is_a?(Array)
- @values = []
- arg.each do |value|
- @values << Mash.new(value).symbolize_keys
- end
- else
- raise ArgumentError, "Bad type for RegistryKey resource, use Hash or Array"
- end
-
- @values.each do |v|
- raise ArgumentError, "Missing name key in RegistryKey values hash" unless v.key?(:name)
-
- v.each_key do |key|
- raise ArgumentError, "Bad key #{key} in RegistryKey values hash" unless VALID_VALUE_HASH_KEYS.include?(key)
- end
- raise ArgumentError, "Type of name => #{v[:name]} should be string" unless v[:name].is_a?(String)
-
- 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 instance_variable_defined?(:@values)
- scrub_values(@values)
- end
+ def unscrubbed_values
+ @unscrubbed_values ||= []
end
- property :recursive, [TrueClass, FalseClass], default: false
- property :architecture, Symbol, default: :machine, equal_to: %i{machine x86_64 i386}
-
private
def scrub_values(values)