From 46068aa5a109559d884022e77ab0a4b864d9b4ad Mon Sep 17 00:00:00 2001 From: Pete Vander Giessen Date: Mon, 21 Nov 2016 16:49:40 -0500 Subject: [PATCH] Added .is_leader method to Unit class. As leadership is not exposed via deltas in the current version of the juju websocket api, we have to spin up a ClientFacade and dig through FullStatus for the information we need. A ticket for adding leadership info to the deltas lives here: https://bugs.launchpad.net/juju/+bug/1643691 --- examples/leadership.py | 26 ++++++++++++++++++++++++++ juju/unit.py | 23 +++++++++++++++++++++++ 2 files changed, 49 insertions(+) create mode 100644 examples/leadership.py diff --git a/examples/leadership.py b/examples/leadership.py new file mode 100644 index 0000000..c52de60 --- /dev/null +++ b/examples/leadership.py @@ -0,0 +1,26 @@ +""" +This example: + +1. Connects to the current model. +2. Prints out leadership status for all deployed units in the model. +3. Cleanly disconnects. + +""" +import asyncio + +from juju.model import Model + +async def report_leadership(): + model = Model() + await model.connect_current() + + print("Leadership: ") + for app in model.applications.values(): + for unit in app.units: + print("{}: {}".format( + unit.name, await unit.is_leader_from_status())) + + await model.disconnect() + +loop = asyncio.get_event_loop() +loop.run_until_complete(report_leadership()) diff --git a/juju/unit.py b/juju/unit.py index 3dbc1e9..0757aa7 100644 --- a/juju/unit.py +++ b/juju/unit.py @@ -178,3 +178,26 @@ class Unit(model.ModelEntity): """ pass + + async def is_leader_from_status(self): + """ + Check to see if this unit is the leader. Returns True if so, and + False if it is not, or if leadership does not make sense + (e.g., there is no leader in this application.) + + This method is a kluge that calls FullStatus in the + ClientFacade to get its information. Once + https://bugs.launchpad.net/juju/+bug/1643691 is resolved, we + should add a simple .is_leader property, and deprecate this + method. + + """ + app = self.name.split("/")[0] + + c = client.ClientFacade() + c.connect(self.model.connection) + + status = await c.FullStatus(None) + + return status.applications[app]['units'][self.name].get( + 'leader', False) -- 2.25.1