import datetime from kubernetes import client from kubernetes.client import models from src import util from src.context import get_infra_api_cli from src.suspicions import SuspicionABC, logger class ReconcileFail(SuspicionABC): def __init__(self, obj_name: str, obj_ns: str, obj_kind: str, *args, **kwargs): """ :param obj_name: which object to reconcile :param obj_ns: the namespace of the object :param obj_kind: the Kind of the object, such as Cluster, Network :param args: :param kwargs: """ super().__init__(*args, **kwargs) self.obj_name = obj_name self.obj_ns = obj_ns self.obj_kind = obj_kind self.infra_api_k8s_cli = get_infra_api_cli() self.core_api = client.CoreV1Api(api_client=self.infra_api_k8s_cli) def verify(self) -> bool: filed_selector = { 'involvedObject.name': self.obj_name, 'involvedObject.kind': self.obj_kind, 'type': 'Warning', } response: models.CoreV1EventList = self.core_api.list_namespaced_event( self.obj_ns, field_selector=util.build_label_selector(filed_selector), ) events: list[models.CoreV1Event] = response.items if not events: return False events.sort(key=lambda x: x.metadata.creation_timestamp, reverse=True) appended = set({}) now = datetime.datetime.now(tz=datetime.timezone.utc) for event in events: # skip for duplicated event if event.message in appended: continue if now - event.last_timestamp > datetime.timedelta(minutes=30): logger.debug(f'ignore too old event: {event}') continue self._solution.append(f'reconcile failed with msg: {event.message}, time: {event.last_timestamp}') appended.add(event.message) return True class FixedSolution(SuspicionABC): def __init__(self, solution: list[str] = None, info: dict = None, *args, **kwargs): super().__init__(ctx=None, *args, **kwargs) self._solution = solution self._info = info def verify(self) -> bool: return False