Refactor model state management.
[osm/N2VC.git] / examples / relate.py
index 967a785..bdfb2d7 100644 (file)
@@ -1,5 +1,10 @@
 """
-Deploy two charms and relate them.
+This example:
+
+1. Connects to the current model
+2. Resets it
+3. Deploys two charms and relates them
+4. Waits for units to be idle, then exits
 
 """
 import asyncio
@@ -8,22 +13,33 @@ import logging
 from juju.model import Model, ModelObserver
 
 
+class MyRemoveObserver(ModelObserver):
+    async def on_change(self, delta, old, new, model):
+        if delta.type == 'remove':
+            assert(new.latest() == new)
+            assert(new.next() is None)
+            assert(new.dead)
+            assert(new.current)
+            assert(new.connected)
+            assert(new.previous().dead)
+            assert(not new.previous().current)
+            assert(not new.previous().connected)
+
+
 class MyModelObserver(ModelObserver):
-    def on_change(self, delta, old, new, model):
+    async def on_change(self, delta, old, new, model):
         if model.all_units_idle():
             logging.debug('All units idle, disconnecting')
-            task = model.loop.create_task(model.disconnect())
-            task.add_done_callback(lambda fut: model.loop.stop())
+            await model.disconnect()
+            model.loop.stop()
 
 
 async def run():
     model = Model()
     await model.connect_current()
 
+    model.add_observer(MyRemoveObserver())
     await model.reset(force=True)
-    await model.block_until(
-        lambda: len(model.machines) == 0
-    )
     model.add_observer(MyModelObserver())
 
     await model.deploy(
@@ -44,10 +60,10 @@ async def run():
         'nrpe',
     )
 
-
 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()