]> git.proxmox.com Git - ceph.git/blob - ceph/src/pybind/mgr/dashboard/controllers/service.py
afe684302b160d4ce962595b8fb241c9635800b4
[ceph.git] / ceph / src / pybind / mgr / dashboard / controllers / service.py
1 from typing import Dict, List, Optional
2
3 import cherrypy
4 from ceph.deployment.service_spec import ServiceSpec
5
6 from ..security import Scope
7 from ..services.exception import handle_custom_error, handle_orchestrator_error
8 from ..services.orchestrator import OrchClient, OrchFeature
9 from . import APIDoc, APIRouter, CreatePermission, DeletePermission, Endpoint, \
10 ReadPermission, RESTController, Task, UpdatePermission
11 from .orchestrator import raise_if_no_orchestrator
12
13
14 def service_task(name, metadata, wait_for=2.0):
15 return Task("service/{}".format(name), metadata, wait_for)
16
17
18 @APIRouter('/service', Scope.HOSTS)
19 @APIDoc("Service Management API", "Service")
20 class Service(RESTController):
21
22 @Endpoint()
23 @ReadPermission
24 def known_types(self) -> List[str]:
25 """
26 Get a list of known service types, e.g. 'alertmanager',
27 'node-exporter', 'osd' or 'rgw'.
28 """
29 return ServiceSpec.KNOWN_SERVICE_TYPES
30
31 @raise_if_no_orchestrator([OrchFeature.SERVICE_LIST])
32 def list(self, service_name: Optional[str] = None) -> List[dict]:
33 orch = OrchClient.instance()
34 return [service.to_dict() for service in orch.services.list(service_name=service_name)]
35
36 @raise_if_no_orchestrator([OrchFeature.SERVICE_LIST])
37 def get(self, service_name: str) -> List[dict]:
38 orch = OrchClient.instance()
39 services = orch.services.get(service_name)
40 if not services:
41 raise cherrypy.HTTPError(404, 'Service {} not found'.format(service_name))
42 return services[0].to_json()
43
44 @RESTController.Resource('GET')
45 @raise_if_no_orchestrator([OrchFeature.DAEMON_LIST])
46 def daemons(self, service_name: str) -> List[dict]:
47 orch = OrchClient.instance()
48 daemons = orch.services.list_daemons(service_name=service_name)
49 return [d.to_dict() for d in daemons]
50
51 @CreatePermission
52 @handle_custom_error('service', exceptions=(ValueError, TypeError))
53 @raise_if_no_orchestrator([OrchFeature.SERVICE_CREATE])
54 @handle_orchestrator_error('service')
55 @service_task('create', {'service_name': '{service_name}'})
56 def create(self, service_spec: Dict, service_name: str): # pylint: disable=W0613
57 """
58 :param service_spec: The service specification as JSON.
59 :param service_name: The service name, e.g. 'alertmanager'.
60 :return: None
61 """
62
63 OrchClient.instance().services.apply(service_spec, no_overwrite=True)
64
65 @UpdatePermission
66 @handle_custom_error('service', exceptions=(ValueError, TypeError))
67 @raise_if_no_orchestrator([OrchFeature.SERVICE_CREATE])
68 @handle_orchestrator_error('service')
69 @service_task('edit', {'service_name': '{service_name}'})
70 def set(self, service_spec: Dict, service_name: str): # pylint: disable=W0613
71 """
72 :param service_spec: The service specification as JSON.
73 :param service_name: The service name, e.g. 'alertmanager'.
74 :return: None
75 """
76
77 OrchClient.instance().services.apply(service_spec, no_overwrite=False)
78
79 @DeletePermission
80 @raise_if_no_orchestrator([OrchFeature.SERVICE_DELETE])
81 @handle_orchestrator_error('service')
82 @service_task('delete', {'service_name': '{service_name}'})
83 def delete(self, service_name: str):
84 """
85 :param service_name: The service name, e.g. 'mds' or 'crash.foo'.
86 :return: None
87 """
88 orch = OrchClient.instance()
89 orch.services.remove(service_name)