Issue #20813 has been reported by Igor Muratov.

----------------------------------------
Bug #20813: Defined type with recursion fails with duplicate declaration
https://projects.puppetlabs.com/issues/20813

* Author: Igor Muratov
* Status: Unreviewed
* Priority: Normal
* Assignee: 
* Category: 
* Target version: 
* Affected Puppet version: 2.7.21
* Keywords: defined types, recursion, mkdir_p
* Branch: 
----------------------------------------
First of all let me say it fails in some situations, not always. Here is the 
code which I have:

class filesystem {
    File {
        ensure      => directory,
        mode        => '0755',
        owner       => 'root',
        group       => 'root',
    }

    # Recursive function creates chain of objects
    define make_dir($owner=undef, $group=undef, $mode=undef) {

        file { $name:
            ensure  => directory,
            mode    => $mode,
            owner   => $owner,
            group   => $group,
        }

        # Take parent directory name
        $parent = regsubst($name, '(.+)(/[^/]+)$', '\1')

        # Recursive call if object does not exist
        if ( $parent != "" and ! defined(File["$parent"])) {
            make_dir { $parent:
                mode   => $mode,
                owner  => $owner,
                group  => $group,
            }
            File["$parent"] -> File["$name"]
        }
    }
}

class filesystem::common inherits filesystem {
    make_dir { [
        '/usr/local/bin',
        '/usr/local/etc',
        ]:
    }
}

So, when I do have two directories with the same parent directory, the class 
will fail:

Mogul:manifests user$ minicatv example.com filesystem::common
notice: looking up example.com...
err: Duplicate declaration: Filesystem::Make_dir[/usr/local] is already 
declared in file /home/user/Dvl/my_test/modules/filesystem/manifests/init.pp at 
line 63; cannot redeclare at 
/home/user/Dvl/my_test/modules/filesystem/manifests/init.pp:63 on node 
example.com
err: Try 'puppet help minicat compile' for usage

There is no issue with /usr but with the longest common part of items. The 
workaround is to add the parent directory into the list like that:
    /usr/local
    /usr/local/bin
    /usr/local/etc

That case all directory objects, including /usr, will be created with no 
errors. It is not obvious to me where and why puppet fails and I only assuming 
it could be a bug.


-- 
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 unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/puppet-bugs?hl=en.
For more options, visit https://groups.google.com/groups/opt_out.


Reply via email to