В пользовательском ресурсе chef как указать, что пара ключ-значение является обязательной
При написании пользовательских ресурсов в chef мы определяем атрибуты, их тип, их значение по умолчанию и их обязательность для указания или нет, например,
attribute :plugin, kind_of: String, required: true
attribute :after_plugin, kind_of: String, required: false, :default => 'pam_unix.so'
Предположим, мне нужно взять атрибут, похожий на Hash
attribute :after, kind_of: Hash, required: false, :default => {:search_interface => nil, :search_control => nil, :search_plugin => nil}
Здесь я упомянул required: false
Это означает, что пользователь не обязан предоставлять хэш.
Мне нужно указать, что если дан хэш, то :search_interface
является обязательным
Как я могу этого достичь?
1 ответ
Решение
При определении атрибута (теперь называемого свойством) вы можете определить обратные вызовы, которые проверяют вводимые пользователем данные.
См. Пример https://github.com/chef/chef/blob/cb4ee84e418164e8d2e85147efad711a42ff2799/lib/chef/resource/chef_gem.rb#L28.
В вашем случае вы могли бы написать:
attribute :after, kind_of: Hash, required: false,
:default => {:search_interface => nil, :search_control => nil, :search_plugin => nil},
:callbacks => {
"Must contain search interface" => proc { |v|
v.has_key?(:search_interface)
}
}
}