diff options
Diffstat (limited to '')
-rw-r--r-- | src/pybind/mgr/dashboard/controllers/_endpoint.py | 82 |
1 files changed, 82 insertions, 0 deletions
diff --git a/src/pybind/mgr/dashboard/controllers/_endpoint.py b/src/pybind/mgr/dashboard/controllers/_endpoint.py new file mode 100644 index 000000000..fccab89c3 --- /dev/null +++ b/src/pybind/mgr/dashboard/controllers/_endpoint.py @@ -0,0 +1,82 @@ +from typing import Optional + +from ._helpers import _get_function_params +from ._version import APIVersion + + +class Endpoint: + + def __init__(self, method=None, path=None, path_params=None, query_params=None, # noqa: N802 + json_response=True, proxy=False, xml=False, + version: Optional[APIVersion] = APIVersion.DEFAULT): + if method is None: + method = 'GET' + elif not isinstance(method, str) or \ + method.upper() not in ['GET', 'POST', 'DELETE', 'PUT']: + raise TypeError("Possible values for method are: 'GET', 'POST', " + "'DELETE', or 'PUT'") + + method = method.upper() + + if method in ['GET', 'DELETE']: + if path_params is not None: + raise TypeError("path_params should not be used for {} " + "endpoints. All function params are considered" + " path parameters by default".format(method)) + + if path_params is None: + if method in ['POST', 'PUT']: + path_params = [] + + if query_params is None: + query_params = [] + + self.method = method + self.path = path + self.path_params = path_params + self.query_params = query_params + self.json_response = json_response + self.proxy = proxy + self.xml = xml + self.version = version + + def __call__(self, func): + if self.method in ['POST', 'PUT']: + func_params = _get_function_params(func) + for param in func_params: + if param['name'] in self.path_params and not param['required']: + raise TypeError("path_params can only reference " + "non-optional function parameters") + + if func.__name__ == '__call__' and self.path is None: + e_path = "" + else: + e_path = self.path + + if e_path is not None: + e_path = e_path.strip() + if e_path and e_path[0] != "/": + e_path = "/" + e_path + elif e_path == "/": + e_path = "" + + func._endpoint = { + 'method': self.method, + 'path': e_path, + 'path_params': self.path_params, + 'query_params': self.query_params, + 'json_response': self.json_response, + 'proxy': self.proxy, + 'xml': self.xml, + 'version': self.version + } + return func + + +def Proxy(path=None): # noqa: N802 + if path is None: + path = "" + elif path == "/": + path = "" + path += "/{path:.*}" + return Endpoint(path=path, proxy=True) |