X-Git-Url: https://osm.etsi.org/gitweb/?a=blobdiff_plain;f=juju%2Funit.py;h=37d45d3fc3ca43f517507ecc7f664db13052a68e;hb=c7aa2a9872c31ca6be58f3a95b42e7bd0c14c116;hp=4b24331a54fad487e58eb4d0136b81a774894a28;hpb=3a10e9365e5946c806219b870a464983ab4d879c;p=osm%2FN2VC.git diff --git a/juju/unit.py b/juju/unit.py index 4b24331..37d45d3 100644 --- a/juju/unit.py +++ b/juju/unit.py @@ -56,6 +56,10 @@ class Unit(model.ModelEntity): """ return self.data['workload-status']['message'] + @property + def tag(self): + return 'unit-%s' % self.name.replace('/', '-') + def add_storage(self, name, constraints=None): """Add unit storage dynamically. @@ -108,6 +112,9 @@ class Unit(model.ModelEntity): :param str command: The command to run :param int timeout: Time to wait before command is considered failed + Returns a tuple containing the stdout, stderr, and return code + from the command. + """ action = client.ActionFacade() action.connect(self.connection) @@ -115,22 +122,48 @@ class Unit(model.ModelEntity): log.debug( 'Running `%s` on %s', command, self.name) - return await action.Run( + res = await action.Run( [], command, [], timeout, [self.name], ) + return await self.model.wait_for_action(res.results[0].action.tag) - def run_action(self, action_name, **params): - """Run action on this unit. + async def run_action(self, action_name, **params): + """Run an action on this unit. :param str action_name: Name of action to run :param \*\*params: Action parameters - - """ - pass + :returns: An `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) + + log.debug('Starting action `%s` on %s', action_name, self.name) + + res = await action_facade.Enqueue([client.Action( + name=action_name, + parameters=params, + receiver=self.tag, + )]) + action = res.results[0].action + error = res.results[0].error + if error and error.code == 'not found': + raise ValueError('Action `%s` not found on %s' % (action_name, + self.name)) + elif error: + raise Exception('Unknown action error: %s' % error.serialize()) + action_id = action.tag[len('action-'):] + log.debug('Action started as %s', action_id) + # we can't use wait_for_new here because we don't + # consistently (ever?) get an "add" delta for the action + return await self.model._wait('action', action_id, None) def scp( self, source_path, user=None, destination_path=None, proxy=False,