I'm personally more of a fan of what some programming languages call 
interfaces; a sort of contract if you will that a module implements. 

So for instance olindata::galera could look for any class that implements 
the IMysql interface. That way, I don't really need to worry if the 
end-user is using puppetlabs::mysql or example42::mysql, as long as they 
implement the IMysql interface I can guarantee it does what I need. 

This would have pretty heavy impact on how you write code right now, but it 
would be a rather elegant solution imho.

interface IMysql::server identified by 
'9ff3d80b-b02d-4994-b4da-e1ff205304ea' {
  Service['mysql']
  Package['mysql-server']
  File['apache2.conf']
}

class puppetlabs::mysql implements 
IMysql['9ff3d80b-b02d-4994-b4da-e1ff205304ea'] {
  [.. SNIP..]
  # file, service, package here like normal
}

class example42::mysql implements 
IMysql['9ff3d80b-b02d-4994-b4da-e1ff205304ea'] {
  [.. SNIP..]
  # file, service, package here like normal
}

class olindata::galera {
  package { 'galera':
    require => Package['IMysql::server::mysql-server']
  }
}

Or something along those lines. Question remains where the IMysql::server 
interface then needs to be declared, and how we would manage the GUID 
registration of interfaces.

Comments, thoughts?

Walter

On Tuesday, February 10, 2015 at 5:52:37 PM UTC+1, henrik lindberg wrote:
>
> On 2015-10-02 1:23, Trevor Vaughan wrote: 
> > I was talking with a few folks today about potential resolutions to 
> > module namespace issues. 
> > 
> > == Fundamental Issue == 
> > 
> > puppetlabs_apache -- Installs To --> apache 
> > example42_apache -- Installs To --> apache 
> > theforeman_apache -- Installs To --> apache 
> > 
> > You get my point... 
> > 
> > == Current Solutions == 
> > 
> > Right now, there are two ways to solve this problem if you want some of 
> > your nodes to use puppetlabs_apache and others to use theforeman_apache. 
> > 
> > 1) Modify the module and force the namespace: 
> >    - puppetlabs_apache -- Installs To --> puppetlabs_apache 
> >    - theforeman_apache -- Installs To --> theforeman_apache 
> > 
> >    * Isssue: You can't just use outside code at will. You have to modify 
> > *everything* that uses the above code. 
> > 
> > 2) You have to create a separate environment for each host group 
> > (potentially each host) that you want to have use the differing code. 
> > 
> >     * Issue: This is a LOT of overhead for a couple of modules and may 
> > have other ramifications in terms of performance as you get up in 
> number. 
> > 
> > So, would it be possible to allow multiple versions of a module to exist 
> > in the same namespace but only use one during a given run? 
> > 
>
> Basically no, this is not possible without adding some kind of mechanism 
> to filter out modules on the modulepath. This will need to be done per 
> environment anyway. Remember that modules can contribute all sorts of 
> extensions to puppet (faces, indirections, facts, functions, types, and 
> with future parser also bindings). For performance reasons (and 
> bootstrapping, etc.) these are scanned when the environment loads (some 
> scans are lazy, but may take place before manifests really starts to be 
> evaluated). 
>
> - henrik 
>
> > == The First Proposal == 
> > 
> > Inspired by RVM Gemsets, how about allowing modules to declare which 
> > version of a given module they will use? 
> > 
> > /etc/puppet/modules/apache/puppetlabs/{files,modules,manifests} 
> > /etc/puppet/modules/apache/theforeman/{files,modules,manifests} 
> > /etc/puppet/modules/apache/<author>/{files,modules,manifests} 
> > 
> > Then, use could be dictated by something like: include 
> apache@puppetlabs. 
> > 
> > Unfortunately, this really comes down to the parser being able to 
> > understand the following: 
> > 
> > include apache => See if there are any @'s and use that one 
> > include apache@puppetlabs => include the Puppetlabs apache 
> > include apache@puppetlabs && include apache@theforeman => Fail, conflict 
> > 
> > == Alternative == 
> > 
> > One possible alternative is to just use the metadata.json file to 
> > dictate which module will be used when loading other modules. 
> > 
> > Again, if there is a conflict, that is a failure but *only* if the code 
> > attempts to use both at the same time. 
> > 
> > The benefit here is that it should make things very unambiguous while 
> > the drawback (if it really is) is that you *must* put a metadata.json 
> > file in every module that you create. 
> > 
> > This is just a set of thoughts that I hope get us moving in a direction 
> > where this type of thing is possible and I look forward to hearing what 
> > people think (good, bad, or ugly)! 
> > 
> > Thanks, 
> > 
> > Trevor 
> > 
> > -- 
> > Trevor Vaughan 
> > Vice President, Onyx Point, Inc 
> > (410) 541-6699 
> > [email protected] <javascript:> <mailto:[email protected] 
> <javascript:>> 
> > 
> > -- This account not approved for unencrypted proprietary information -- 
> > 
> > -- 
> > You received this message because you are subscribed to the Google 
> > Groups "Puppet Developers" group. 
> > To unsubscribe from this group and stop receiving emails from it, send 
> > an email to [email protected] <javascript:> 
> > <mailto:[email protected] <javascript:>>. 
> > To view this discussion on the web visit 
> > 
> https://groups.google.com/d/msgid/puppet-dev/CANs%2BFoU2unExPve9ig%3DinW9obDpwii7gBi6W4RkHycViibJp-g%40mail.gmail.com
>  
> > <
> https://groups.google.com/d/msgid/puppet-dev/CANs%2BFoU2unExPve9ig%3DinW9obDpwii7gBi6W4RkHycViibJp-g%40mail.gmail.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/ 
>
>

-- 
You received this message because you are subscribed to the Google Groups 
"Puppet Developers" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/puppet-dev/d171f0ce-4d7b-41fb-8722-98e0c8244e92%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to