order agnostic child group definition in inventory

Previously if a child's group vars section was defined before the
child group itself, an edge case would be hit where the state of the
pending declaration would process as var and therefore drop the
child pending declaration context. This would result in the group
vars defined for the parent group being out of scope for the child
group.

Example:

    [web:children]
    appnodes
    proxies

    [web:vars]
    deployment_type=prod

    [appnodes:vars]
    foo_var=true

    [appnodes]
    appnodes[1:3].example.com

    [proxies:vars]
    bar_var=true

    [proxies]
    proxies[1:3].example.com

Previously the deployment_type variable would be out of scope for
both the appnodes and proxies groups. This patch fixes that.

Signed-off-by: Adam Miller <maxamillion@fedoraproject.org>
This commit is contained in:
Adam Miller 2017-12-11 12:44:44 -06:00 committed by Brian Coca
parent bd769bf79a
commit 4df610f961

View file

@ -180,7 +180,17 @@ class InventoryModule(BaseFileInventoryPlugin):
# but [groupname:vars] is allowed only if the # group is declared elsewhere.
# We add the group anyway, but make a note in pending_declarations to check at the end.
if state == 'vars':
pending_declarations[groupname] = dict(line=self.lineno, state=state, name=groupname)
# It's possible that a group is previously pending due to being
# defined as a child group, in that case we simply pass so that
# the logic below to process pending declarations will take the
# appropriate action for a pending child group instead of
# incorrectly handling it as a var state pending declaration
if groupname in pending_declarations:
if pending_declarations[groupname]['state'] == 'children':
pass
else:
pending_declarations[groupname] = dict(line=self.lineno, state=state, name=groupname)
self.inventory.add_group(groupname)