2015-04-24 2 views
0

Я создал LWRP, используя chefdk и следуя документации и нескольким сообщениям в блоге.Требуется ли attr_accessor в определении ресурсов шеф-повара lwrp?

ресурс

actions :install 
default_action :install 

provides :foo 

attribute :name, :kind_of => String, :name_attribute => true 

поставщик

provides :foo 

def whyrun_supported? 
    true 
end 

use_inline_resources 

action :install do 
    converge_by("install: #{@new_resource}") do 
    execute "installation of: #{@new_resource.name}" do 
     command "foo install #{@new_resource.name}" 
    end 
    end 
end 

def load_current_resource 
    @current_resource = Chef::Resource::Foo.new @new_resource.name 
    @current_resource.name = @new_resource.name 
end 

При использовании этого LWRP в кулинарной книге, я хотел бы получить следующую ошибку:

undefined method `name=' for Chef::Resource::Foo 

Единственный путь я может исправить i t было добавлено attr_accessor :name к определению ресурса. Но я никогда не видел это как требование в любой документации. Из документации я предполагал, что Шеф позаботился о настройке attr_accessor по любым атрибутам во время компиляции ресурсов/поставщиков. Может ли кто-нибудь подтвердить, что я нашел или объяснить, что на самом деле происходит?

Спасибо.

ответ

1
def load_current_resource 
    @current_resource = Chef::Resource::Foo.new @new_resource.name 
    @current_resource.name = @new_resource.name 
end 

Ваша проблема здесь, name должен быть неизменным (для текущего и нового ресурса для соответствия), как это определить ресурс, вы не должны пытаться установить @current_resource.name.

Удалите эту строку, и она должна быть в порядке без аксессуаров.

+0

Я использовал http://dougireton.com/blog/2013/01/07/creating-an-lwrp-part-2/ в качестве руководства. Это сообщение в блоге показывает настройку «имя» с помощью метода «имя», а также другие атрибуты, заданные одинаково. Я просто предположил, что = будет работать. Этот шеф-повар использует метод method_missing для создания методов для attrs? Или это Ruby say = будет работать только с использованием «attr_accessor»? – glevine

+0

Извините, я могу только ответить за то, что знаю от шеф-повара, я не эксперт по рубину, но насколько я понял, атрибуты задаются с помощью методов (с подзаголовкой метода с именем set_or_return), чтобы позволить им использовать их в обоих направлениях (доступ и назначение). Вы можете посмотреть [код шеф-повара на github] (https://github.com/chef/chef/blob/master/lib/chef/resource/lwrp_base.rb#L75), если вы заинтересованные в шеф-поварах. – Tensibai

+1

После прочтения кода и выполнения нескольких тестов я могу подтвердить, что шеф-менеджер динамически создает сеттер/получатель для каждого атрибута, и эти методы следует вызывать для установки значений атрибутов в 'load_current_resource'. Я не уверен, что это говорит о том, что Chef считает идиоматическим кодом, но они не предписывают использовать читателей и писателей для атрибутов. – glevine

Смежные вопросы