Ctrl K
ComunidadGuías…

internal/kube/warnings.go

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
package kube

import (
	"log/slog"
	"slices"
	"sync"
)

const deprecationCode = 299

const warningsRemembered = 64

type WarningSink struct {
	log *slog.Logger

	mu   sync.Mutex
	seen map[string]struct{}
	full bool
}

func newWarningLogger(log *slog.Logger) *WarningSink {
	return &WarningSink{log: log, seen: map[string]struct{}{}}
}

func (w *WarningSink) HandleWarningHeader(code int, agent, text string) {
	if code != deprecationCode || text == "" {
		return
	}
	first, full := w.remember(text)
	if full {
		w.log.Warn("additional apiserver warnings were omitted")
	}
	if !first {
		return
	}
	w.log.Warn("the apiserver answered with a warning", "warning", text)
}

func (w *WarningSink) remember(text string) (bool, bool) {
	w.mu.Lock()
	defer w.mu.Unlock()
	_, repeated := w.seen[text]
	if repeated {
		return false, false
	}
	if len(w.seen) >= warningsRemembered {
		if w.full {
			return false, false
		}
		w.full = true
		return false, true
	}
	w.seen[text] = struct{}{}
	return true, false
}

func (w *WarningSink) Seen() []string {
	w.mu.Lock()
	defer w.mu.Unlock()
	out := make([]string, 0, len(w.seen))
	for text := range w.seen {
		out = append(out, text)
	}
	slices.Sort(out)
	return out
}