blob: ecfbc5a4b90600949baf988ac55e1da585a7265d [file] [log] [blame]
Adam Israeldcdf82b2017-08-15 15:26:43 -04001A Python library for Juju
2=========================
3
4Source code: https://github.com/juju/python-libjuju
5
6Bug reports: https://github.com/juju/python-libjuju/issues
7
8Documentation: https://pythonlibjuju.readthedocs.io/en/latest/
9
10
11Requirements
12------------
13
14* Python 3.5+
15* Juju 2.0+
16
17
18Design Notes
19------------
20
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(),
26 etc.)
27
28
29Installation
30------------
31
32.. code:: bash
33
34 pip3 install juju
35
36
37Quickstart
38----------
39Here's a simple example that shows basic usage of the library. The example
40connects to the currently active Juju model, deploys a single unit of the
41ubuntu charm, then exits.
42
43More examples can be found in the `examples/` directory of the source tree,
44and in the documentation.
45
46
47.. code:: python
48
49 #!/usr/bin/python3.5
50
51 import asyncio
52 import logging
53
54 from juju import loop
55 from juju.model import Model
56
57
58 async def deploy():
59 # Create a Model instance. We need to connect our Model to a Juju api
60 # server before we can use it.
61 model = Model()
62
63 # Connect to the currently active Juju model
64 await model.connect_current()
65
66 # Deploy a single unit of the ubuntu charm, using revision 0 from the
67 # stable channel of the Charm Store.
68 ubuntu_app = await model.deploy(
69 'ubuntu-0',
70 application_name='ubuntu',
71 series='xenial',
72 channel='stable',
73 )
74
75 # Disconnect from the api server and cleanup.
76 model.disconnect()
77
78
79 def main():
80 # Set logging level to debug so we can see verbose output from the
81 # juju library.
82 logging.basicConfig(level=logging.DEBUG)
83
84 # Quiet logging from the websocket library. If you want to see
85 # everything sent over the wire, set this to DEBUG.
86 ws_logger = logging.getLogger('websockets.protocol')
87 ws_logger.setLevel(logging.INFO)
88
89 # Run the deploy coroutine in an asyncio event loop, using a helper
90 # that abstracts loop creation and teardown.
91 loop.run(deploy())
92
93
94 if __name__ == '__main__':
95 main()