Defining a charm that supports multiple interfaces for the same relationship

Clint Byrum clint at ubuntu.com
Mon Nov 5 18:26:32 UTC 2012


Excerpts from Bruno Girin's message of 2012-11-05 08:23:46 -0800:
> Hi all,
> 
> I had a chat with Marco on Thursday about supporting multiple interfaces
> on the same relationship and we couldn't come to a sensible conclusion
> (beer may not have helped) so we concluded that we should put the
> question to the wisdom of the mailing list. Here goes.
> 
> Use case: say you have a web app that needs to connect to a database and
> supports either MySQL or PostgreSQL. How should I define that in
> metadata.yaml and how do I handle it in the relation-changed hook?
> 
> If I specify this:
> 
> requires:
>   db1:
>     interface: mysql
>   db2:
>     interface: postgresql
> 
> it's a bit verbose and does not enforce the fact that I want either db1
> or db2 but not both. Can I use the same name for both relationships? As in:
> 
> requires:
>   db:
>     interface: mysql
>   db:
>     interface: postgresql
> 
> Or even specify several interfaces for the same relationship:
> 
> requires:
>   db:
>     interface: mysql
>     interface: postgresql
> 
> Or even better:
> 
> requires:
>   db:
>     interface: [ mysql, postgresql ]
> 

None of the solutions presented make it easy for the hook author to
know which database driver to use. The appropriate solution is like your
first solution, but with names that make more sense:

requires:
  db-mysql:
    interface: mysql
  db-postgres
    interface: postgresql

This allows you to know, by the name of the hook executable, which
interface to expect, since you will be in

db-mysql-relation-joined

or

db-postgres-relation-joined

You can even make these symlinks to the same script if you want, because
argv[0] will still be the name that was executed.



More information about the Juju mailing list