Unit.run() docs
authorTim Van Steenburgh <tvansteenburgh@gmail.com>
Thu, 15 Dec 2016 17:08:55 +0000 (12:08 -0500)
committerTim Van Steenburgh <tvansteenburgh@gmail.com>
Thu, 15 Dec 2016 17:08:55 +0000 (12:08 -0500)
docs/narrative/application.rst
docs/narrative/index.rst
docs/narrative/unit.rst [new file with mode: 0644]
examples/unitrun.py
juju/unit.py

index 630ce85..044807d 100644 (file)
@@ -39,14 +39,14 @@ added units (:class:`~juju.unit.Unit` objects) is returned.
 
 .. code:: python
 
-    ubuntu_app = await model.deploy(
-        'ubuntu',
-        application_name='ubuntu',
-        series='trusty',
-        channel='stable',
-    )
-
-    unit_a, unit_b = await ubuntu_app.add_units(count=2)
+  ubuntu_app = await model.deploy(
+      'ubuntu',
+      application_name='ubuntu',
+      series='trusty',
+      channel='stable',
+  )
+
+  unit_a, unit_b = await ubuntu_app.add_units(count=2)
 
 
 Updating Config and Constraints
index ac5b816..eb77e4c 100644 (file)
@@ -8,3 +8,4 @@ Narrative Docs
    controller
    model
    application
+   unit
diff --git a/docs/narrative/unit.rst b/docs/narrative/unit.rst
new file mode 100644 (file)
index 0000000..8267df7
--- /dev/null
@@ -0,0 +1,33 @@
+Units
+=====
+
+Running Commands
+----------------
+Run arbitrary commands on a unit with the
+:meth:`juju.unit.Unit.run` method. This method blocks
+the current coroutine until a result is available, and
+returns a :class:`juju.action.Action` instance.
+
+
+.. code:: python
+
+  from juju.model import Model
+
+  model = Model()
+  await model.connect_current()
+
+  ubuntu_app = await model.deploy(
+      'ubuntu',
+      application_name='ubuntu',
+      series='trusty',
+      channel='stable',
+  )
+
+  for unit in app.units:
+      action = await unit.run('unit-get public-address')
+      print(action.results)
+
+      action = await unit.run('uname -a')
+      print(action.results)
+
+
index 0436259..9d4e5d7 100644 (file)
@@ -10,39 +10,35 @@ This example:
 import asyncio
 import logging
 
-from juju.model import Model, ModelObserver
+from juju.model import Model
 
-async def run_stuff_on_unit(unit):
-    print('Running command on unit', unit.name)
-
-    # unit.run() returns a client.ActionResults instance
-    action = await unit.run('unit-get public-address')
-
-    print("Action results: {}".format(action.results))
-
-    # Inform asyncio that we're done.
-    await unit.model.disconnect()
-    unit.model.loop.stop()
 
+async def run_command(unit):
+    logging.debug('Running command on unit %s', unit.name)
 
-class MyModelObserver(ModelObserver):
-    async def on_unit_add(self, delta, old, new, model):
-        loop.create_task(run_stuff_on_unit(new))
+    # unit.run() returns a juju.action.Action instance
+    action = await unit.run('unit-get public-address')
+    logging.debug("Action results: %s", action.results)
 
 
 async def run():
     model = Model()
     await model.connect_current()
     await model.reset(force=True)
-    model.add_observer(MyModelObserver())
 
-    await model.deploy(
+    app = await model.deploy(
         'ubuntu-0',
         application_name='ubuntu',
         series='trusty',
         channel='stable',
     )
 
+    for unit in app.units:
+        await run_command(unit)
+
+    await model.disconnect()
+    model.loop.stop()
+
 
 logging.basicConfig(level=logging.DEBUG)
 ws_logger = logging.getLogger('websockets.protocol')
index ab9d1d0..ea51345 100644 (file)
@@ -106,6 +106,7 @@ class Unit(model.ModelEntity):
 
         :param str command: The command to run
         :param int timeout: Time to wait before command is considered failed
+        :returns: A :class:`juju.action.Action` instance.
 
         Returns a tuple containing the stdout, stderr, and return code
         from the command.
@@ -131,11 +132,12 @@ class Unit(model.ModelEntity):
 
         :param str action_name: Name of action to run
         :param \*\*params: Action parameters
-        :returns: A`juju.action.Action` instance.
+        :returns: A :class:`juju.action.Action` instance.
 
         Note that this only enqueues the action.  You will need to call
         ``action.wait()`` on the resulting `Action` instance if you wish
         to block until the action is complete.
+
         """
         action_facade = client.ActionFacade()
         action_facade.connect(self.connection)