241d1a69411325790e14f0197edfbe3ef45221d3
4 1. Connects to the current model
6 3. Deploys two charms and relates them
7 4. Waits for units to be idle, then exits
13 from juju
.model
import Model
, ModelObserver
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)
24 assert(new
.previous().dead
)
25 assert(not new
.previous().current
)
26 assert(not new
.previous().connected
)
29 class MyModelObserver(ModelObserver
):
30 _shutting_down
= False
32 async def on_change(self
, delta
, old
, new
, model
):
33 if model
.units
and model
.all_units_idle() and not self
._shutting
_down
:
34 self
._shutting
_down
= True
35 logging
.debug('All units idle, disconnecting')
36 await model
.reset(force
=True)
37 await model
.disconnect()
43 await model
.connect_current()
45 model
.add_observer(MyRemoveObserver())
46 await model
.reset(force
=True)
47 model
.add_observer(MyModelObserver())
49 ubuntu_app
= await model
.deploy(
51 service_name
='ubuntu',
55 ubuntu_app
.on_change(asyncio
.coroutine(
56 lambda delta
, old_app
, new_app
, model
:
57 print('App changed: {}'.format(new_app
.entity_id
))
59 ubuntu_app
.on_remove(asyncio
.coroutine(
60 lambda delta
, old_app
, new_app
, model
:
61 print('App removed: {}'.format(old_app
.entity_id
))
63 ubuntu_app
.on_unit_add(asyncio
.coroutine(
64 lambda delta
, old_unit
, new_unit
, model
:
65 print('Unit added: {}'.format(new_unit
.entity_id
))
67 ubuntu_app
.on_unit_remove(asyncio
.coroutine(
68 lambda delta
, old_unit
, new_unit
, model
:
69 print('Unit removed: {}'.format(old_unit
.entity_id
))
78 my_relation
= await model
.add_relation(
82 my_relation
.on_remove(asyncio
.coroutine(
83 lambda delta
, old_rel
, new_rel
, model
:
84 print('Relation removed: {}'.format(old_rel
.endpoints
))
87 logging
.basicConfig(level
=logging
.DEBUG
)
88 ws_logger
= logging
.getLogger('websockets.protocol')
89 ws_logger
.setLevel(logging
.INFO
)
90 loop
= asyncio
.get_event_loop()
92 loop
.create_task(run())