2013-01-05 6 views
5

मैं हल्के संसाधन को परिभाषित करने में सक्षम होना चाहता हूं, मान लें कि उनमें से दो पैरामीटर हैं, उनमें से दो बुनियादी/प्राथमिक पैरामीटर हैं और तीसरा इन दोनों का संयोजन है। मैं तीसरे पैरामीटर के अनुकूलन की संभावना भी प्रदान करना चाहता हूं। उदाहरण के लिए:शेफ में एक गतिशील विशेषता डिफ़ॉल्ट को कार्यान्वित करने के लिए कैसे करें LWRP परिभाषा

full_name विशेषता के लिए व्यवहार ऊपर प्राप्त करने के लिए कोड निम्नलिखित संशोधित करने के लिए कैसे:

संसाधन परिभाषा:

actions :install 

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

प्रदाता परिभाषा:

action :install do 
    Chef::Log.info "#{new_resource.full_name}" 
end 

मैं अलग के लिए अलग-अलग आउटपुट देखना चाहते हैं ईएनटी संसाधन निर्देशों, उदा .:

resource "abc" do 
    version "1.0.1" 
end 

abc-1.0.1 में परिणाम होगा, लेकिन:

resource "def" do 
    version "0.1.3" 
    full_name "completely_irrelevant" 
end 

completely_irrelevant का परिणाम देगा।

क्या इस व्यवहार को संसाधन परिभाषा में परिभाषित करने की संभावना है (शायद default पैरामीटर के माध्यम से) या मैं केवल प्रदाता परिभाषा में ऐसा करने में सक्षम हूं? यदि दूसरा सत्य है, तो क्या मैं गणना की गई मान new_resource ऑब्जेक्ट की full_name विशेषता में संग्रहीत कर सकता हूं (कक्षा full_name= विधि परिभाषा को याद करती है) या मुझे इसे स्थानीय चर में संग्रहीत करना है?

अद्यतन

ड्रेको संकेत के लिए धन्यवाद, मुझे एहसास हुआ कि मैं संसाधन फ़ाइल में एक्सेसर विधि बना सकते हैं और जब अनुरोध मक्खी पर full_name मूल्य की गणना कर सकते हैं। मैं एक क्लीनर समाधान पसंद करूंगा लेकिन यह कार्रवाई कार्यान्वयन में इसकी गणना करने से कहीं बेहतर है।

बावर्ची संस्करण बावर्ची: निर्माता में 10.16.4

उत्तर

3

सेटिंग @full_name,, महाराज < 0.10.10 में डिफ़ॉल्ट कार्रवाई प्रदान written in wiki के रूप में के समान है, काम नहीं करता, क्योंकि @version पर सेट नहीं है अभी तक उस बिंदु।

def initialize(name, run_context=nil) 
    super 
    @full_name ||= "%s-%s" % [name, version] 
end 

तो हम संसाधन परिभाषा में

def full_name(arg=nil) 
    if arg.nil? and @full_name.nil? 
    "%s-%s" % [name, version] 
    else 
    set_or_return(:full_name, arg, :kind_of => String) 
    end 
end 

जोड़कर संसाधन में FULL_NAME विधि ओवरराइट करना। यह काम करता है। का परीक्षण किया।

+0

दुर्भाग्यवश ऐसा लगता है कि इस बिंदु पर 'संस्करण' सदस्य चर 'शून्य' है, भले ही यह संसाधन निर्देश में निर्दिष्ट है। ऐसा लगता है कि एक नुस्खा में निर्दिष्ट विशेषता मान सदस्य को असाइन नहीं किया गया है, फिर भी (जब मैं एक्शन हैंडलर में अपना मान लॉग करता हूं तो इसका उचित मूल्य होता है)। –

+1

@DariuszWalczak मैंने जवाब तय किया। अब काम करना चाहिए। –

1
attribute :full_name, :kind_of => String, default => lazy {|r| "#{r.name}-#{r.version}" }