Fix unitrun example
authorTim Van Steenburgh <tvansteenburgh@gmail.com>
Fri, 7 Oct 2016 16:40:37 +0000 (12:40 -0400)
committerTim Van Steenburgh <tvansteenburgh@gmail.com>
Fri, 7 Oct 2016 16:40:37 +0000 (12:40 -0400)
examples/unitrun.py

index 88c43bf..0f8b556 100644 (file)
@@ -1,49 +1,60 @@
 """
-Run this one against a model that has at least one unit deployed.
+This example:
+
+1. Connects to current model and resets it.
+2. Deploys one ubuntu unit.
+3. Runs an action against the unit.
+4. Waits for the action results to come back, then exits.
 
 """
 import asyncio
-import functools
 import logging
 
-from juju.model import Model
-from juju.unit import Unit
-from juju.client.connection import Connection
-
-
-loop = asyncio.get_event_loop()
-conn = loop.run_until_complete(Connection.connect_current())
-
-_seen_units = set()
+from juju.model import Model, ModelObserver
 
 
 async def run_stuff_on_unit(unit):
-    if unit.name in _seen_units:
-        return
-
     print('Running command on unit', unit.name)
+
     # unit.run() returns a client.ActionResults instance
     action_results = await unit.run('unit-get public-address')
-    _seen_units.add(unit.name)
     action_result = action_results.results[0]
 
     print('Results from unit', unit.name)
     print(action_result.__dict__)
 
 
-def on_model_change(delta, old, new, model):
-    if isinstance(new, Unit):
-        task = loop.create_task(run_stuff_on_unit(new))
+class MyModelObserver(ModelObserver):
+    async def on_unit_add(self, delta, old, new, model):
+        loop.create_task(run_stuff_on_unit(new))
 
-    if delta.entity == 'action':
+    async def on_action_change(self, delta, old, new, model):
         print(delta.data)
-        print(new)
 
+        action = new
+        if action.status == 'completed':
+            await action.model.disconnect()
+            action.model.loop.stop()
+
+
+async def run():
+    model = Model()
+    await model.connect_current()
+    await model.reset(force=True)
+    model.add_observer(MyModelObserver())
 
-async def watch_model():
-    model = Model(conn)
-    model.add_observer(on_model_change)
-    await model.watch()
+    await model.deploy(
+        'ubuntu-0',
+        service_name='ubuntu',
+        series='trusty',
+        channel='stable',
+    )
 
-logging.basicConfig(level=logging.INFO)
-loop.run_until_complete(watch_model())
+
+logging.basicConfig(level=logging.DEBUG)
+ws_logger = logging.getLogger('websockets.protocol')
+ws_logger.setLevel(logging.INFO)
+loop = asyncio.get_event_loop()
+loop.set_debug(False)
+loop.create_task(run())
+loop.run_forever()