From f5b0155e04ab23beecea5d832a59d4e14cd4e898 Mon Sep 17 00:00:00 2001 From: Sebastian Wagner Date: Sun, 7 Jun 2020 00:51:38 +0200 Subject: [PATCH] mgr/cephadm: Add inventory.EventStore Signed-off-by: Sebastian Wagner --- src/pybind/mgr/cephadm/inventory.py | 55 ++++++++++++++++++++++++++++- src/pybind/mgr/cephadm/module.py | 4 ++- 2 files changed, 57 insertions(+), 2 deletions(-) diff --git a/src/pybind/mgr/cephadm/inventory.py b/src/pybind/mgr/cephadm/inventory.py index b63aaf7beac..616a303e5f6 100644 --- a/src/pybind/mgr/cephadm/inventory.py +++ b/src/pybind/mgr/cephadm/inventory.py @@ -7,7 +7,7 @@ from typing import TYPE_CHECKING, Dict, List, Iterator, Optional, Any, Tuple, Se import orchestrator from ceph.deployment import inventory from ceph.deployment.service_spec import ServiceSpec -from orchestrator import OrchestratorError, HostSpec +from orchestrator import OrchestratorError, HostSpec, OrchestratorEvent if TYPE_CHECKING: from .module import CephadmOrchestrator @@ -460,3 +460,56 @@ class HostCache(): """ return all((h in self.last_daemon_update or h in self.mgr.offline_hosts) for h in self.get_hosts()) + + +class EventStore(): + def __init__(self, mgr): + # type: (CephadmOrchestrator) -> None + self.mgr: CephadmOrchestrator = mgr + self.events = {} # type: Dict[str, List[OrchestratorEvent]] + + def add(self, event: OrchestratorEvent) -> None: + + if event.kind_subject() not in self.events: + self.events[event.kind_subject()] = [event] + + for e in self.events[event.kind_subject()]: + if e.message == event.message: + return + + self.events[event.kind_subject()].append(event) + + # limit to five events for now. + self.events[event.kind_subject()] = self.events[event.kind_subject()][-5:] + + def for_service(self, spec: ServiceSpec, level, message) -> None: + e = OrchestratorEvent(datetime.datetime.utcnow(), 'service', spec.service_name(), level, message) + self.add(e) + + def for_daemon(self, daemon_name, level, message): + e = OrchestratorEvent(datetime.datetime.utcnow(), 'daemon', daemon_name, level, message) + self.add(e) + + def cleanup(self) -> None: + # Needs to be properly done, in case events are persistently stored. + + unknowns: List[str] = [] + daemons = self.mgr.cache.get_daemon_names() + specs = self.mgr.spec_store.specs.keys() + for k_s, v in self.events.keys(): + kind, subject = k_s.split(':') + if kind == 'service': + if subject not in specs: + unknowns.append(k_s) + elif kind == 'daemon': + if subject not in daemons: + unknowns.append(k_s) + + for k_s in unknowns: + del self.events[k_s] + + def get_for_service(self, name): + return self.events.get('service:' + name, []) + + def get_for_daemon(self, name): + return self.events.get('daemon:' + name, []) diff --git a/src/pybind/mgr/cephadm/module.py b/src/pybind/mgr/cephadm/module.py index 1b3d18b8292..3d96eede9fb 100644 --- a/src/pybind/mgr/cephadm/module.py +++ b/src/pybind/mgr/cephadm/module.py @@ -43,7 +43,7 @@ from .services.osd import RemoveUtil, OSDRemoval, OSDService from .services.monitoring import GrafanaService, AlertmanagerService, PrometheusService, \ NodeExporterService from .schedule import HostAssignment, HostPlacementSpec -from .inventory import Inventory, SpecStore, HostCache +from .inventory import Inventory, SpecStore, HostCache, EventStore from .upgrade import CEPH_UPGRADE_ORDER, CephadmUpgrade from .template import TemplateMgr @@ -338,7 +338,9 @@ class CephadmOrchestrator(orchestrator.Orchestrator, MgrModule): if h not in self.inventory: self.cache.rm_host(h) + # in-memory only. + self.events = EventStore(self) self.offline_hosts: Set[str] = set() self.migration = Migrations(self) -- 2.39.5