Merge pull request #25 from juju/local-bundle-deploy
authorTim Van Steenburgh <tvansteenburgh@gmail.com>
Wed, 30 Nov 2016 14:09:18 +0000 (09:09 -0500)
committerGitHub <noreply@github.com>
Wed, 30 Nov 2016 14:09:18 +0000 (09:09 -0500)
Add support for deploying local bundles

juju/application.py
juju/model.py
juju/placement.py
juju/unit.py

index 83c2275..74f9057 100644 (file)
@@ -88,7 +88,7 @@ class Application(model.ModelEntity):
 
         result = await app_facade.AddUnits(
             application=self.name,
-            placement=[parse_placement(to)],
+            placement=[parse_placement(to)] if to else None,
             num_units=count,
         )
 
index ad061aa..0ba79df 100644 (file)
@@ -1270,7 +1270,7 @@ class Model(object):
                     raise Exception(error.message)
 
             for metric in entity_metrics.metrics:
-                metrics[metric.unit].append(metric.to_json())
+                metrics[metric.unit].append(vars(metric))
 
         return metrics
 
index 62cd570..6f91aed 100644 (file)
@@ -6,9 +6,10 @@
 # module should be deprecated.
 #
 
+from .client import client
+
 MACHINE_SCOPE = "#"
 
-from .client import client
 
 def parse(directive):
     """
@@ -17,7 +18,7 @@ def parse(directive):
     back over the websocket API.
 
     """
-    if directive == "":
+    if not directive:
         # Handle null case
         return None
 
index 8511a47..cad4bb7 100644 (file)
@@ -227,18 +227,24 @@ class Unit(model.ModelEntity):
 
         status = await c.FullStatus(None)
 
-        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.
+        # FullStatus may be more up to date than our model, and the
+        # unit may have gone away, or we may be doing something silly,
+        # like trying to fetch leadership for a subordinate, which
+        # will not be filed where we expect in the model. In those
+        # cases, we may simply return False, as a nonexistent or
+        # subordinate unit is not a leader.
+        if not status.applications.get(app):
             return False
 
+        if not status.applications[app].get('units'):
+            return False
+
+        if not status.applications[app]['units'].get(self.name):
+            return False
+
+        return status.applications[app]['units'][self.name].get('leader', False)
+
+
     async def get_metrics(self):
         metrics = await self.model.get_metrics(self.tag)
         return metrics[self.name]