Refactor model state management.
[osm/N2VC.git] / examples / relate.py
1 """
2 This example:
3
4 1. Connects to the current model
5 2. Resets it
6 3. Deploys two charms and relates them
7 4. Waits for units to be idle, then exits
8
9 """
10 import asyncio
11 import logging
12
13 from juju.model import Model, ModelObserver
14
15
16 class MyRemoveObserver(ModelObserver):
17 async def on_change(self, delta, old, new, model):
18 if delta.type == 'remove':
19 assert(new.latest() == new)
20 assert(new.next() is None)
21 assert(new.dead)
22 assert(new.current)
23 assert(new.connected)
24 assert(new.previous().dead)
25 assert(not new.previous().current)
26 assert(not new.previous().connected)
27
28
29 class MyModelObserver(ModelObserver):
30 async def on_change(self, delta, old, new, model):
31 if model.all_units_idle():
32 logging.debug('All units idle, disconnecting')
33 await model.disconnect()
34 model.loop.stop()
35
36
37 async def run():
38 model = Model()
39 await model.connect_current()
40
41 model.add_observer(MyRemoveObserver())
42 await model.reset(force=True)
43 model.add_observer(MyModelObserver())
44
45 await model.deploy(
46 'ubuntu-0',
47 service_name='ubuntu',
48 series='trusty',
49 channel='stable',
50 )
51 await model.deploy(
52 'nrpe-11',
53 service_name='nrpe',
54 series='trusty',
55 channel='stable',
56 num_units=0,
57 )
58 await model.add_relation(
59 'ubuntu',
60 'nrpe',
61 )
62
63 logging.basicConfig(level=logging.DEBUG)
64 ws_logger = logging.getLogger('websockets.protocol')
65 ws_logger.setLevel(logging.INFO)
66 loop = asyncio.get_event_loop()
67 loop.set_debug(False)
68 loop.create_task(run())
69 loop.run_forever()