- From: Peter Donald <
>
- To: Chef Mailing List <
>
- Subject: [chef] Re: Re: Re: validation of attributes that can't have a sensible default
- Date: Fri, 25 Oct 2013 19:25:47 +1100
Hi,
I don't have the code in front of me but I think that in another
cookbook we add a snippet in a library file that looks something like
class Object
clazz = ::RealityForge::AttributeTools
clazz.public_methods.each do |m|
unless respond_to?(m)
define_method(m){p clazz.send(m)}
end
end
end
It is ugly and dangerous so don't do this at home ;)
On Thu, Oct 24, 2013 at 9:20 PM, Sölvi Páll Ásgeirsson
<
>
wrote:
>
Out of curiosity, what is the ruby trickery you use to shorten the method
>
name?
>
>
Cheers,
>
Sölvi
>
>
>
On Thu, Oct 24, 2013 at 9:34 AM, Sölvi Páll Ásgeirsson
>
<
>
>
wrote:
>
>
>
> Thanks Peter, this helps alot.
>
>
>
> Cheers
>
> Sölvi
>
>
>
>
>
> On Thu, Oct 24, 2013 at 12:12 AM, Peter Donald
>
> <
>
>
> wrote:
>
>>
>
>> Hi,
>
>>
>
>> We actually have a bunch of approaches to address this problem.
>
>> However our favourite one is to use the "cutlery" helper cookbook [1]
>
>> and add snippets of code like
>
>>
>
>> # Check that the attribute node["foo"]["bar"]["baz"]["myattr"] exists
>
>> and is a string and return it
>
>> myattr = RealityForge::AttributeTools.ensure_attribute(node,
>
>> "foo.bar.baz.myattr", String)
>
>> # Check that the attribute node["foo"]["mOtherAttr"] exists and return it
>
>> myOtherAttr = RealityForge::AttributeTools.ensure_attribute(node,
>
>> "foo.mOtherAttr")
>
>>
>
>> We can also use the same approach to check contents of databags (pass
>
>> databag as first parameter). Of course
>
>> "RealityForge::AttributeTools.ensure_attribute" is really long so we
>
>> tend to shorten it to "ensure_attribute" via some ruby trickery.
>
>>
>
>> HTH
>
>>
>
>> [1] https://github.com/realityforge/chef-cutlery
>
>>
>
>> On Thu, Oct 24, 2013 at 7:39 AM, Sölvi Páll Ásgeirsson
>
>> <
>
>
>> wrote:
>
>> > Hello everyone
>
>> >
>
>> > For some cookbook attributes, you can not set a sensible default.
>
>> >
>
>> > What i'm doing now is setting the attribute defaults to nil and
>
>> > creating a
>
>> > _attribute_validation.rb recipe which is basically a sequence of:
>
>> >
>
>> > unless foo[:attr]
>
>> > Chef::Application.fatal! "foo[:attr] is unset. Override with sane
>
>> > values
>
>> > of bar"
>
>> > end
>
>> >
>
>> > This is repetitive and boring. Is there a smarter way of going about
>
>> > this
>
>> > which I'm missing?
>
>> > Is there a way to do this directly from the attributes/*.rb ?
>
>> >
>
>> > Thanks alot!
>
>> >
>
>> > Sölvi Páll Á
>
>>
>
>>
>
>>
>
>> --
>
>> Cheers,
>
>>
>
>> Peter Donald
>
>
>
>
>
--
Cheers,
Peter Donald
Archive powered by MHonArc 2.6.16.