def connect_to_cluster()

in mysqloperator/controller/innodbcluster/cluster_controller.py [0:0]


    def connect_to_cluster(self, logger: Logger, need_primary:bool = False) -> MySQLPod:
        # Get list of pods and try to connect to one of them
        def try_connect() -> MySQLPod:
            last_exc = None
            offline_pods = []
            all_pods = self.cluster.get_pods()
            for pod in all_pods:
                if pod.name in offline_pods or pod.deleting:
                    continue

                try:
                    self.dba = mysqlsh.connect_dba(pod.endpoint_co)

                    if need_primary:
                        res = self.dba.session.run_sql(
                            "SELECT member_role"
                            " FROM performance_schema.replication_group_members"
                            " WHERE member_host = @@report_host")

                        r = res.fetch_one()
                        if r[0] != "PRIMARY":
                            logger.info(f"Primary requested, but {pod.name} is no primary")
                            self.dba.session.close()
                            continue

                except Exception as e:
                    logger.debug(f"connect_dba: target={pod.name} error={e}")
                    # Try another pod if we can't connect to it
                    last_exc = e
                    continue

                try:
                    self.dba_cluster = self.dba.get_cluster()
                    logger.info(f"Connected to {pod}")
                    return pod
                except mysqlsh.Error as e:
                    logger.info(
                        f"get_cluster() from {pod.name} failed: {e}")

                    if e.code == errors.SHERR_DBA_BADARG_INSTANCE_NOT_ONLINE:
                        # This member is not ONLINE, so there's no chance of
                        # getting a cluster handle from it
                        offline_pods.append(pod.name)

                except Exception as e:
                    logger.info(
                        f"get_cluster() from {pod.name} failed: {e}")

            # If all pods are connectable but OFFLINE, then we have complete outage and need a reboot
            if len(offline_pods) == len(all_pods):
                raise kopf.TemporaryError(
                    "Could not connect to any cluster member", delay=15)

            if last_exc:
                raise last_exc

            raise kopf.TemporaryError(
                "Could not connect to any cluster member", delay=15)

        return try_connect()