Recent 5.5.x point releases are throwing some warnings for me

2,639 views
Skip to first unread message

j...@jnjschneider.com

unread,
Aug 28, 2018, 11:31:13 AM8/28/18
to Puppet Users
I was away on vacation for a month, upon getting back I am finding the Puppet Agent is now throwing a warning on all of the defines I have in a module that is applied to all our Linux servers.  (we are auto updating point releases)

Warning: Unacceptable location. The name 'remote_file' is unacceptable in file '/etc/puppet/modules/seed/manifests/init.pp' (file: /etc/puppet/modules/seed/manifests/init.pp, line: 1123, column: 1)

We have several defines in this module, all now causing the same warning message and wasn't a few months ago.  I couldn't find anything in the 5.5.x release notes to explain why this warning has started to pop up.

In this case the define warned about above looks like:

define remote_file($remote_location=undef, $mode='0644', $owner=undef, $group=undef) {
    Code here
}

Thanks in advance for any ideas anyone might have on why this warning has started to pop up.

Jon

Branan Riley

unread,
Aug 28, 2018, 11:50:48 AM8/28/18
to puppet...@googlegroups.com
Hi Jon,

In Puppet 6 we're going to start requiring that the names of classes/defines match the name that's implied by their file path[1]. We added that deprecation warning in 5.5.6[2] as part of a push to get upcoming Puppet 6 changes printing warnings whenever possible.



--
You received this message because you are subscribed to the Google Groups "Puppet Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email to puppet-users...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/puppet-users/673af078-aadf-4c43-8f8a-c451f688a85f%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.
--
Regards,

Branan Riley
Senior Software Engineer, Puppet inc.

j...@jnjschneider.com

unread,
Aug 28, 2018, 12:08:16 PM8/28/18
to Puppet Users
So does this mean if the path is '$module_path/seed/manifests/init.pp' then the define name will now need to be 'seed::init::remote_file' in place of 'remote_file'?

Thanks,
Jon

j...@jnjschneider.com

unread,
Aug 28, 2018, 12:12:27 PM8/28/18
to Puppet Users
Guess I should have read to point 6 in PUP-1434, init.pp is special.  Got it, thanks a bunch.

Jon

kris.b...@puppet.com

unread,
Aug 28, 2018, 1:13:15 PM8/28/18
to Puppet Users

Hi Jon,

As you have read, this is part of our work implementing errors to enforce the standards set down in PUP-1434.  In particular, your example '$module_path/seed/manifests/init.pp' looks like it is in the init file of module 'seed'.  Assuming that is what you meant, anything starting with 'seed' would be OK in that file, e.g. 'seed', 'seed::remote_file', 'seed::foo::remote_file' would all work.  Note that as part of point 4. of PUP-1434 (now being implemented in the work of PUP-9020), you will also not be allowed to put things like resources in the top level, but instead should include your resources in a class, define, function, or type declaration.

Kris Bosland
Senior Software Engineer, Puppet inc.

jcbollinger

unread,
Aug 29, 2018, 9:11:29 AM8/29/18
to Puppet Users


On Tuesday, August 28, 2018 at 12:13:15 PM UTC-5, kris.b...@puppet.com wrote:

Hi Jon,

As you have read, this is part of our work implementing errors to enforce the standards set down in PUP-1434.  In particular, your example '$module_path/seed/manifests/init.pp' looks like it is in the init file of module 'seed'.  Assuming that is what you meant, anything starting with 'seed' would be OK in that file, e.g. 'seed', 'seed::remote_file', 'seed::foo::remote_file' would all work.  Note that as part of point 4. of PUP-1434 (now being implemented in the work of PUP-9020), you will also not be allowed to put things like resources in the top level, but instead should include your resources in a class, define, function, or type declaration.

As a matter of style, the usual recommendation is that furthermore, every class and defined type definition be located in its own file, named as predicted from its fully-qualified name.  Of course, this is coupled with assigning an appropriate fully-qualified name.  It is important to understand that class and type names in Puppet are independent of the pathnames of the files in which the class and type definitions appear.  The importance of the pathnames is limited to enabling Puppet to find type and class definitions at runtime.


John

Henrik Lindberg

unread,
Aug 29, 2018, 9:58:32 AM8/29/18
to puppet...@googlegroups.com
On 2018-08-29 15:11, jcbollinger wrote:
>
>
> On Tuesday, August 28, 2018 at 12:13:15 PM UTC-5, kris.b...@puppet.com
> wrote:
>
>
> Hi Jon,
>
> As you have read, this is part of our work implementing errors to
> enforce the standards set down in PUP-1434.  In particular, your
> example '$module_path/seed/manifests/init.pp' looks like it is in
> the init file of module 'seed'.  Assuming that is what you meant,
> anything starting with 'seed' would be OK in that file, e.g. 'seed',
> 'seed::remote_file', 'seed::foo::remote_file' would all work.  Note
> that as part of point 4. of PUP-1434 (now being implemented in the
> work of PUP-9020), you will also not be allowed to put things like
> resources in the top level, but instead should include your
> resources in a class, define, function, or type declaration.
>
>
> As a matter of style, the usual recommendation is that furthermore,
> every class and defined type definition be located in its own file
> <https://puppet.com/docs/puppet/5.5/style_guide.html#separate-files>,
> named as predicted from its fully-qualified name.  Of course, this is
> coupled with assigning an appropriate fully-qualified name.  It is
> important to understand that class and type names in Puppet are
> independent of the pathnames of the files in which the class and type
> definitions appear.  The importance of the pathnames is limited to
> enabling Puppet to /find/ type and class definitions at runtime.
>
>

Not quite - what is now starting to be enforced is that definitions
must be made in a file that is on an accepted path for that definition.

Best,
- henrik

> John
>
> --
> You received this message because you are subscribed to the Google
> Groups "Puppet Users" group.
> To unsubscribe from this group and stop receiving emails from it, send
> an email to puppet-users...@googlegroups.com
> <mailto:puppet-users...@googlegroups.com>.
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/puppet-users/916271cc-6a49-4374-afe2-d6fe0dff297d%40googlegroups.com
> <https://groups.google.com/d/msgid/puppet-users/916271cc-6a49-4374-afe2-d6fe0dff297d%40googlegroups.com?utm_medium=email&utm_source=footer>.
> For more options, visit https://groups.google.com/d/optout.


--

Visit my Blog "Puppet on the Edge"
http://puppet-on-the-edge.blogspot.se/

j...@jnjschneider.com

unread,
Aug 29, 2018, 4:11:47 PM8/29/18
to Puppet Users
Fair enough.  Some parts of our Puppet code base is almost 10 years old, and usually only gets updated when a deprecation requires it.  We'll have to put some time into reorganizing things a bit one of these days.

Jon

Eirik Øverby

unread,
Oct 5, 2018, 11:20:51 AM10/5/18
to Puppet Users
On Tuesday, August 28, 2018 at 6:50:48 PM UTC+3, Branan Purvine-Riley wrote:
Hi Jon,

In Puppet 6 we're going to start requiring that the names of classes/defines match the name that's implied by their file path[1]. We added that deprecation warning in 5.5.6[2] as part of a push to get upcoming Puppet 6 changes printing warnings whenever possible.


Since 5.5.6 our puppetserver has been issuing warnings of this kind:
Puppet Unacceptable location. The name 'bash' is unacceptable in file '/usr/local/etc/puppet/modules.common/bash/manifests/init.pp'

The init.pp file contains only this:
class bash {
    package { "shells/bash":
        ensure => installed,
    }
}

I am at a loss as to how I'm supposed to refactor this to make the warning go away. We do need an init.pp, and I know that for style points we should split this into a base class and a ::install class, but I refuse to believe that this is *required* for something as simple as the above. I am also not finding the documentation particularly helpful in this simple use-case. It does look like it's complaining about absolutely every class we have defined, no matter if we use only init.pp or properly-defined directory/file hierarchy and -naming for the classes, defines, etc.

Can someone help me nudge my neurons in a way that I understand what is expected of me?

/Eirik 
Message has been deleted

kris.b...@puppet.com

unread,
Oct 5, 2018, 1:24:35 PM10/5/18
to Puppet Users
Hi Eirik,

I was unable to reproduce your issue in Puppet 5.5.6 (aka SHA 60de165 from https://github.com/puppetlabs/puppet/releases):

kris.bosland@kris:puppet % git checkout 60de165                                                                                                                                    ±[5.5.6^0]
HEAD is now at 60de165b86... Merge pull request #7007 from justinstoller/maint-pin-rake-more
kris.bosland@kris:puppet % cat ../tmp/test/bash/manifests/init.pp                                                                                                                  ±[5.5.6^0]
class bash {
    package { "shells/bash":
        ensure => installed,
    }
}

class smash {
    package { "shells/bash":
        ensure => installed,
    }
}
kris.bosland@kris:puppet % bx puppet apply --modulepath ../tmp/test -e 'class test { include bash }; include test'                                                                 ±[5.5.6^0]
Warning: Unacceptable location. The name 'smash' is unacceptable in file '/Users/kris.bosland/work/tmp/test/bash/manifests/init.pp' (file: /Users/kris.bosland/work/tmp/test/bash/manifests/init.pp, line: 7, column: 1)
Notice: Compiled catalog for kris.bosland-c02kf9eafft1 in environment production in 0.56 seconds
Error: Mac OS X PKG DMGs must specify a package source.
Error: /Stage[main]/Bash/Package[shells/bash]/ensure: change from 'absent' to 'present' failed: Mac OS X PKG DMGs must specify a package source.
Notice: Applied catalog in 0.02 seconds
kris.bosland@kris:puppet %

Note that Puppet complains about the class 'smash' in the 'bash' module, but not the class 'bash'.

Can you provide a more detailed example that fails for you?

Thanks.

-Kris

Eirik Øverby

unread,
Oct 5, 2018, 1:55:52 PM10/5/18
to puppet...@googlegroups.com
> Hi Eirik,
>
> I was unable to reproduce your issue in Puppet 5.5.6 (aka SHA 60de165 from https://github.com/puppetlabs/puppet/releases):
>
> kris.bosland@kris:puppet % git checkout 60de165 ±[5.5.6^0]
> HEAD is now at 60de165b86... Merge pull request #7007 from justinstoller/maint-pin-rake-more
> kris.bosland@kris:puppet % cat ../tmp/test/bash/manifests/init.pp ±[5.5.6^0]
> class bash {
> package { "shells/bash":
> ensure => installed,
> }
> }
>
> class smash {
> package { "shells/bash":
> ensure => installed,
> }
> }
> kris.bosland@kris:puppet % bx puppet apply --modulepath ../tmp/test -e 'class test { include bash }; include test' ±[5.5.6^0]
> Warning: Unacceptable location. The name 'smash' is unacceptable in file '/Users/kris.bosland/work/tmp/test/bash/manifests/init.pp' (file: /Users/kris.bosland/work/tmp/test/bash/manifests/init.pp, line: 7, column: 1)
> Notice: Compiled catalog for kris.bosland-c02kf9eafft1 in environment production in 0.56 seconds
> Error: Mac OS X PKG DMGs must specify a package source.
> Error: /Stage[main]/Bash/Package[shells/bash]/ensure: change from 'absent' to 'present' failed: Mac OS X PKG DMGs must specify a package source.
> Notice: Applied catalog in 0.02 seconds
> kris.bosland@kris:puppet %
>
> Note that Puppet complains about the class 'smash' in the 'bash' module, but not the class 'bash'.

I would expect that too - not that I like it (it will still require a load of work to clean up our puppetserver.log), but in our end it complains even about 'bash'..


> Can you provide a more detailed example that fails for you?

I'm not sure how much more detail I can give? Most of our in-house modules are relatively simple, much like my original example. It complains about - it seems, but I haven't counted - every module we have written.

One possible issue might be that we have several module directories - all listed in basemodulepath:
/usr/local/etc/puppet/modules - anything installed using 'puppet module...'
/usr/local/etc/puppet/modules.common - all in-house modules that apply to all our environments
- This is where the bash module (and git, sudo, nano, vim, etc....all suffering from the same) lives
/usr/local/etc/puppet/nodes.common - all node classes and definitions that are the same across all our environments

We're on FreeBSD and running unmodified puppetserver from the ports tree. Puppet server is v5.3.5

Does this help? Any information I can collect that would shed light on this?


Thanks,
/Eirik

kris.b...@puppet.com

unread,
Oct 5, 2018, 2:15:20 PM10/5/18
to Puppet Users
Hi X,

Nick Lewis helped me reproduce this issue with the extra module path, I have filed https://tickets.puppetlabs.com/browse/PUP-9211 for the issue.

Thanks!

-Kris


 

Eirik Øverby

unread,
Oct 5, 2018, 2:22:30 PM10/5/18
to puppet...@googlegroups.com
> Hi X,
>
> Nick Lewis helped me reproduce this issue with the extra module path, I have filed https://tickets.puppetlabs.com/browse/PUP-9211 for the issue.
>
> Thanks!

Thanks a *lot*!
I've resuscitated my JIRA account, so if you wish to attach me to the ticket in some way, my username is 'ltning'.

I presume 5.5.7 should have this one fixed then? :)

/Eirik

kris.b...@puppet.com

unread,
Oct 5, 2018, 2:29:44 PM10/5/18
to Puppet Users


On Friday, October 5, 2018 at 11:22:30 AM UTC-7, Eirik Øverby wrote:

I've resuscitated my JIRA account, so if you wish to attach me to the ticket in some way, my username is 'ltning'.

I presume 5.5.7 should have this one fixed then? :)

/Eirik

I have set you as the Reporter.
I would expect this to get into 5.5.7 but can't promise yet.

-Kris
 

Eirik Øverby

unread,
Oct 5, 2018, 2:39:36 PM10/5/18
to puppet...@googlegroups.com
> I would expect this to get into 5.5.7 but can't promise yet.

Brilliant - as long as it's not me being crazy. Thanks again.

/Eirik

lhu

unread,
Jun 14, 2019, 4:06:55 PM6/14/19
to Puppet Users
Hi John,

Would you have any idea why this would fail 
file
#puppet parser validate adhoc.pp
Warning: Unacceptable location. The name 'adhoc' is unacceptable in file '/opt/puppetlabs/puppet/modules/adhoc/manifests/adhoc.pp' (file: /opt/puppetlabs/puppet/modules/adhoc/manifests/adhoc.pp, line: 1, column: 1)

adhoc.pp file:

class adhoc {


}

I put the file under
/opt/puppetlabs/puppet/modules/adhoc/manifests
this is running puppet 5.5 on a new install

Thanks,
Leo

Ben Ford

unread,
Jun 14, 2019, 6:34:34 PM6/14/19
to puppet...@googlegroups.com
Yes. A class without a namespace must be named the same as the module containing it, and be in the init.pp file.

In other words, your /opt/puppetlabs/puppet/modules/adhoc/manifests/adhoc.pp file should be /opt/puppetlabs/puppet/modules/adhoc/manifests/init.pp.


--
You received this message because you are subscribed to the Google Groups "Puppet Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email to puppet-users...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/puppet-users/dc9b55e8-f5c3-4622-a223-0d5df43e36db%40googlegroups.com.

lhu

unread,
Jun 17, 2019, 10:09:52 AM6/17/19
to Puppet Users
Thanks Ben.

Would you know why this wouldn't work? I have the module manifest folder under adhoc/pakg/dan/manifest/

#puppet parser validate init.pp


Warning: Unacceptable location. The name 'adhoc::pkg::dan::init' is unacceptable in file '/opt/puppetlabs/puppet/modules/adhoc/pkg/dan/manifests/init.pp' (file: /opt/puppetlabs/puppet/modules/adhoc/pkg/dan/manifests/init.pp, line: 1, column: 1)



So I assumed with the init.pp file this would work? 
class adhoc::pkg::dan {


}

I also tried just using the module name prior to the manifest folder but that didn't work as well. 

--
You received this message because you are subscribed to the Google Groups "Puppet Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email to puppet...@googlegroups.com.

jcbollinger

unread,
Jun 18, 2019, 9:06:42 AM6/18/19
to Puppet Users


On Monday, June 17, 2019 at 9:09:52 AM UTC-5, lhu wrote:
Thanks Ben.

Would you know why this wouldn't work? I have the module manifest folder under adhoc/pakg/dan/manifest/

#puppet parser validate init.pp


Warning: Unacceptable location. The name 'adhoc::pkg::dan::init' is unacceptable in file '/opt/puppetlabs/puppet/modules/adhoc/pkg/dan/manifests/init.pp' (file: /opt/puppetlabs/puppet/modules/adhoc/pkg/dan/manifests/init.pp, line: 1, column: 1)




I don't quite follow what you're trying to do there.  Your module's name is "adhoc" (it cannot be "adhoc::pkg::dan" because the colon (:) is not among the characters allowed in module or class names).  With that being the case, the subdirectories of the module layout belong under adhoc/, not deeper in the tree.  In particular, a class named adhoc::pkg::dan::init belongs in file adhoc/manifests/pkg/dan/init.pp.  I'm not a fan of such a deep naming structure, but that would work.

Note also that class names of the form <module name>::init are reserved, but if you do have a deeper tree then you can have classes whose last name segment is "init" at deeper levels.

 

So I assumed with the init.pp file this would work? 
class adhoc::pkg::dan {


}


No. If /opt/puppetlabs/puppet/modules/adhoc/pkg were in your modulepath then you could put the main class of module "dan" in the file you name, i.e.

class dan {
}

That's the only way it works with your placement of the "manifests" directory, but DON'T DO THAT.  Setting up a modulepath in containing pairs of directories where one is nested inside the other is confusing and unnecessary, not to mention that it triggers bugs in some versions of Puppet.

 
I also tried just using the module name prior to the manifest folder but that didn't work as well.

If you want a class named adhoc::pkg::dan then it belongs in a file named adhoc/manifests/pkg/dan.pp, relative to some folder in your modulepath.  The init.pp filename is special only for a module main class, and therefore only at the top level of the module.


John

lhu

unread,
Jun 19, 2019, 10:36:25 AM6/19/19
to Puppet Users
I think I got it. I was confused because of the manifest path and the special init.pp main class. Didn't realize the init.pp requires to be in the top main levels and for subdirectories classes it has to be within manifest path. 

In our scenario, we used the pkg directory within adhoc to push pkgs forward depending on the version. So for instance, we would have 
/opt/puppetlabs/puppet/modules/adhoc/pkg/adhoc-0.1.1/manifests/{init.pp,etc} 
which we would have a script that pushes it into Redhat Satellite depending on the package release required. 

I think in our scenario it should be fine since Satellite ends up looking at it as 
/opt/puppetlabs/puppet/modules/adhoc/manifests
in the end. I was just testing if all the puppet code was working since running "puppet parser validate [file]" would return those warnings. 

Thanks for the explanation! 


On Tuesday, June 18, 2019 at 9:06:42 AM UTC-4, jcbollinger wrote:


On Monday, June 17, 2019 at 9:09:52 AM UTC-5, lhu wrote:
Thanks Ben.

Would you know why this wouldn't work? I have the module manifest folder under adhoc/pkg/dan/manifest/
Reply all
Reply to author
Forward
0 new messages