"""
-Run this one against a model that has at least one unit deployed.
+This example:
+
+1. Connects to the current model
+2. Deploy a charm and waits until it reports itself active
+3. Destroys the unit and application
"""
-import asyncio
-import logging
-
-from juju.model import Model, ModelObserver
-from juju.client.connection import Connection
-
-
-loop = asyncio.get_event_loop()
-conn = loop.run_until_complete(Connection.connect_current())
-model = Model(conn)
-
-
-class MyModelObserver(ModelObserver):
- def on_unit_add(self, delta, old, new, model):
- logging.info(
- 'New unit added: %s', new.name)
-
- def on_change(self, delta, old, new, model):
- for unit in model.units.values():
- unit_status = unit.data['agent-status']['current']
- logging.info(
- 'Unit %s status: %s', unit.name, unit_status)
- if unit_status == 'idle':
- logging.info(
- 'Destroying unit %s', unit.name)
- loop.create_task(unit.destroy())
-
- def on_unit_remove(self, delta, old, new, model):
- app_name = old.application
- app = model.applications[app_name]
- if not app.units:
- logging.info(
- 'Destroying application %s', app.name)
- loop.create_task(app.destroy())
-
-
-async def run():
- model.add_observer(MyModelObserver())
- await model.deploy(
- 'ubuntu-0',
- service_name='ubuntu',
- series='trusty',
- channel='stable',
- )
- await model.watch()
-
-logging.basicConfig(level=logging.INFO)
-loop.create_task(run())
-loop.run_forever()
+from juju import loop
+from juju.model import Model
+
+
+async def main():
+ model = Model()
+ print('Connecting to model')
+ await model.connect_current()
+
+ try:
+ print('Deploying ubuntu')
+ application = await model.deploy(
+ 'ubuntu-10',
+ application_name='ubuntu',
+ series='trusty',
+ channel='stable',
+ )
+
+ print('Waiting for active')
+ await model.block_until(
+ lambda: all(unit.workload_status == 'active'
+ for unit in application.units))
+
+ print('Removing ubuntu')
+ await application.remove()
+ finally:
+ print('Disconnecting from model')
+ await model.disconnect()
+
+
+loop.run(main())