В пользовательском ресурсе шеф-повара, как указать, что пара ключ-значение является обязательной

При написании пользовательских ресурсов в шеф-поваре мы определяем атрибуты, их тип, их значение по умолчанию и обязательность их указания или нет, например.

attribute :plugin,        kind_of: String, required: true
attribute :after_plugin,  kind_of: String, required: false, :default => 'pam_unix.so'

Предположим, мне нужно взять атрибут, который является хешем, например

attribute :after,    kind_of: Hash, required: false, :default => {:search_interface => nil, :search_control => nil, :search_plugin => nil}

Здесь я упомянул required: false, что означает, что пользователь не обязан предоставлять хэш.

Мне нужно указать, что если указан хэш, то :search_interface является обязательным

Как я могу этого добиться?


person Ivan    schedule 11.02.2016    source источник


Ответы (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)
    }
  }
}
person kamaradclimber    schedule 15.02.2016