After doing some digging and poking around, I have found out why it is doing what it is doing, and why include and param syntaxes work differently.
There are a few different ways to fix this, but the implications are somewhat wide reaching and there isn't an easy fix.
The basic problem is that nodes get loaded as classes - "node ubuntu" and "node /ubuntu/" both load a class named "ubuntu" while "node /ubunt./" loads a class named "ubunt.".
Using param syntax ( class { 'ubuntu': } ) the class gets loaded regardless of which type of node def you use, while using include syntax, it only gets loaded for the wild card regex node name ( node /ubunt./ ).
There are two general ways this can be fixed.
1) Make include syntax work like param syntax, where the class always gets loaded.
2) Disallow nodes and classes to have the same name all together
2 isn't that good of an option, and would not be an option in the 2.7 or 3.x lines under SemVer, as it would be backwards incompatible, so 4.x would be the minimum target for it.
For 1.. there are a few ways I have been able to come up with, but none they all have potentially far reaching implications.
a) munge the class names if the class is a node
b) use a new scope level for nodes (this would also allow node level variables to be accessible in classes, which they currently are not)
Both of these options have potential to break things. I somewhat like option a, but I am not familiar with the code to be able to be sure that all access points to that name would properly munge/demunge so as to be transparent / not break existing code, if that is even possible.
With option b, I also cannot think of any way to do it that would be compatible with existing code.
Does anyone have any thoughts / ideas? Is this even something that "needs" to be fixed in the 2.7.x or 3.x code bases?
This bug isn't something that impacts me personally - I just thought it looked interesting. I don't have any uses cases that would need to do this, but I can see how in some cases it would be useful, especially when it comes to bootstrapping.
Details of #1372 are at http://projects.puppetlabs.com/issues/1372
--
You received this message because you are subscribed to the Google Groups "Puppet Developers" group.
To view this discussion on the web visit https://groups.google.com/d/msg/puppet-dev/-/FR2eGTDbCjUJ.
To post to this group, send email to puppe...@googlegroups.com.
To unsubscribe from this group, send email to puppet-dev+...@googlegroups.com.
For more options, visit this group at http://groups.google.com/group/puppet-dev?hl=en.
On Mon, Nov 26, 2012 at 8:28 AM, llowder <llow...@gmail.com> wrote:After doing some digging and poking around, I have found out why it is doing what it is doing, and why include and param syntaxes work differently.
There are a few different ways to fix this, but the implications are somewhat wide reaching and there isn't an easy fix.
The basic problem is that nodes get loaded as classes - "node ubuntu" and "node /ubuntu/" both load a class named "ubuntu" while "node /ubunt./" loads a class named "ubunt.".
Using param syntax ( class { 'ubuntu': } ) the class gets loaded regardless of which type of node def you use, while using include syntax, it only gets loaded for the wild card regex node name ( node /ubunt./ ).
There are two general ways this can be fixed.
1) Make include syntax work like param syntax, where the class always gets loaded.
2) Disallow nodes and classes to have the same name all together
2 isn't that good of an option, and would not be an option in the 2.7 or 3.x lines under SemVer, as it would be backwards incompatible, so 4.x would be the minimum target for it.
Yeah, option 2 doesn't seem ideal. It also doesn't seem right that we put in a restriction like that simply because the internals can't tell things apart. Bad UX.For 1.. there are a few ways I have been able to come up with, but none they all have potentially far reaching implications.
a) munge the class names if the class is a node
b) use a new scope level for nodes (this would also allow node level variables to be accessible in classes, which they currently are not)
Both of these options have potential to break things. I somewhat like option a, but I am not familiar with the code to be able to be sure that all access points to that name would properly munge/demunge so as to be transparent / not break existing code, if that is even possible.
I remember we talked about this, but why can't we just make "include foo" do the exact same things as "class { foo: }"?
On Monday 26 November 2012 at 18:58, Andy Parker wrote:
> On Mon, Nov 26, 2012 at 8:28 AM, llowder <llow...@gmail.com (mailto:llow...@gmail.com)> wrote:Well, as you can reference a variable in the node ubuntu using $ubuntu::variable and you can reference a variable in the class ubuntu using $ubuntu::variable I don't see how you could allow both at the same time.
> > After doing some digging and poking around, I have found out why it is doing what it is doing, and why include and param syntaxes work differently.
> >
> > There are a few different ways to fix this, but the implications are somewhat wide reaching and there isn't an easy fix.
> >
> > The basic problem is that nodes get loaded as classes - "node ubuntu" and "node /ubuntu/" both load a class named "ubuntu" while "node /ubunt./" loads a class named "ubunt.".
> >
> > Using param syntax ( class { 'ubuntu': } ) the class gets loaded regardless of which type of node def you use, while using include syntax, it only gets loaded for the wild card regex node name ( node /ubunt./ ).
> >
> > There are two general ways this can be fixed.
> >
> > 1) Make include syntax work like param syntax, where the class always gets loaded.
> > 2) Disallow nodes and classes to have the same name all together
> >
> > 2 isn't that good of an option, and would not be an option in the 2.7 or 3.x lines under SemVer, as it would be backwards incompatible, so 4.x would be the minimum target for it.
>
> Yeah, option 2 doesn't seem ideal. It also doesn't seem right that we put in a restriction like that simply because the internals can't tell things apart. Bad UX.
I think we either have to always rename the node scope to something like "node" and not allow classes with that name (would also make it easy to reference variables in the node scope as it has a fixed name).
Or skip having a special node scope and just merge it with the top scope, which would also make variables in it work more like variables in a ENC.
Neither of these options are entirely backwards compatible though, but I'm not sure any solution to this problem can be entirely backwards compatible.
--
Erik Dalén
--
You received this message because you are subscribed to the Google Groups "Puppet Developers" group.
On Tue, Nov 27, 2012 at 1:26 AM, Erik Dalén <erik.gus...@gmail.com> wrote:On Monday 26 November 2012 at 18:58, Andy Parker wrote:
> On Mon, Nov 26, 2012 at 8:28 AM, llowder <llow...@gmail.com (mailto:llow...@gmail.com)> wrote:Well, as you can reference a variable in the node ubuntu using $ubuntu::variable and you can reference a variable in the class ubuntu using $ubuntu::variable I don't see how you could allow both at the same time.
> > After doing some digging and poking around, I have found out why it is doing what it is doing, and why include and param syntaxes work differently.
> >
> > There are a few different ways to fix this, but the implications are somewhat wide reaching and there isn't an easy fix.
> >
> > The basic problem is that nodes get loaded as classes - "node ubuntu" and "node /ubuntu/" both load a class named "ubuntu" while "node /ubunt./" loads a class named "ubunt.".
> >
> > Using param syntax ( class { 'ubuntu': } ) the class gets loaded regardless of which type of node def you use, while using include syntax, it only gets loaded for the wild card regex node name ( node /ubunt./ ).
> >
> > There are two general ways this can be fixed.
> >
> > 1) Make include syntax work like param syntax, where the class always gets loaded.
> > 2) Disallow nodes and classes to have the same name all together
> >
> > 2 isn't that good of an option, and would not be an option in the 2.7 or 3.x lines under SemVer, as it would be backwards incompatible, so 4.x would be the minimum target for it.
>
> Yeah, option 2 doesn't seem ideal. It also doesn't seem right that we put in a restriction like that simply because the internals can't tell things apart. Bad UX.
I don't seem to be able to reference a node variable directly:> bundle exec puppet apply -e 'node aparker {$a = "node"include foo}class foo { notice($aparker::a) }'Warning: Scope(Class[Foo]): Could not look up qualified variable 'aparker::a'; class aparker could not be foundScope(Class[Foo]):Finished catalog run in 0.03 seconds
>> > > To post to this group, send email to puppe...@googlegroups.com (javascript:).
> > >
> > > I think we either have to always rename the node scope to something like "node" and not allow classes with that name (would also make it easy to reference variables in the node scope as it has a fixed name).
> > >
> > > Or skip having a special node scope and just merge it with the top scope, which would also make variables in it work more like variables in a ENC.
> > >
> > > Neither of these options are entirely backwards compatible though, but I'm not sure any solution to this problem can be entirely backwards compatible.
> >
> > There are all sorts of problems with combining top and node scope. A few months ago I proposed that, but it is a large change that breaks things that people depend on.
> >
> > > --
> > > Erik Dalén
> > >
> > >
> > >
> > > --
> > > You received this message because you are subscribed to the Google Groups "Puppet Developers" group.
> > > To unsubscribe from this group, send email to puppet-dev+...@googlegroups.com (javascript:).
> > > For more options, visit this group at http://groups.google.com/group/puppet-dev?hl=en.> To post to this group, send email to puppe...@googlegroups.com (mailto:puppe...@googlegroups.com).
> >
>
> --
> You received this message because you are subscribed to the Google Groups "Puppet Developers" group.
> To view this discussion on the web visit https://groups.google.com/d/msg/puppet-dev/-/v1HFPFu99acJ.
> To unsubscribe from this group, send email to puppet-dev+...@googlegroups.com (mailto:puppet-dev+...@googlegroups.com).
> For more options, visit this group at http://groups.google.com/group/puppet-dev?hl=en.
--
You received this message because you are subscribed to the Google Groups "Puppet Developers" group.
To post to this group, send email to puppe...@googlegroups.com.
To unsubscribe from this group, send email to puppet-dev+...@googlegroups.com.