1 from typing
import Dict
, List
, Optional
4 from ceph
.deployment
.service_spec
import ServiceSpec
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
14 def service_task(name
, metadata
, wait_for
=2.0):
15 return Task("service/{}".format(name
), metadata
, wait_for
)
18 @APIRouter('/service', Scope
.HOSTS
)
19 @APIDoc("Service Management API", "Service")
20 class Service(RESTController
):
24 def known_types(self
) -> List
[str]:
26 Get a list of known service types, e.g. 'alertmanager',
27 'node-exporter', 'osd' or 'rgw'.
29 return ServiceSpec
.KNOWN_SERVICE_TYPES
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
)]
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
)
41 raise cherrypy
.HTTPError(404, 'Service {} not found'.format(service_name
))
42 return services
[0].to_json()
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
]
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
58 :param service_spec: The service specification as JSON.
59 :param service_name: The service name, e.g. 'alertmanager'.
63 OrchClient
.instance().services
.apply(service_spec
, no_overwrite
=True)
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
72 :param service_spec: The service specification as JSON.
73 :param service_name: The service name, e.g. 'alertmanager'.
77 OrchClient
.instance().services
.apply(service_spec
, no_overwrite
=False)
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):
85 :param service_name: The service name, e.g. 'mds' or 'crash.foo'.
88 orch
= OrchClient
.instance()
89 orch
.services
.remove(service_name
)