1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
|
# -*- coding: utf-8 -*-
from typing import List, Optional
from ..exceptions import DashboardException
from ..security import Scope
from ..services.exception import handle_orchestrator_error
from ..services.orchestrator import OrchClient, OrchFeature
from . import APIDoc, APIRouter, RESTController
from ._version import APIVersion
from .orchestrator import raise_if_no_orchestrator
@APIRouter('/daemon', Scope.HOSTS)
@APIDoc("Perform actions on daemons", "Daemon")
class Daemon(RESTController):
@raise_if_no_orchestrator([OrchFeature.DAEMON_ACTION])
@handle_orchestrator_error('daemon')
@RESTController.MethodMap(version=APIVersion.EXPERIMENTAL)
def set(self, daemon_name: str, action: str = '',
container_image: Optional[str] = None):
if action not in ['start', 'stop', 'restart', 'redeploy']:
raise DashboardException(
code='invalid_daemon_action',
msg=f'Daemon action "{action}" is either not valid or not supported.')
# non 'None' container_images change need a redeploy
if container_image == '' and action != 'redeploy':
container_image = None
orch = OrchClient.instance()
res = orch.daemons.action(action=action, daemon_name=daemon_name, image=container_image)
return res
@raise_if_no_orchestrator([OrchFeature.DAEMON_LIST])
@handle_orchestrator_error('daemon')
@RESTController.MethodMap(version=APIVersion.DEFAULT)
def list(self, daemon_types: Optional[List[str]] = None):
"""List all daemons in the cluster. Also filter by the daemon types specified
:param daemon_types: List of daemon types to filter by.
:return: Returns list of daemons.
:rtype: list
"""
orch = OrchClient.instance()
daemons = [d.to_dict() for d in orch.services.list_daemons()]
if daemon_types:
daemons = [d for d in daemons if d['daemon_type'] in daemon_types]
return daemons
|