A Python library for Juju ========================= Source code: https://github.com/juju/python-libjuju Bug reports: https://github.com/juju/python-libjuju/issues Documentation: https://pythonlibjuju.readthedocs.io/en/latest/ Requirements ------------ * Python 3.5+ * Juju 2.0+ Design Notes ------------ * Asynchronous - uses asyncio and async/await features of python 3.5 * Websocket-level bindings are programmatically generated (indirectly) from the Juju golang code, ensuring full api coverage * Provides an OO layer which encapsulates much of the websocket api and provides familiar nouns and verbs (e.g. Model.deploy(), Application.add_unit(), etc.) Installation ------------ .. code:: bash pip3 install juju Quickstart ---------- Here's a simple example that shows basic usage of the library. The example connects to the currently active Juju model, deploys a single unit of the ubuntu charm, then exits: .. code:: python #!/usr/bin/python3 import logging import sys from juju import loop from juju.model import Model async def deploy(): # Create a Model instance. We need to connect our Model to a Juju api # server before we can use it. model = Model() # Connect to the currently active Juju model await model.connect_current() try: # Deploy a single unit of the ubuntu charm, using the latest revision # from the stable channel of the Charm Store. ubuntu_app = await model.deploy( 'ubuntu', application_name='ubuntu', series='xenial', channel='stable', ) if '--wait' in sys.argv: # optionally block until the application is ready await model.block_until(lambda: ubuntu_app.status == 'active') finally: # Disconnect from the api server and cleanup. await model.disconnect() def main(): logging.basicConfig(level=logging.INFO) # If you want to see everything sent over the wire, set this to DEBUG. ws_logger = logging.getLogger('websockets.protocol') ws_logger.setLevel(logging.INFO) # Run the deploy coroutine in an asyncio event loop, using a helper # that abstracts loop creation and teardown. loop.run(deploy()) if __name__ == '__main__': main() More examples can be found in the docs, as well as in the ``examples/`` directory of the source tree which can be run using ``tox``. For example, to run ``examples/connect_current_model.py``, use: .. code:: bash tox -e example -- examples/connect_current_model.py