Bug #3667

Namespace issue in classes in testing

Added by Brice Figureau about 2 years ago. Updated almost 2 years ago.

Status:Closed Start date:04/25/2010
Priority:High Due date:
Assignee:Brice Figureau % Done:

0%

Category:compiler
Target version:2.6.0
Affected Puppet version:testing Branch:http://github.com/masterzen/puppet/tree/tickets/testing/3667
Keywords:
Votes: 0

Description

Testing doesn’t seem to use the correct namespaces when referring a definition:

class snmp::agent {

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

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

include snmp::agent

produces

./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

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:

class snmp::agent {

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

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

include snmp::agent

History

Updated by Brice Figureau about 2 years ago

  • Subject changed from Namespace issue with definitions in testing to Namespace issue in classes in testing
  • Branch set to http://github.com/masterzen/puppet/tree/tickets/testing/3667

Fix available for testing in my github repository: http://github.com/masterzen/puppet/tree/tickets/testing/3667

Updated by James Turnbull about 2 years ago

  • Status changed from Unreviewed to Accepted

Updated by Luke Kanies about 2 years ago

  • Assignee set to Luke Kanies

Updated by Luke Kanies about 2 years ago

  • Status changed from Accepted to In Topic Branch Pending Review
  • Assignee changed from Luke Kanies to Brice Figureau

Works for me (albeit it’s in deep need of a rebase).

Updated by Jesse Wolfe about 2 years ago

  • Status changed from In Topic Branch Pending Review to Ready For Checkin
  • Priority changed from Normal to High

Updated by Nick Lewis almost 2 years ago

  • Status changed from Ready For Checkin to Closed

Pushed in commit:f35c59f83b8df2e595ec44a6258dbae30c81237e in master

Also available in: Atom PDF