func()

in controllers/periodic_healthcheck.go [53:124]


func (r *EtcdadmClusterReconciler) startHealthCheck(ctx context.Context, etcdadmClusterMapper map[types.UID]etcdadmClusterMemberHealthConfig) {
	etcdClusters := &etcdv1.EtcdadmClusterList{}
	err := r.Client.List(ctx, etcdClusters)
	if err != nil {
		r.Log.Error(err, "Error listing etcdadm cluster objects")
		return
	}
	for _, ec := range etcdClusters.Items {
		log := r.Log.WithValues("EtcdadmCluster", klog.KObj(&ec))
		if annotations.HasPaused(&ec) {
			log.Info("EtcdadmCluster reconciliation is paused, skipping health checks")
			continue
		}
		if val, set := ec.Annotations[etcdv1.HealthCheckRetriesAnnotation]; set {
			if retries, err := strconv.Atoi(val); err != nil || retries < 0 {
				log.Info(fmt.Sprintf("healthcheck-retries annotation configured with invalid value: %v", err))
			} else if retries == 0 {
				log.Info("healthcheck-retries annotation configured to 0, skipping health checks")
				continue
			}
		}
		if conditions.IsFalse(&ec, etcdv1.EtcdCertificatesAvailableCondition) {
			log.Info("EtcdadmCluster certificates are not ready, skipping health checks")
			continue
		}
		if !ec.Status.CreationComplete {
			// etcdCluster not fully provisioned yet
			log.Info("EtcdadmCluster is not ready, skipping health checks")
			continue
		}
		if conditions.IsFalse(&ec, etcdv1.EtcdMachinesSpecUpToDateCondition) {
			// etcdCluster is undergoing upgrade, some machines might not be ready yet, skip periodic healthcheck
			log.Info("EtcdadmCluster machine specs are not up to date, skipping health checks")
			continue
		}

		var cluster *clusterv1.Cluster
		if clusterEntry, ok := etcdadmClusterMapper[ec.UID]; !ok {
			cluster, err = util.GetOwnerCluster(ctx, r.Client, ec.ObjectMeta)
			if err != nil {
				log.Error(err, "Failed to retrieve owner Cluster from the API Server")
				continue
			}
			if cluster == nil {
				log.Info("Cluster Controller has not yet set OwnerRef on etcd cluster")
				continue
			}

			ownedMachines := r.getOwnedMachines(ctx, cluster, ec)

			etcdadmClusterMapper[ec.UID] = etcdadmClusterMemberHealthConfig{
				unhealthyMembersFrequency: make(map[string]int),
				unhealthyMembersToRemove:  make(map[string]*clusterv1.Machine),
				cluster:                   cluster,
				ownedMachines:             ownedMachines,
			}
		} else {
			cluster = clusterEntry.cluster
			if ec.Status.Endpoints != clusterEntry.endpoints {
				clusterEntry.endpoints = ec.Status.Endpoints
				ownedMachines := r.getOwnedMachines(ctx, cluster, ec)
				clusterEntry.ownedMachines = ownedMachines
				etcdadmClusterMapper[ec.UID] = clusterEntry
			}
		}

		if err := r.periodicEtcdMembersHealthCheck(ctx, cluster, &ec, etcdadmClusterMapper); err != nil {
			log.Error(err, "Error performing healthcheck")
			continue
		}
	}
}