Issue #3667 has been updated by James Turnbull.

Status changed from Unreviewed to Accepted


----------------------------------------
Bug #3667: Namespace issue in classes in testing
http://projects.puppetlabs.com/issues/3667

Author: Brice Figureau
Status: Accepted
Priority: Normal
Assigned to: 
Category: compiler
Target version: Rowlf
Affected version: testing
Keywords: 
Branch: http://github.com/masterzen/puppet/tree/tickets/testing/3667


Testing doesn't seem to use the correct namespaces when referring a definition:
<pre>
class snmp::agent {

        define trap($trapsink) {
                notify { "trap: $trapsink of $name": }
        }

        trap{ "this is a trap" : trapsink => "trapsink" }
}

include snmp::agent
</pre>

produces
<pre>
./lib/puppet/resource.rb:169:in `initialize'
./lib/puppet/parser/resource.rb:111:in `initialize'
./lib/puppet/parser/expression/resource.rb:39:in `new'
./lib/puppet/parser/expression/resource.rb:39:in `compute_denotation'
./lib/puppet/util/errors.rb:35:in `exceptwrap'
./lib/puppet/parser/expression/resource.rb:37:in `compute_denotation'
./lib/puppet/parser/expression/resource.rb:36:in `collect'
./lib/puppet/parser/expression/resource.rb:36:in `compute_denotation'
./lib/puppet/parser/expression.rb:72:in `denotation'
./lib/puppet/parser/expression/array.rb:35:in `compute_denotation'
./lib/puppet/parser/expression/array.rb:34:in `collect'
./lib/puppet/parser/expression/array.rb:34:in `compute_denotation'
./lib/puppet/parser/expression.rb:72:in `denotation'
./lib/puppet/resource/type.rb:38:in `evaluate_code'
./lib/puppet/parser/resource.rb:73:in `evaluate'
./lib/puppet/parser/compiler.rb:131:in `evaluate_classes'
./lib/puppet/parser/compiler.rb:122:in `each'
./lib/puppet/parser/compiler.rb:122:in `evaluate_classes'
./lib/puppet/parser/functions/include.rb:6:in `function_include'
./lib/puppet/parser/expression/function.rb:36:in `send'
./lib/puppet/parser/expression/function.rb:36:in `compute_denotation'
./lib/puppet/parser/expression.rb:72:in `denotation'
./lib/puppet/parser/expression/array.rb:35:in `compute_denotation'
./lib/puppet/parser/expression/array.rb:34:in `collect'
./lib/puppet/parser/expression/array.rb:34:in `compute_denotation'
./lib/puppet/parser/expression.rb:72:in `denotation'
./lib/puppet/resource/type.rb:38:in `evaluate_code'
./lib/puppet/parser/resource.rb:73:in `evaluate'
./lib/puppet/parser/compiler.rb:280:in `evaluate_main'
./lib/puppet/parser/compiler.rb:82:in `compile'
./lib/puppet/parser/compiler.rb:18:in `compile'
./lib/puppet/indirector/catalog/compiler.rb:77:in `compile'
./lib/puppet/util.rb:179:in `benchmark'
./lib/puppet/indirector/catalog/compiler.rb:75:in `compile'
./lib/puppet/indirector/catalog/compiler.rb:34:in `find'
./lib/puppet/indirector/indirection.rb:186:in `find'
./lib/puppet/indirector.rb:50:in `find'
./lib/puppet/application/main.rb:117:in `main'
./lib/puppet/application.rb:304:in `send'
./lib/puppet/application.rb:304:in `run_command'
./lib/puppet/application.rb:295:in `run'
./lib/puppet/application.rb:391:in `exit_on_fail'
./lib/puppet/application.rb:295:in `run'
sbin/puppet:15
./lib/puppet/parser/compiler.rb:21:in `compile'
./lib/puppet/indirector/catalog/compiler.rb:77:in `compile'
./lib/puppet/util.rb:179:in `benchmark'
./lib/puppet/indirector/catalog/compiler.rb:75:in `compile'
./lib/puppet/indirector/catalog/compiler.rb:34:in `find'
./lib/puppet/indirector/indirection.rb:186:in `find'
./lib/puppet/indirector.rb:50:in `find'
./lib/puppet/application/main.rb:117:in `main'
./lib/puppet/application.rb:304:in `send'
./lib/puppet/application.rb:304:in `run_command'
./lib/puppet/application.rb:295:in `run'
./lib/puppet/application.rb:391:in `exit_on_fail'
./lib/puppet/application.rb:295:in `run'
sbin/puppet:15
Puppet::Parser::Expression::Resource failed with error ArgumentError: Invalid 
resource type trap at /tmp/trap.pp:7 on node macbook.local
</pre>

It looks like the issue is that in lib/puppet/resource.rb we try to find the 
'trap' definition (see find_defined_resource_type) with the 'snmp' namespaces, 
while when the definition was added to the known_resource_types it was under 
['snmp','agent'].
It seems the namespace we use to find the definition comes from the current 
scope (Class[snmp::agent]). The namespace of this scope returns 'snmp'.

I don't really see how this can be fixed.

Note that the following manifest works fine:
<pre>
class snmp::agent {

        define trap($trapsink) {
                notify { "trap: $trapsink of $name": }
        }

        snmp::agent::trap{ "this is a trap" : trapsink => "trapsink" }
}

include snmp::agent
</pre>


-- 
You have received this notification because you have either subscribed to it, 
or are involved in it.
To change your notification preferences, please click here: 
http://projects.puppetlabs.com/my/account

-- 
You received this message because you are subscribed to the Google Groups 
"Puppet Bugs" 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-bugs?hl=en.

Reply via email to