This is awesome. A very clean interface for dealing with leadership in layered charms.
I also very much like the pattern of having states that notify of changes to the leadership settings and think this pattern could apply well to config settings. One addition I would suggest to that pattern would be to also have a blanket `leadership.changed` state that would be set when *any* value was changed. This is mostly to handle the case where you need to react to any of a set of multiple values changing. Thoughts? Thanks for creating this! On Wed, Jan 27, 2016 at 11:35 PM, Stuart Bishop <stuart.bis...@canonical.com > wrote: > Hi. > > I've put up my Leadership layer on http://interfaces.juju.solutions/. > This work was broken out from my PostgreSQL charm refactorings and > will also be used by the Cassandra charm when I get onto that. It is > obviously small and focused on leadership; I had been considering > consolidating a number of similar parts into a swiss army knife > 'hookenv' layer, but decided that smaller bricks are more in the > spirit of layered charms and avoids most feature creep. > > # Leadership Layer for Juju Charms > > The Leadership layer is for charm-tools and 'charm build', making it > easier for layered charms to deal with Juju leadership. > > This layer will initialize charms.reactive states, allowing you to > write handlers that will be activated by these states. It allows you > to completely avoid writing leader-elected and leader-settings-changed > hooks. As a simple example, these two handlers are all that is required > to make the leader unit generate a password if it is not already set, > and have the shared password stored in a file on all units: > > ```python > from reactive.leadership import leader_get, leader_set > from charmhelpers.core.host import pwgen > > > @when('leadership.is_leader') > @when_not('leadership.set.admin_password') > def generate_secret(): > leader_set(admin_password=pwgen()) > > > @when('leadership.changed.admin_password') > def store_secret(): > write_file('/etc/foopass', leader_get('admin_password')) > ``` > > > ## States > > The following states are set appropriately on startup, before any @hook > decorated methods are invoked: > > * `leadership.is_leader` > > This state is set when the unit is the leader. The unit will remain > the leader for the remainder of the hook, but may not be leader in > future hooks. > > * `leadership.set.{varname}` > > This state is set for each leadership setting (ie. the > `leadership.set.foo` state will be set if the leader has set > the foo leadership setting to any value). It will remain > set for the remainder of the hook, unless the unit is the leader > and calls `reactive.leadership.leader_set()` and resets the value > to None. > > * `leadership.changed.{varname}` > > This state is set for each leadership setting that has changed > since the last hook. It will remain set for the remainder of the > hook. It will not be set in the next hook, unless the leader has > changed the leadership setting yet again. > > > ## Methods > > The `reactive.leadership` module exposes the `leader_set()` and > `leader_get()` methods, which match the methods found in the > `charmhelpers.core.hookenv` module. `reactive.leadership.leader_set()` > should be used instead of the charmhelpers function to ensure that > the reactive state is updated when the leadership settings are. If you > do not do this, then you risk handlers waiting on these states to not > be run on the leader (because when the leader changes settings, it > triggers leader-settings-changed hooks on the follower units but > no hooks on itself). > > > ## Support > > This layer is maintained on Launchpad by > Stuart Bishop (stuart.bis...@canonical.com). > > Code is available using git at git+ssh:// > git.launchpad.net/leadership-layer. > > Bug reports can be made at https://bugs.launchpad.net/leadership-layer. > > Queries and comments can be made on the Juju mailing list, Juju IRC > channels, or at https://answers.launchpad.net/leadership-layer. > > > -- > Stuart Bishop <stuart.bis...@canonical.com> > > -- > Juju mailing list > Juju@lists.ubuntu.com > Modify settings or unsubscribe at: > https://lists.ubuntu.com/mailman/listinfo/juju >
-- Juju mailing list Juju@lists.ubuntu.com Modify settings or unsubscribe at: https://lists.ubuntu.com/mailman/listinfo/juju