]>
git.proxmox.com Git - ceph.git/blob - ceph/src/pybind/mgr/dashboard/controllers/_task.py
1 from functools
import wraps
5 from ..tools
import TaskManager
6 from ._helpers
import _get_function_params
10 def __init__(self
, name
, metadata
, wait_for
=5.0, exception_handler
=None):
12 if isinstance(metadata
, list):
13 self
.metadata
= {e
[1:-1]: e
for e
in metadata
}
15 self
.metadata
= metadata
16 self
.wait_for
= wait_for
17 self
.exception_handler
= exception_handler
19 def _gen_arg_map(self
, func
, args
, kwargs
):
21 params
= _get_function_params(func
)
23 args
= args
[1:] # exclude self
24 for idx
, param
in enumerate(params
):
26 arg_map
[param
['name']] = args
[idx
]
28 if param
['name'] in kwargs
:
29 arg_map
[param
['name']] = kwargs
[param
['name']]
31 assert not param
['required'], "{0} is required".format(param
['name'])
32 arg_map
[param
['name']] = param
['default']
34 if param
['name'] in arg_map
:
35 # This is not a type error. We are using the index here.
36 arg_map
[idx
+1] = arg_map
[param
['name']]
40 def __call__(self
, func
):
42 def wrapper(*args
, **kwargs
):
43 arg_map
= self
._gen
_arg
_map
(func
, args
, kwargs
)
45 for k
, v
in self
.metadata
.items():
46 if isinstance(v
, str) and v
and v
[0] == '{' and v
[-1] == '}':
50 metadata
[k
] = arg_map
[pos
]
52 if param
.find('.') == -1:
53 metadata
[k
] = arg_map
[param
]
55 path
= param
.split('.')
56 metadata
[k
] = arg_map
[path
[0]]
57 for i
in range(1, len(path
)):
58 metadata
[k
] = metadata
[k
][path
[i
]]
61 task
= TaskManager
.run(self
.name
, metadata
, func
, args
, kwargs
,
62 exception_handler
=self
.exception_handler
)
64 status
, value
= task
.wait(self
.wait_for
)
65 except Exception as ex
:
67 # exception was handled by task.exception_handler
68 if 'status' in task
.ret_value
:
69 status
= task
.ret_value
['status']
71 status
= getattr(ex
, 'status', 500)
72 cherrypy
.response
.status
= status
75 if status
== TaskManager
.VALUE_EXECUTING
:
76 cherrypy
.response
.status
= 202
77 return {'name': self
.name
, 'metadata': metadata
}