func()

in controllers/healthcheck.go [36:85]


func (r *EtcdadmClusterReconciler) performEndpointHealthCheck(ctx context.Context, cluster *clusterv1.Cluster, endpoint string, logLevelInfo bool) error {
	client, err := r.getEtcdHttpClient(ctx, cluster)
	if err != nil {
		return err
	}

	u, err := url.Parse(endpoint)
	if err != nil {
		return errors.Wrapf(err, "invalid etcd endpoint url")
	}
	if !r.isPortOpen(ctx, u.Host) {
		return portNotOpenErr
	}

	healthCheckURL := getMemberHealthCheckEndpoint(endpoint)
	if logLevelInfo {
		// logging non-failures only for non-periodic checks so as to not log too many events
		r.Log.Info("Performing healthcheck on", "endpoint", healthCheckURL)
	}

	req, err := http.NewRequest("GET", healthCheckURL, nil)
	if err != nil {
		return errors.Wrap(err, "error creating healthcheck request")
	}

	resp, err := client.Do(req)
	if err != nil {
		return errors.Wrap(err, "error checking etcd member health")
	}
	// reuse connection
	defer resp.Body.Close()

	if resp.StatusCode != http.StatusOK {
		return errors.Wrap(err, "Etcd member not ready, retry")
	}

	body, err := io.ReadAll(resp.Body)
	if err != nil {
		return err
	}

	if err := parseEtcdHealthCheckOutput(body); err != nil {
		return errors.Wrap(err, fmt.Sprintf("etcd member %v failed healthcheck", endpoint))
	}
	if logLevelInfo {
		r.Log.Info("Etcd member ready", "member", endpoint)
	}

	return nil
}