import dotmap from kubernetes import client from src import util from src.context import env, get_infra_api_cli from . import base CR_GROUP = "cloud.pingcap.com" CR_VERSION = "v1" class BaseNetwork(base.SuspicionABC): def __init__(self, *args, **kwargs): """ :param project_id: :param kwargs: """ super().__init__(*args, **kwargs) ctx = kwargs["ctx"] self.infra_api_k8s_cli = get_infra_api_cli() self.cr_api = client.CustomObjectsApi(api_client=self.infra_api_k8s_cli) self.project_id = ctx.project_id self.network_name = ctx.network_name self.namespace = f"{env.STAGE}-{self.project_id}" self.network = util.get_namespaced_cr(self.cr_api, CR_GROUP, CR_VERSION, self.namespace, "networks", self.network_name) class NetworkReady(BaseNetwork): def verify(self) -> bool: if self.network is None: self._solution = "network not found" return True if self.network.status.phase != "Normal": self._solution = "network not ready, current phase: %s" % self.network.status.phase self._info = { "cr.network": self.network, } self._next_suspicion_clss = [NodePoolReady] return True self._info["network_reconciler"] = self.network.metadata.labels["cloud.pingcap.com/reconciler"] or '' class NodePoolReady(BaseNetwork): def verify(self) -> bool: if self.network.spec.provider != "gke": return False pools = self.get_all_pools() # check all synced # check all ready return False def get_all_pools(self) -> list[dotmap.DotMap]: pass class NodeGroupReady(BaseNetwork): def verify(self) -> bool: if self.network.spec.provider != "eks": return False pools = self.get_all_groups() # check all synced # check all ready return False def get_all_groups(self) -> list[dotmap.DotMap]: pass class NetworkPaused(BaseNetwork): def verify(self) -> bool: if self.network.spec.paused: cmd2unpause = (f"kubectl -n {self.network.metadata.namespace} patch {self.network_name} --type=merge'" " -p '{\"spec\":{\"paused\":true}}'") self._solution = f"network is paused, run `{cmd2unpause}`" return True class NetworkPeerRamain(BaseNetwork): pass