from cephadm.services.service_registry import service_registry
from cephadm.services.cephadmservice import CephadmAgent
from cephadm.tlsobject_types import TLSCredentials
+from cephadm.utils import get_node_proxy_status_value
from urllib.error import HTTPError, URLError
from typing import Any, Dict, List, Set, TYPE_CHECKING, Optional, MutableMapping, IO
except AttributeError:
raise cherrypy.HTTPError(400, 'Malformed data received.')
+ def _get_health_value(self, member_data: Any) -> str:
+ return get_node_proxy_status_value(member_data, 'health', lower=True)
+
+ def _get_state_value(self, member_data: Any) -> str:
+ return get_node_proxy_status_value(member_data, 'state')
+
# TODO(guits): refactor this
# TODO(guits): use self.node_proxy.get_critical_from_host() ?
def get_nok_members(self,
for sys_id in data.keys():
for member in data[sys_id].keys():
- _status = data[sys_id][member]['status']['health'].lower()
- if _status.lower() != 'ok':
- state = data[sys_id][member]['status']['state']
+ member_data = data[sys_id][member]
+ _status = self._get_health_value(member_data)
+ if _status and _status != 'ok':
+ state = self._get_state_value(member_data)
_member = dict(
sys_id=sys_id,
member=member,
from cephadm.services.cephadmservice import CephadmDaemonDeploySpec
from mgr_util import parse_combined_pem_file
-from .utils import resolve_ip, SpecialHostLabels
+from .utils import get_node_proxy_status_value, resolve_ip, SpecialHostLabels
from .migrations import queue_migrate_nfs_spec, queue_migrate_rgw_spec
if TYPE_CHECKING:
self.keyrings[host] = key
self.mgr.set_store(f'{NODE_PROXY_CACHE_PREFIX}/keyrings', json.dumps(self.keyrings))
+ def _get_health_value(self, status: Any) -> str:
+ return get_node_proxy_status_value(status, 'health', lower=True)
+
+ def _has_health_value(self, statuses: ValuesView, health_value: str) -> bool:
+ return any([self._get_health_value(status) == health_value for status in statuses])
+
+ def _is_error_status(self, statuses: ValuesView) -> bool:
+ return self._has_health_value(statuses, 'error')
+
+ def _is_unknown_status(self, statuses: ValuesView) -> bool:
+ return self._has_health_value(statuses, 'unknown') and not self._is_error_status(statuses)
+
def fullreport(self, **kw: Any) -> Dict[str, Any]:
"""
Retrieves the full report for the specified hostname.
hostname = kw.get('hostname')
hosts = [hostname] if hostname else self.data.keys()
- def is_unknown(statuses: ValuesView) -> bool:
- return any([status['status']['health'].lower() == 'unknown' for status in statuses]) and not is_error(statuses)
-
- def is_error(statuses: ValuesView) -> bool:
- return any([status['status']['health'].lower() == 'error' for status in statuses])
-
_result: Dict[str, Any] = {}
for host in hosts:
_sys_id_res: List[str] = []
for element in details.values():
values = element.values()
- if is_error(values):
+ if self._is_error_status(values):
state = 'error'
- elif is_unknown(values) or not values:
+ elif self._is_unknown_status(values) or not values:
state = 'unknown'
else:
state = 'ok'
if component_name == 'memory':
data_member['status']['health'] = 'critical'
data_member['status']['state'] = 'errors detected'
- if data_member['status']['health'].lower() != 'ok':
+ if self._get_health_value(data_member) != 'ok':
results[component_name][member] = data_member
return results
input_str = str(input_value).encode('utf-8')
hash_object = hashlib.md5(input_str)
return hash_object.hexdigest()
+
+
+def get_node_proxy_status_value(data: Any, key: str, lower: bool = False) -> str:
+ if not isinstance(data, dict):
+ return ''
+ status = data.get('status', {})
+ if not isinstance(status, dict):
+ return ''
+ value = status.get(key, '')
+ if not isinstance(value, str):
+ return ''
+ return value.lower() if lower else value