except AttributeError:
raise cherrypy.HTTPError(400, 'Malformed data received.')
+ def _get_health_value(self, member_data: Any) -> str:
+ if not isinstance(member_data, dict):
+ return ''
+ status = member_data.get('status', {})
+ if not isinstance(status, dict):
+ return ''
+ return status.get('health', '').lower()
+
+ def _get_state_value(self, member_data: Any) -> str:
+ if not isinstance(member_data, dict):
+ return ''
+ status = member_data.get('status', {})
+ if not isinstance(status, dict):
+ return ''
+ return status.get('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,
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:
+ if not isinstance(status, dict):
+ return ''
+ return status.get('status', {}).get('health', '').lower()
+
+ 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