Issue #7423 has been updated by Nick Fagerlund.

> 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 specific nodes. 

Is that more clear? 
----------------------------------------
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.

Reply via email to