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
}