Leadership layer released
Merlijn Sebrechts
merlijn.sebrechts at gmail.com
Thu Jan 28 15:47:22 UTC 2016
Hi Marco
Just to be clear, I was talking about wrapping the code to set a state that
shows if something changed. I wasn't sure how to implement this. States are
saved across hook invocations but 'x.changed' should be removed at the end
of a hook invocation. Stuart's code solves this problem by updating the
'x.changed' state at the start of each hook invocation using
hookenv.atstart().
Kind regards
Merlijn
2016-01-28 16:33 GMT+01:00 Marco Ceppi <marco.ceppi at canonical.com>:
> I agree, I was just mulling over how to document all of these layers,
> something we all should discuss in Belgium at the Summit. As for wrapping,
> you shouldn't really need to wrap it since it's just a layer!
>
> Awesome job with this layer, loving its implementation!
>
> On Thu, Jan 28, 2016 at 10:29 AM Merlijn Sebrechts <
> merlijn.sebrechts at gmail.com> wrote:
>
>> These 'changed.x' states are really useful! I wanted something like this
>> in my own layers, but I wasn't sure on how to implement it..
>>
>> It might be good to include this in the docs? Or maybe write a nice
>> wrapper around this logic so it can be easily used in other layers? I know
>> I will use it...
>>
>> 2016-01-28 15:42 GMT+01:00 Cory Johns <cory.johns at canonical.com>:
>>
>>> 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.bishop at 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.bishop at 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.bishop at canonical.com>
>>>>
>>>> --
>>>> Juju mailing list
>>>> Juju at lists.ubuntu.com
>>>> Modify settings or unsubscribe at:
>>>> https://lists.ubuntu.com/mailman/listinfo/juju
>>>>
>>>
>>>
>>> --
>>> Juju mailing list
>>> Juju at lists.ubuntu.com
>>> Modify settings or unsubscribe at:
>>> https://lists.ubuntu.com/mailman/listinfo/juju
>>>
>>>
>> --
>> Juju mailing list
>> Juju at lists.ubuntu.com
>> Modify settings or unsubscribe at:
>> https://lists.ubuntu.com/mailman/listinfo/juju
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.ubuntu.com/archives/juju/attachments/20160128/62eba668/attachment.html>
More information about the Juju
mailing list