OLD | NEW |
1 import os | 1 import os |
2 import logging | 2 import logging |
3 import shutil | 3 import shutil |
4 import tempfile | 4 import tempfile |
5 import yaml | 5 import yaml |
6 | 6 |
7 from twisted.internet.defer import ( | 7 from twisted.internet.defer import ( |
8 inlineCallbacks, DeferredLock, DeferredList, returnValue) | 8 inlineCallbacks, DeferredLock, DeferredList, returnValue) |
9 | 9 |
10 from juju.errors import CharmUpgradeError | 10 from juju.errors import CharmUpgradeError |
(...skipping 650 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
661 "%s-relation-departed" % self._relation_name] | 661 "%s-relation-departed" % self._relation_name] |
662 elif change.change_type == "joined": | 662 elif change.change_type == "joined": |
663 hook_names = [ | 663 hook_names = [ |
664 "%s-relation-joined" % self._relation_name, | 664 "%s-relation-joined" % self._relation_name, |
665 "%s-relation-changed" % self._relation_name] | 665 "%s-relation-changed" % self._relation_name] |
666 else: | 666 else: |
667 hook_names = ["%s-relation-changed" % self._relation_name] | 667 hook_names = ["%s-relation-changed" % self._relation_name] |
668 | 668 |
669 invoker = self._get_invoker(context, change) | 669 invoker = self._get_invoker(context, change) |
670 for hook_name in hook_names: | 670 for hook_name in hook_names: |
671 yield self._execute_hook(invoker, hook_name, change) | 671 if not (yield self._execute_hook(invoker, hook_name, change)): |
| 672 break |
672 | 673 |
673 @inlineCallbacks | 674 @inlineCallbacks |
674 def _execute_hook(self, invoker, hook_name, change): | 675 def _execute_hook(self, invoker, hook_name, change): |
675 hook_path = os.path.join( | 676 hook_path = os.path.join( |
676 self._unit_dir, "charm", "hooks", hook_name) | 677 self._unit_dir, "charm", "hooks", hook_name) |
677 yield self._run_lock.acquire() | 678 yield self._run_lock.acquire() |
678 self._log.debug("Executing hook %s", hook_name) | 679 self._log.debug("Executing hook %s", hook_name) |
679 try: | 680 try: |
680 yield self._executor(invoker, hook_path) | 681 yield self._executor(invoker, hook_path) |
681 except Exception, e: | 682 except Exception, e: |
682 # We can't hold the run lock when we invoke the error | 683 # We can't hold the run lock when we invoke the error |
683 # handler, or we get a deadlock if the handler | 684 # handler, or we get a deadlock if the handler |
684 # manipulates the lifecycle. | 685 # manipulates the lifecycle. |
685 yield self._run_lock.release() | 686 yield self._run_lock.release() |
686 self._log.warn("Error in %s hook: %s", hook_name, e) | 687 self._log.warn("Error in %s hook: %s", hook_name, e) |
687 | 688 |
688 if not self._error_handler: | 689 if not self._error_handler: |
689 raise | 690 raise |
690 self._log.info( | 691 self._log.info( |
691 "Invoked error handler for %s hook", hook_name) | 692 "Invoked error handler for %s hook", hook_name) |
692 yield self._error_handler(change, e) | 693 yield self._error_handler(change, e) |
| 694 returnValue(False) |
693 else: | 695 else: |
694 yield self._run_lock.release() | 696 yield self._run_lock.release() |
| 697 returnValue(True) |
OLD | NEW |