]>
git.proxmox.com Git - ceph.git/blob - ceph/src/pybind/mgr/cephadm/services/exporter.py
3 from typing
import TYPE_CHECKING
, List
, Dict
, Any
, Tuple
5 from orchestrator
import OrchestratorError
6 from mgr_util
import ServerConfigException
, verify_tls
8 from .cephadmservice
import CephadmService
, CephadmDaemonDeploySpec
11 from cephadm
.module
import CephadmOrchestrator
13 logger
= logging
.getLogger(__name__
)
16 class CephadmExporterConfig
:
17 required_keys
= ['crt', 'key', 'token', 'port']
20 def __init__(self
, mgr
, crt
="", key
="", token
="", port
=""):
21 # type: (CephadmOrchestrator, str, str, str, str) -> None
29 def ready(self
) -> bool:
30 return all([self
.crt
, self
.key
, self
.token
, self
.port
])
32 def load_from_store(self
) -> None:
33 cfg
= self
.mgr
._get
_exporter
_config
()
35 assert isinstance(cfg
, dict)
36 self
.crt
= cfg
.get('crt', "")
37 self
.key
= cfg
.get('key', "")
38 self
.token
= cfg
.get('token', "")
39 self
.port
= cfg
.get('port', "")
41 def load_from_json(self
, json_str
: str) -> Tuple
[int, str]:
43 cfg
= json
.loads(json_str
)
45 return 1, "Invalid JSON provided - unable to load"
47 if not all([k
in cfg
for k
in CephadmExporterConfig
.required_keys
]):
48 return 1, "JSON file must contain crt, key, token and port"
50 self
.crt
= cfg
.get('crt')
51 self
.key
= cfg
.get('key')
52 self
.token
= cfg
.get('token')
53 self
.port
= cfg
.get('port')
57 def validate_config(self
) -> Tuple
[int, str]:
59 return 1, "Incomplete configuration. cephadm-exporter needs crt, key, token and port to be set"
61 for check
in [self
._validate
_tls
, self
._validate
_token
, self
._validate
_port
]:
68 def _validate_tls(self
) -> Tuple
[int, str]:
71 verify_tls(self
.crt
, self
.key
)
72 except ServerConfigException
as e
:
77 def _validate_token(self
) -> Tuple
[int, str]:
78 if not isinstance(self
.token
, str):
79 return 1, "token must be a string"
80 if len(self
.token
) < 8:
81 return 1, "Token must be a string of at least 8 chars in length"
85 def _validate_port(self
) -> Tuple
[int, str]:
87 p
= int(str(self
.port
))
91 return 1, "Port must be a integer (>1024)"
96 class CephadmExporter(CephadmService
):
97 TYPE
= 'cephadm-exporter'
99 def prepare_create(self
, daemon_spec
: CephadmDaemonDeploySpec
) -> CephadmDaemonDeploySpec
:
100 assert self
.TYPE
== daemon_spec
.daemon_type
102 cfg
= CephadmExporterConfig(self
.mgr
)
103 cfg
.load_from_store()
106 rc
, reason
= cfg
.validate_config()
108 raise OrchestratorError(reason
)
111 "Incomplete/Missing configuration, applying defaults")
112 self
.mgr
._set
_exporter
_defaults
()
113 cfg
.load_from_store()
115 if not daemon_spec
.ports
:
116 daemon_spec
.ports
= [int(cfg
.port
)]
118 daemon_spec
.final_config
, daemon_spec
.deps
= self
.generate_config(daemon_spec
)
122 def generate_config(self
, daemon_spec
: CephadmDaemonDeploySpec
) -> Tuple
[Dict
[str, Any
], List
[str]]:
123 assert self
.TYPE
== daemon_spec
.daemon_type
126 cfg
= CephadmExporterConfig(self
.mgr
)
127 cfg
.load_from_store()
130 rc
, reason
= cfg
.validate_config()
132 raise OrchestratorError(reason
)
134 logger
.info("Using default configuration for cephadm-exporter")
135 self
.mgr
._set
_exporter
_defaults
()
136 cfg
.load_from_store()
145 def purge(self
, service_name
: str) -> None:
146 logger
.info("Purging cephadm-exporter settings from mon K/V store")
147 self
.mgr
._clear
_exporter
_config
_settings
()