Merge pull request #16 from petevg/bug/keyerror-in-is-leader
authorTim Van Steenburgh <tvansteenburgh@gmail.com>
Tue, 22 Nov 2016 21:20:29 +0000 (16:20 -0500)
committerGitHub <noreply@github.com>
Tue, 22 Nov 2016 21:20:29 +0000 (16:20 -0500)
Added a catch for the case where we call is_leader_from_status on a destroyed unit.

1  2 
juju/unit.py

diff --combined juju/unit.py
@@@ -161,9 -161,9 +161,9 @@@ class Unit(model.ModelEntity)
              raise Exception('Unknown action error: %s' % error.serialize())
          action_id = action.tag[len('action-'):]
          log.debug('Action started as %s', action_id)
 -        # we can't use wait_for_new here because we don't
 -        # consistently (ever?) get an "add" delta for the action
 -        return await self.model._wait('action', action_id, None)
 +        # we mustn't use wait_for_action because that blocks until the
 +        # action is complete, rather than just being in the model
 +        return await self.model._wait_for_new('action', action_id)
  
      def scp(
              self, source_path, user=None, destination_path=None, proxy=False,
  
          status = await c.FullStatus(None)
  
-         return status.applications[app]['units'][self.name].get(
-             'leader', False)
+         try:
+             return status.applications[app]['units'][self.name].get(
+                 'leader', False)
+         except KeyError:
+             # FullStatus may be more up-to-date than the model
+             # referenced by this class. If this unit has been
+             # destroyed between the time the class was created and the
+             # time that we call this method, we'll get a KeyError. In
+             # that case, we simply return False, as a destroyed unit
+             # is not a leader.
+             return False