~jimbaker/pyjuju/new-hook-semantics-3-remove-change-hook

« back to all changes in this revision

Viewing changes to ensemble/unit/lifecycle.py

  • Committer: Jim Baker
  • Date: 2011-03-29 16:06:56 UTC
  • Revision ID: jim.baker@canonical.com-20110329160656-6732t8z4tdlvzvyh
Add support for multiple hooks per change, with specific support for departed hook

Show diffs side-by-side

added added

removed removed

Lines of Context:
279
279
        """
280
280
        socket_path = os.path.join(self._unit_path, HOOK_SOCKET_FILE)
281
281
        if hook_name is None:
282
 
            hook_name = "%s-relation-changed" % self._relation_name
283
 
 
284
 
        hook_path = os.path.join(
285
 
            self._unit_path, "formula", "hooks", hook_name)
286
 
 
 
282
            if change.change_type == "departed":
 
283
                hook_names = [
 
284
                    "%s-relation-changed" % self._relation_name,
 
285
                    "%s-relation-departed" % self._relation_name]
 
286
            else:
 
287
                hook_names = ["%s-relation-changed" % self._relation_name]
 
288
        else:
 
289
            hook_names = [hook_name]
287
290
        invoker = RelationInvoker(
288
291
            context, change, "constant", socket_path, hook_log)
289
292
 
290
 
        yield self._run_lock.acquire()
291
 
        self._log.debug("%s: executing change hook", self._relation_name)
292
 
        try:
293
 
            yield self._executor(invoker, hook_path)
294
 
        except Exception, e:
295
 
            yield self._run_lock.release()
296
 
            self._log.warn("%s: change hook error: %s", self._relation_name, e)
 
293
        for hook_name in hook_names:
 
294
            hook_path = os.path.join(
 
295
                self._unit_path, "formula", "hooks", hook_name)
 
296
            yield self._run_lock.acquire()
 
297
            self._log.debug("%s: executing change hook", self._relation_name)
 
298
            try:
 
299
                yield self._executor(invoker, hook_path)
 
300
            except Exception, e:
 
301
                yield self._run_lock.release()
 
302
                self._log.warn("%s: change hook error: %s", self._relation_name, e)
297
303
 
298
 
            if not self._error_handler:
299
 
                raise
300
 
            self._log.info(
301
 
                "%s: invoke change hook error handler", self._relation_name)
302
 
            # We can't hold the run lock, when we invoke the error handler, or
303
 
            # we get a deadlock if the handler manipulates the lifecycle.
304
 
            yield self._error_handler(change, e)
305
 
        else:
306
 
            yield self._run_lock.release()
 
304
                if not self._error_handler:
 
305
                    raise
 
306
                self._log.info(
 
307
                    "%s: invoke change hook error handler", self._relation_name)
 
308
                # We can't hold the run lock, when we invoke the error handler, or
 
309
                # we get a deadlock if the handler manipulates the lifecycle.
 
310
                yield self._error_handler(change, e)
 
311
            else:
 
312
                yield self._run_lock.release()
307
313
 
308
314
    def set_hook_error_handler(self, handler):
309
315
        """Set an error handler to be invoked if a hook errors.