Hello
I'm writing a new resource which has multiple providers but I cannot get
the containment to work properly, some properties leak to all resources
of this type regardless of the provider.
here is one of the properties and the type declaration
```
Puppet::Type.newtype(:nexus_v3_repository) do
@doc = "Manage nexus v3 repositories"
ensurable
feature :feat_negative_cache_enabled, "negative cache enabled", :methods => [:negative_cache_enabled]
newproperty(:negative_cache_enabled, :boolean => true, :require_features => :feat_negative_cache_enabled) do
desc 'Whether to cache responses for content not present in the proxied repository'
newvalues(:true, :false)
defaultto :true
end
```
then I have multiple providers which implement, or not, the feature
feat_negative_cache_enabled
(i'm using negative_cache_enabled as an example, other properties share
the same behavior)
maven provider (it does not implement negative_cache_enabled)
```
Puppet::Type.type(:nexus_v3_repository).provide(:maven) do
desc 'Nexus repository maven provider'
mk_resource_methods
confine :exists => "/etc/puppetlabs/puppet/nexus_ready"
confine :exists => "/etc/puppetlabs/puppet/nexus_rest.conf"
has_feature :feat_versionpolicy, :feat_writepolicy, :feat_layoutpolicy
```
proxy provider which does implement feat_negative_cache_enabled
```
Puppet::Type.type(:nexus_v3_repository).provide(:proxy) do
desc 'Nexus repository proxy provider'
mk_resource_methods
confine :exists => "/etc/puppetlabs/puppet/nexus_ready"
confine :exists => "/etc/puppetlabs/puppet/nexus_rest.conf"
has_features :feat_repodatadepth, :feat_content_max_age, :feat_format, :feat_negative_cache_ttl, :feat_negative_cache_enabled
```
if i run `puppet resources nexus_v3_repository` resources are listed
properly with their properties
```
nexus_v3_repository { 'centos8':
ensure => 'present',
blobstorename => 'centos8',
format => 'yum',
negative_cache_enabled => true,
negative_cache_ttl => 1440,
provider => 'proxy',
remote_url => '
https://nexus.internal.domain/repository/Centos-8/',
strictcontenttypevalidation => true,
type => 'proxy',
url => '
https://nexus.internal.domain/repository/centos8',
}
nexus_v3_repository { 'maven':
ensure => 'present',
blobstorename => 'maven',
layoutpolicy => 'STRICT',
online => 'true',
provider => 'maven',
strictcontenttypevalidation => 'true',
type => 'hosted',
url => '
https://nexus.internal.domain/repository/maven',
versionpolicy => 'MIXED',
writepolicy => 'allow_once',
}
```
when I run `puppet agent -t` the negative_cache_enabled property is applied
to resources with the provider `maven` even if the provider does not
implement that feature
```
Notice: /Stage[main]/Profile_nexus/Nexus_v3::Repository::Maven::Hosted[maven]/Nexus_v3_repository[maven]/negative_cache_enabled: defined 'negative_cache_enabled' as 'true' (corrective)
Notice: /Stage[main]/Profile_nexus/Nexus_v3::Repository::Maven::Hosted[maven]/Nexus_v3_repository[maven]/negative_cache_ttl: defined 'negative_cache_ttl' as 30 (corrective)
```
which doesn't do anything but generates extra noise in puppet's output
if I remove `mk_resource_methods` from the maven provider puppet fails
to run because it cannot find the negative_cache_enabled method (which
is expected but not wanted)
```
Error: /Stage[main]/Profile_nexus/Nexus_v3::Repository::Maven::Hosted[maven]/Nexus_v3_repository[maven]: Could not evaluate: undefined method `negative_cache_enabled' for Nexus_v3_repository[maven](provider=maven):Puppet::Type::Nexus_v3_repository::ProviderMaven
```
there is a warning that puppet can't find the default provider for the
resource
```
Warning: Found multiple default providers for nexus_v3_repository: maven, raw, proxy, yum; using maven
```
since there is no fact to differentiate between providers, i didn't
choose a provider as the default
here is the --debug log of the puppet agent run
```
Debug: Prefetching maven resources for nexus_v3_repository
Debug: GET
https://nexus.internal.domain/service/rest/v1/repositories
Debug: GET
https://nexus.internal.domain/service/rest/v1/repositories/maven/hosted/maven-snapshots
Debug: GET
https://nexus.internal.domain/service/rest/v1/repositories/maven/hosted/maven-releases
Debug: GET
https://nexus.internal.domain/service/rest/v1/repositories/maven/hosted/maven
Debug: PUT
https://nexus.internal.domain/service/rest/v1/repositories/maven/hosted/maven {"name"=>"maven", "online"=>"true", "storage"=>{"blobStoreName"=>"maven", "strictContentTypeValidation"=>"true", "
writePolicy"=>"allow_once"}, "maven"=>{"versionPolicy"=>"MIXED", "layoutPolicy"=>"PERMISSIVE"}}
Debug: PUT
https://nexus.internal.domain/service/rest/v1/repositories/maven/hosted/maven {"name"=>"maven", "online"=>"true", "storage"=>{"blobStoreName"=>"maven", "strictContentTypeValidation"=>"true", "
writePolicy"=>"allow_once"}, "maven"=>{"versionPolicy"=>"MIXED", "layoutPolicy"=>"PERMISSIVE"}}
Debug: PUT
https://nexus.internal.domain/service/rest/v1/repositories/maven/hosted/maven {"name"=>"maven", "online"=>"true", "storage"=>{"blobStoreName"=>"maven", "strictContentTypeValidation"=>"true", "
writePolicy"=>"allow_once"}, "maven"=>{"versionPolicy"=>"MIXED", "layoutPolicy"=>"PERMISSIVE"}}
Debug: PUT
https://nexus.internal.domain/service/rest/v1/repositories/maven/hosted/maven {"name"=>"maven", "online"=>"true", "storage"=>{"blobStoreName"=>"maven", "strictContentTypeValidation"=>"true", "
writePolicy"=>"allow_once"}, "maven"=>{"versionPolicy"=>"MIXED", "layoutPolicy"=>"PERMISSIVE"}}
Debug: PUT
https://nexus.internal.domain/service/rest/v1/repositories/maven/hosted/maven {"name"=>"maven", "online"=>"true", "storage"=>{"blobStoreName"=>"maven", "strictContentTypeValidation"=>"true", "
writePolicy"=>"allow_once"}, "maven"=>{"versionPolicy"=>"MIXED", "layoutPolicy"=>"PERMISSIVE"}}
Notice: /Stage[main]/Profile_nexus/Nexus_v3::Repository::Maven::Hosted[maven]/Nexus_v3_repository[maven]/negative_cache_enabled: defined 'negative_cache_enabled' as 'true'
Notice: /Stage[main]/Profile_nexus/Nexus_v3::Repository::Maven::Hosted[maven]/Nexus_v3_repository[maven]/negative_cache_ttl: defined 'negative_cache_ttl' as 30
Notice: /Stage[main]/Profile_nexus/Nexus_v3::Repository::Maven::Hosted[maven]/Nexus_v3_repository[maven]/content_max_age: defined 'content_max_age' as 1440
Notice: /Stage[main]/Profile_nexus/Nexus_v3::Repository::Maven::Hosted[maven]/Nexus_v3_repository[maven]/metadata_max_age: defined 'metadata_max_age' as 1440
Notice: /Stage[main]/Profile_nexus/Nexus_v3::Repository::Maven::Hosted[maven]/Nexus_v3_repository[maven]/http_client_blocked: defined 'http_client_blocked' as 'false'
Notice: /Stage[main]/Profile_nexus/Nexus_v3::Repository::Maven::Hosted[maven]/Nexus_v3_repository[maven]/http_client_auto_block: defined 'http_client_auto_block' as 'true'
Notice: /Stage[main]/Profile_nexus/Nexus_v3::Repository::Maven::Hosted[maven]/Nexus_v3_repository[maven]/repodatadepth: defined 'repodatadepth' as 5
Notice: /Stage[main]/Profile_nexus/Nexus_v3::Repository::Maven::Hosted[maven]/Nexus_v3_repository[maven]/deploypolicy: defined 'deploypolicy' as 'STRICT'
Debug: /Stage[main]/Profile_nexus/Nexus_v3::Repository::Maven::Hosted[maven]/Nexus_v3_repository[maven]: The container Nexus_v3::Repository::Maven::Hosted[maven] will propagate my refresh event
Debug: /Stage[main]/Profile_nexus/Nexus_v3::Repository::Maven::Hosted[maven]/Nexus_v3_repository[maven]: The container Nexus_v3::Repository::Maven::Hosted[maven] will propagate my refresh event
Debug: /Stage[main]/Profile_nexus/Nexus_v3::Repository::Maven::Hosted[maven]/Nexus_v3_repository[maven]: The container Nexus_v3::Repository::Maven::Hosted[maven] will propagate my refresh event
Debug: /Stage[main]/Profile_nexus/Nexus_v3::Repository::Maven::Hosted[maven]/Nexus_v3_repository[maven]: The container Nexus_v3::Repository::Maven::Hosted[maven] will propagate my refresh event
Debug: /Stage[main]/Profile_nexus/Nexus_v3::Repository::Maven::Hosted[maven]/Nexus_v3_repository[maven]: The container Nexus_v3::Repository::Maven::Hosted[maven] will propagate my refresh event
Debug: /Stage[main]/Profile_nexus/Nexus_v3::Repository::Maven::Hosted[maven]/Nexus_v3_repository[maven]: The container Nexus_v3::Repository::Maven::Hosted[maven] will propagate my refresh event
Debug: /Stage[main]/Profile_nexus/Nexus_v3::Repository::Maven::Hosted[maven]/Nexus_v3_repository[maven]: The container Nexus_v3::Repository::Maven::Hosted[maven] will propagate my refresh event
Debug: /Stage[main]/Profile_nexus/Nexus_v3::Repository::Maven::Hosted[maven]/Nexus_v3_repository[maven]: The container Nexus_v3::Repository::Maven::Hosted[maven] will propagate my refresh event
Debug: Nexus_v3::Repository::Maven::Hosted[maven]: The container Class[Profile_nexus] will propagate my refresh event
```
it is clear that puppet cannot prefetch the values for
negative_cache_enabled (because it does not exists) so it tries to set
to the default value
what am i missing here? Why puppet wants to manage
`negative_cache_enabled` on the maven resources? i'm happy to show more
logs or code if it helps
thanks!
--
IRC: gfa
GPG: 0x27263FA42553615F904A7EBE2A40A2ECB8DAD8D5
OLD GPG: 0x44BB1BA79F6C6333