-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Maybe I'm missing something here.

class foo { ... }

and

$foo

Both trigger: defined('foo')

Having 'class foo' declared in your namespace causes:

defined(Class["foo"]) to work but if it's not defined in your namespace,
you get a fatal compile error (which is bad).

I guess there's no real issue with the case at the top, but it could
really screw you up if you're expecting to activate on a class but
instead activate on a variable.

Is there a way to make 'defined' require a '$' to look for a variable?

So defined("foo") would mean 'class foo' and defined('$foo') would mean
'variable $foo'?

Thanks,

Trevor

On 01/23/2011 01:46 AM, Luke Kanies wrote:
> Fantastic.
> 
> (For those who don't know, Nick's the tech writer at Puppet Labs.)
> 
> On Jan 21, 2011, at 5:25 PM, nfagerlund wrote:
> 
>> The differences in the way defined() handles different types of entities 
>> weren't well-explained. Documentation was also added for the behavior of 
>> defined(Node["somenode.domain.com"]).
>>
>> Signed-off-by: nfagerlund <[email protected]>
>> ---
>> lib/puppet/parser/functions/defined.rb |   47 +++++++++++++++++++++++++++----
>> 1 files changed, 41 insertions(+), 6 deletions(-)
>>
>> diff --git a/lib/puppet/parser/functions/defined.rb 
>> b/lib/puppet/parser/functions/defined.rb
>> index 90632af..c3efc5f 100644
>> --- a/lib/puppet/parser/functions/defined.rb
>> +++ b/lib/puppet/parser/functions/defined.rb
>> @@ -1,10 +1,45 @@
>> # Test whether a given class or definition is defined
>> -Puppet::Parser::Functions::newfunction(:defined, :type => :rvalue, :doc => 
>> "Determine whether a given
>> -  type is defined, either as a native type or a defined type, or whether a 
>> class is defined.
>> -  This is useful for checking whether a class is defined and only including 
>> it if it is.
>> -  This function can also test whether a resource has been defined, using 
>> resource references
>> -  (e.g., `if defined(File['/tmp/myfile']) { ... }`).  This function is 
>> unfortunately
>> -  dependent on the parse order of the configuration when testing whether a 
>> resource is defined.") do |vals|
>> +Puppet::Parser::Functions::newfunction(:defined, :type => :rvalue, :doc => 
>> "Determine whether
>> +  a given type, class, resource, or node is defined, and return
>> +  true or false. Accepts class names, type names, resource references, and 
>> node
>> +  references.
>> +  
>> +  The `defined` function checks both native and defined types, including 
>> types
>> +  provided as plugins via modules. Types are checked using their names:
>> +  
>> +      defined(\"file\")
>> +      defined(\"customtype\")
>> +  
>> +  Classes are also checked using their names:
>> +  
>> +      defined(\"foo\")
>> +      defined(\"foo::bar\")
>> +  
>> +  Unlike classes and types, resource definitions are checked using resource
>> +  references, e.g. `defined( File['/tmp/myfile'] )`. Checking whether a 
>> given
>> +  resource defined is, unfortunately, dependent on the parse order of the
>> +  configuration, and the following code will not work:
>> +  
>> +      if defined(File['/tmp/foo']) {
>> +          notify(\"This configuration includes the /tmp/foo file.\")
>> +      }
>> +      file {\"/tmp/foo\":
>> +          ensure => present,
>> +      }
>> +  
>> +  However, this order requirement refers to parse order only, and ordering 
>> of
>> +  resources in the configuration graph (e.g. with `begin` or `require`) 
>> does not
>> +  affect the behavior of `defined`.
>> +  
>> +  You can also use `defined` to check whether a node is defined using syntax
>> +  resembling a resource reference, like `Node[\"testnode.domain.com\"]`. 
>> This usage
>> +  is not necessarily recommended, and is included here only in the spirit of
>> +  completeness. Checking for node definitions behaves differently from the 
>> other
>> +  uses of `defined`: it will only return true if a definition for the 
>> specified
>> +  node (the name of which must match exactly) exists in the manifest 
>> **AND** the
>> +  specified node matches the node whose configuration is being compiled 
>> (either
>> +  directly or through node inheritance). The `define` function cannot be 
>> used to
>> +  introspect information returned by an external node classifier. ") do 
>> |vals|
>>     result = false
>>     vals = [vals] unless vals.is_a?(Array)
>>     vals.each do |val|
>> -- 
>> 1.7.3.3
>>
>> -- 
>> You received this message because you are subscribed to the Google Groups 
>> "Puppet Developers" group.
>> To post to this group, send email to [email protected].
>> To unsubscribe from this group, send email to 
>> [email protected].
>> For more options, visit this group at 
>> http://groups.google.com/group/puppet-dev?hl=en.
>>
> 
> 

- -- 
Trevor Vaughan
 Vice President, Onyx Point, Inc.
 email: [email protected]
 phone: 410-541-ONYX (6699)
 pgp: 0x6C701E94

- -- This account not approved for unencrypted sensitive information --
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.11 (GNU/Linux)

iQEcBAEBAgAGBQJNQD6rAAoJECNCGV1OLcyp0QwH/1XS1/3Pk6CS0+p8XMg4NBNZ
4BWEqt5OtKVemu/CEE+of2QhB8bJ/sIgBKArn75LD2xbVKk33twUP0lwsUJJkYQx
zr7HAbhCLAf4vSl0UB3QHxC5SEuvmGZBW5WBO4UCH7FkcUbGawaGkOUMc9C0MiRv
VoiU02aU7nJ8YeVI5msYpr24g4d2/nQvqS8r4U4elB2lDddDzGECiufIiPPFgCfX
GulfJLjhckfSRCHQF3BRUw8q41RCuJxpiLtrOo7TqSknZwNNhoMoo6SCsLjprV4F
hbluyaGwJkWz7RHqW7b7g94+6UH0LDVOytdxZZ+8UOWx2Z/wtJUZe/mFTDXua8c=
=EQAm
-----END PGP SIGNATURE-----

-- 
You received this message because you are subscribed to the Google Groups 
"Puppet Developers" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/puppet-dev?hl=en.

<<attachment: tvaughan.vcf>>

Reply via email to