Issue #7423 has been updated by Henrik Lindberg.
Nick Fagerlund wrote:
> > I think so – given a.b.c.d and b.c.d and searching for d, the shorter one
> > will win if it chops of from the beginning until there is a match.
>
> Oh! Yeah, no, it goes in the opposite direction and favors the longest match!
> Like this: say the node's actual certname is `a.b.c.d`. If `node a.b.c.d {
> ... }` exists, it always wins. If there's no exact node defined but there's a
> `node a.b.c { ... }` (i.e. same thing but with the top-level domain chopped
> off), that node will win. If that doesn't exist, `node a.b` and then `node a`
> will get a shot, after which we fall back to default.
>
> `node b.c.d { ... }` will never match our `a.b.c.d` node no matter what;
> likewise, a node whose full certname is `d` will never match nodes `a.b.c.d`
> or `b.c.d`. But a node named `d.e.f` would eventually match `node d { ... }`
> if there weren't any more specific nodes.
>
> Is that more clear?
yes that makes sense when coming with a full cert name to match against a node
name. And I forgot that you already said that inherits must always use the
exact matching node name (no chopping of and comparing).
Did you agree to the rest of the summary? If yes, the issue can be closed as
far as the "confusion" (although I think that the grammar should really not
allow the illegal constructs (unless there is validation kicking in that gives
user sensible errors).
----------------------------------------
Bug #7423: unclear node inheritance semantics
https://projects.puppetlabs.com/issues/7423
Author: Henrik Lindberg
Status: Unreviewed
Priority: Normal
Assignee:
Category: parser
Target version: 2.6.x
Affected Puppet version:
Keywords: parser node inheritance semantics easeofuse documentation usability
Branch:
While working with Geppetto to provide validation and incremental feedback
while editing, I entered into the realm of node inheritance.
By looking at what is allowed in the grammar I have several questions regarding
the semantics and legality of some of the possible constucts.
I have no clue if the grammar should be more retrictive (i.e. these are grammar
bugs), or if the documentation should be expanded to declare how it is supposed
to work (or for that matter if any of these constructs actually work ;) - they
seem to be allowed from a grammar standpoint.
(If you prefer to read this online formatted a bit better - see
https://github.com/cloudsmith/geppetto/wiki/Semantic-Issues-regarding-Node-Inheritance)
### Can node ‘default’ inherit ?
A node declared as
node default { }
is used for hosts that do not match. Is it possible for such a node to also
inherit ?
node default inherits x { }
### Circular inheritance
Is obviously not allowed. Depending on the semantics for inheritance using
regular expressions, there can be some surprises that are introduced when
additional classes are added (and they happen to match).
### Ambiguous Nodes ?
Are simple and qualified names allowed to overlap? Is it ok to declare all of
these:
node bugtracker { }
node ‘bugtracker.myorg.com’ { }
node ‘bugtracker.internal.myorg.com’ { }
… or is this an error?
### Ambiguous inheritance
A node can be declared with a simple name (e.g. `bugtracker`), or a fully
qualified name (`‘bugtracker.myorg.com’`). When inheriting it is possible to
use both simple and qualified name - what happens when there are several to
choose from e.g. `‘bugtracker.myorg.com’`, `‘bugtracker.internal.myorg.com’`.
What happens if a node is declared with:
node x inherits bugtracker { }
### Nodes matching with regular expressions
A node can match using a regular expression:
node /web-([0-9]*).example.com$/ {}
How is inhertitance of such a node possible? This syntax is allowed by the
parser:
node webservers inherits /web-([0-9]*).example.com$/ {}
What does this mean? Is the inheritance to a node with an identical (matching)
regexp (i.e. equal regexp string), or to equivalently matching regexps, or it
is it applied to the regexp as a string? Or, are nodes defined with regexp
‘name’ not included in the matching?
This is very confusing...
### Can ‘default’ be matched with regexp?
Is this sensical?
node /defa.*/ { }
### Linking to non existing nodes
Since inheritence can be expressed with regular expressions and string
expressions - what happens if there is no match? Is this an error, or simply
that there is nothing to inherit at this particular moment? If the answer is
that it means that same as not having specified inheritance, then does the same
rule apply if a name is used? E.g.
1. No xyz is known
```ruby
node a inherits xyz { }
```
2. Regexp does not match
```ruby
node a inherits /x.*/ { }
```
3. Variably $y is not set to "yz"
```ruby
node a inherits "$y"
```
--
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.