66from helpdesk .models .action import Action
77from helpdesk .models .provider import get_provider
88from helpdesk .config import ACTION_TREE_CONFIG
9+ from helpdesk .models .provider .errors import ResolvePackageError , InitProviderError
10+ from helpdesk .libs .sentry import report
911
1012logger = logging .getLogger (__name__ )
1113
@@ -42,17 +44,6 @@ def build_from_config(self, config):
4244 else :
4345 # leaf
4446 provider_object = config [- 1 ]
45-
46- # # dedup
47- # system_provider = get_provider(PROVIDER)
48- # default_pack = system_provider.get_default_pack() + '.'
49- # if not provider_object.endswith('.'):
50- # if provider_object.startswith(default_pack):
51- # provider_object = provider_object[len(default_pack):]
52- # if provider_object in objs:
53- # return
54- # objs[provider_object] = True
55-
5647 if provider_object .endswith ('.' ):
5748 # pack
5849 pack_sub_tree_config = self .resolve_pack (* config )
@@ -69,8 +60,18 @@ def resolve_pack(self, *config):
6960 pack = provider_object [:- 1 ]
7061
7162 sub_actions = []
72- system_provider = get_provider (provider_type )
73- actions = system_provider .get_actions (pack = pack )
63+ actions = []
64+
65+ try :
66+ system_provider = get_provider (provider_type )
67+ actions = system_provider .get_actions (pack = pack )
68+ except (InitProviderError , ResolvePackageError ) as e :
69+ logger .error (f"Resolve pack { name } error:\n { e .tb } " )
70+ # insert a empty children to failed action tree
71+ # so we can tolerant provider partially failed
72+ # and frontend can check children empty to notify user
73+ report ()
74+
7475 for a in actions :
7576 obj = '.' .join ([a .get ('pack' ), a .get ('name' )])
7677 desc = a .get ('description' )
0 commit comments