Skip to content

Commit 864796d

Browse files
authored
Isolate provider init (#69)
1 parent 39d8f17 commit 864796d

6 files changed

Lines changed: 81 additions & 20 deletions

File tree

frontend/src/components/HSider.vue

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,8 @@ export default {
4444
openKeys: [],
4545
SelectedKeys: [],
4646
rootSubmenuKeys: [],
47-
searchText: ''
47+
searchText: '',
48+
actionLoadNotifyKey: 'actionTreeLoadErrorNofify'
4849
}
4950
},
5051
computed: {
@@ -69,6 +70,7 @@ export default {
6970
for (let i = 0; i < definition.length; i++) {
7071
this.rootSubmenuKeys.push(definition[i].key)
7172
}
73+
this.checkActionTreeError(definition)
7274
this.$store.dispatch('updateActionTree', definition)
7375
let actionName = this.$route.params.name
7476
// looking for selected item with actionName
@@ -84,6 +86,25 @@ export default {
8486
}
8587
)
8688
},
89+
checkActionTreeError(definition) {
90+
// check action
91+
var loadErrorAction = []
92+
for (let i = 0; i < definition.length; i++) {
93+
if (definition[i].children && definition[i].children.length == 0) {
94+
loadErrorAction.push(definition[i].name)
95+
}
96+
}
97+
98+
if (loadErrorAction.length > 0) {
99+
this.$notification.open({
100+
message: "Action tree load error",
101+
description: loadErrorAction.join(",") + " pack load error",
102+
duration: 0,
103+
icon: <a-icon type="warning" style="color: red" />,
104+
key: this.actionLoadNotifyKey
105+
})
106+
}
107+
},
87108
onOpenChange (openKeys) {
88109
const latestOpenKey = openKeys.find(key => this.openKeys.indexOf(key) === -1)
89110
if (this.rootSubmenuKeys.indexOf(latestOpenKey) === -1) {

helpdesk/models/action_tree.py

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
from helpdesk.models.action import Action
77
from helpdesk.models.provider import get_provider
88
from helpdesk.config import ACTION_TREE_CONFIG
9+
from helpdesk.models.provider.errors import ResolvePackageError, InitProviderError
10+
from helpdesk.libs.sentry import report
911

1012
logger = 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')

helpdesk/models/provider/__init__.py

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
# coding: utf-8
22

3-
from helpdesk.libs.decorators import timed_cache
4-
3+
import traceback
54

5+
from helpdesk.libs.decorators import timed_cache
6+
from helpdesk.models.provider.errors import InitProviderError, ResolvePackageError
67
from .st2 import ST2Provider
78
from .airflow import AirflowProvider
89
from .spincycle import SpinCycleProvider
@@ -16,4 +17,7 @@
1617

1718
@timed_cache(minutes=15)
1819
def get_provider(provider, **kw):
19-
return _providers[provider](**kw)
20+
try:
21+
return _providers[provider](**kw)
22+
except Exception as e:
23+
raise InitProviderError(error=e, tb=traceback.format_exc(), description=f"Init provider error: {str(e)}")

helpdesk/models/provider/airflow.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
AIRFLOW_DEFAULT_DAG_TAG,
1212
)
1313
from helpdesk.libs.airflow import AirflowClient
14+
from helpdesk.models.provider.errors import ResolvePackageError
1415

1516
from .base import BaseProvider
1617

@@ -88,8 +89,13 @@ def get_actions(self, pack=None):
8889
<Action name=view_organizations,pack=trello,enabled=True,runner_type=python-script>
8990
to dict
9091
"""
91-
dags = self.airflow_client.get_dags(tags=(self.default_tag if not pack else pack,))
92-
return self._build_action_from_dag(dags, pack=pack)
92+
try:
93+
dags = self.airflow_client.get_dags(tags=(self.default_tag if not pack else pack,))
94+
return self._build_action_from_dag(dags, pack=pack)
95+
except Exception as e:
96+
if pack:
97+
raise ResolvePackageError(e, traceback.format_exc(), f"Resolve pack {pack} error")
98+
raise e
9399

94100
def get_action(self, ref):
95101
"""

helpdesk/models/provider/errors.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
class ProviderError(Exception):
2+
def __init__(self, error, tb="", description="provider error"):
3+
self.description = description
4+
self.error = error
5+
self.tb = tb
6+
7+
def __str__(self):
8+
return '[{message}] {description}'.format(**self.to_dict())
9+
10+
__repr__ = __str__
11+
12+
def to_dict(self):
13+
return {
14+
'description': self.description,
15+
'message': str(self.error)
16+
}
17+
18+
19+
class ResolvePackageError(ProviderError):
20+
pass
21+
22+
23+
class InitProviderError(ProviderError):
24+
pass

helpdesk/models/provider/st2.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import logging
44
import requests
5+
import traceback
56

67
from helpdesk.config import (
78
ST2_DEFAULT_PACK,
@@ -14,6 +15,7 @@
1415
)
1516
from helpdesk.libs.sentry import report
1617
from helpdesk.libs.st2 import get_client, get_api_client, Execution, Token
18+
from helpdesk.models.provider.errors import ResolvePackageError
1719

1820
from .base import BaseProvider
1921

@@ -61,7 +63,10 @@ def get_actions(self, pack=None):
6163
to dict
6264
'''
6365
if pack:
64-
actions = self.st2.actions.query(pack=pack)
66+
try:
67+
actions = self.st2.actions.query(pack=pack)
68+
except Exception as e:
69+
raise ResolvePackageError(e, traceback.format_exc(), f"Resolve pack {pack} error")
6570
else:
6671
actions = self.st2.actions.get_all()
6772
return [action.to_dict() for action in actions]

0 commit comments

Comments
 (0)