1 A Python library for Juju
2 =========================
4 Source code: https://github.com/juju/python-libjuju
6 Bug reports: https://github.com/juju/python-libjuju/issues
8 Documentation: https://pythonhosted.org/juju/
21 * Asynchronous - uses asyncio and async/await features of python 3.5
22 * Websocket-level bindings are programmatically generated (indirectly) from the
23 Juju golang code, ensuring full api coverage
24 * Provides an OO layer which encapsulates much of the websocket api and
25 provides familiar nouns and verbs (e.g. Model.deploy(), Application.add_unit(),
39 Here's a simple example that shows basic usage of the library. The example
40 connects to the currently active Juju model, deploys a single unit of the
41 ubuntu charm, then exits.
43 More examples can be found in the `examples/` directory of the source tree,
44 and in the documentation.
54 from juju.model import Model
58 # Create a Model instance. We need to connect our Model to a Juju api
59 # server before we can use it.
62 # Connect to the currently active Juju model
63 await model.connect_current()
65 # Deploy a single unit of the ubuntu charm, using revision 0 from the
66 # stable channel of the Charm Store.
67 ubuntu_app = await model.deploy(
69 application_name='ubuntu',
74 # Disconnect from the api server and cleanup.
77 # Stop the asyncio event loop.
82 # Set logging level to debug so we can see verbose output from the
84 logging.basicConfig(level=logging.DEBUG)
86 # Quiet logging from the websocket library. If you want to see
87 # everything sent over the wire, set this to DEBUG.
88 ws_logger = logging.getLogger('websockets.protocol')
89 ws_logger.setLevel(logging.INFO)
91 # Create the asyncio event loop
92 loop = asyncio.get_event_loop()
94 # Queue up our `run()` coroutine for execution
95 loop.create_task(run())
97 # Start the event loop
101 if __name__ == '__main__':