mirror of
https://github.com/ceph/ceph-csi.git
synced 2025-06-13 18:43:34 +00:00
rebase: bump k8s.io/kubernetes in the k8s-dependencies group
Bumps the k8s-dependencies group with 1 update: [k8s.io/kubernetes](https://github.com/kubernetes/kubernetes). Updates `k8s.io/kubernetes` from 1.32.3 to 1.33.0 - [Release notes](https://github.com/kubernetes/kubernetes/releases) - [Commits](https://github.com/kubernetes/kubernetes/compare/v1.32.3...v1.33.0) --- updated-dependencies: - dependency-name: k8s.io/kubernetes dependency-version: 1.33.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: k8s-dependencies ... Signed-off-by: dependabot[bot] <support@github.com> Signed-off-by: Niels de Vos <ndevos@ibm.com>
This commit is contained in:
committed by
mergify[bot]
parent
4147d5d15a
commit
51895f8619
138
vendor/k8s.io/client-go/rest/request.go
generated
vendored
138
vendor/k8s.io/client-go/rest/request.go
generated
vendored
@ -54,7 +54,7 @@ import (
|
||||
"k8s.io/utils/clock"
|
||||
)
|
||||
|
||||
var (
|
||||
const (
|
||||
// longThrottleLatency defines threshold for logging requests. All requests being
|
||||
// throttled (via the provided rateLimiter) for more than longThrottleLatency will
|
||||
// be logged.
|
||||
@ -103,10 +103,10 @@ type Request struct {
|
||||
contentConfig ClientContentConfig
|
||||
contentTypeNotSet bool
|
||||
|
||||
warningHandler WarningHandler
|
||||
warningHandler WarningHandlerWithContext
|
||||
|
||||
rateLimiter flowcontrol.RateLimiter
|
||||
backoff BackoffManager
|
||||
backoff BackoffManagerWithContext
|
||||
timeout time.Duration
|
||||
maxRetries int
|
||||
|
||||
@ -136,7 +136,7 @@ type Request struct {
|
||||
|
||||
// NewRequest creates a new request helper object for accessing runtime.Objects on a server.
|
||||
func NewRequest(c *RESTClient) *Request {
|
||||
var backoff BackoffManager
|
||||
var backoff BackoffManagerWithContext
|
||||
if c.createBackoffMgr != nil {
|
||||
backoff = c.createBackoffMgr()
|
||||
}
|
||||
@ -259,20 +259,47 @@ func (r *Request) Resource(resource string) *Request {
|
||||
}
|
||||
|
||||
// BackOff sets the request's backoff manager to the one specified,
|
||||
// or defaults to the stub implementation if nil is provided
|
||||
// or defaults to the stub implementation if nil is provided.
|
||||
//
|
||||
// Deprecated: BackoffManager.Sleep ignores the caller's context. Use BackOffWithContext and BackoffManagerWithContext instead.
|
||||
func (r *Request) BackOff(manager BackoffManager) *Request {
|
||||
if manager == nil {
|
||||
r.backoff = &NoBackoff{}
|
||||
return r
|
||||
}
|
||||
|
||||
r.backoff = &backoffManagerNopContext{BackoffManager: manager}
|
||||
return r
|
||||
}
|
||||
|
||||
// BackOffWithContext sets the request's backoff manager to the one specified,
|
||||
// or defaults to the stub implementation if nil is provided.
|
||||
func (r *Request) BackOffWithContext(manager BackoffManagerWithContext) *Request {
|
||||
if manager == nil {
|
||||
r.backoff = &NoBackoff{}
|
||||
return r
|
||||
}
|
||||
|
||||
r.backoff = manager
|
||||
return r
|
||||
}
|
||||
|
||||
// WarningHandler sets the handler this client uses when warning headers are encountered.
|
||||
// If set to nil, this client will use the default warning handler (see SetDefaultWarningHandler).
|
||||
// If set to nil, this client will use the default warning handler (see [SetDefaultWarningHandler]).
|
||||
//
|
||||
//logcheck:context // WarningHandlerWithContext should be used instead of WarningHandler in code which supports contextual logging.
|
||||
func (r *Request) WarningHandler(handler WarningHandler) *Request {
|
||||
if handler == nil {
|
||||
r.warningHandler = nil
|
||||
return r
|
||||
}
|
||||
r.warningHandler = warningLoggerNopContext{l: handler}
|
||||
return r
|
||||
}
|
||||
|
||||
// WarningHandlerWithContext sets the handler this client uses when warning headers are encountered.
|
||||
// If set to nil, this client will use the default warning handler (see [SetDefaultWarningHandlerWithContext]).
|
||||
func (r *Request) WarningHandlerWithContext(handler WarningHandlerWithContext) *Request {
|
||||
r.warningHandler = handler
|
||||
return r
|
||||
}
|
||||
@ -649,21 +676,17 @@ func (r *Request) tryThrottleWithInfo(ctx context.Context, retryInfo string) err
|
||||
}
|
||||
latency := time.Since(now)
|
||||
|
||||
var message string
|
||||
switch {
|
||||
case len(retryInfo) > 0:
|
||||
message = fmt.Sprintf("Waited for %v, %s - request: %s:%s", latency, retryInfo, r.verb, r.URL().String())
|
||||
default:
|
||||
message = fmt.Sprintf("Waited for %v due to client-side throttling, not priority and fairness, request: %s:%s", latency, r.verb, r.URL().String())
|
||||
}
|
||||
|
||||
if latency > longThrottleLatency {
|
||||
klog.V(3).Info(message)
|
||||
}
|
||||
if latency > extraLongThrottleLatency {
|
||||
// If the rate limiter latency is very high, the log message should be printed at a higher log level,
|
||||
// but we use a throttled logger to prevent spamming.
|
||||
globalThrottledLogger.Infof("%s", message)
|
||||
if retryInfo == "" {
|
||||
retryInfo = "client-side throttling, not priority and fairness"
|
||||
}
|
||||
klog.FromContext(ctx).V(3).Info("Waited before sending request", "delay", latency, "reason", retryInfo, "verb", r.verb, "URL", r.URL())
|
||||
|
||||
if latency > extraLongThrottleLatency {
|
||||
// If the rate limiter latency is very high, the log message should be printed at a higher log level,
|
||||
// but we use a throttled logger to prevent spamming.
|
||||
globalThrottledLogger.info(klog.FromContext(ctx), "Waited before sending request", "delay", latency, "reason", retryInfo, "verb", r.verb, "URL", r.URL())
|
||||
}
|
||||
}
|
||||
metrics.RateLimiterLatency.Observe(ctx, r.verb, r.finalURLTemplate(), latency)
|
||||
|
||||
@ -675,7 +698,7 @@ func (r *Request) tryThrottle(ctx context.Context) error {
|
||||
}
|
||||
|
||||
type throttleSettings struct {
|
||||
logLevel klog.Level
|
||||
logLevel int
|
||||
minLogInterval time.Duration
|
||||
|
||||
lastLogTime time.Time
|
||||
@ -700,9 +723,9 @@ var globalThrottledLogger = &throttledLogger{
|
||||
},
|
||||
}
|
||||
|
||||
func (b *throttledLogger) attemptToLog() (klog.Level, bool) {
|
||||
func (b *throttledLogger) attemptToLog(logger klog.Logger) (int, bool) {
|
||||
for _, setting := range b.settings {
|
||||
if bool(klog.V(setting.logLevel).Enabled()) {
|
||||
if bool(logger.V(setting.logLevel).Enabled()) {
|
||||
// Return early without write locking if possible.
|
||||
if func() bool {
|
||||
setting.lock.RLock()
|
||||
@ -724,9 +747,9 @@ func (b *throttledLogger) attemptToLog() (klog.Level, bool) {
|
||||
|
||||
// Infof will write a log message at each logLevel specified by the receiver's throttleSettings
|
||||
// as long as it hasn't written a log message more recently than minLogInterval.
|
||||
func (b *throttledLogger) Infof(message string, args ...interface{}) {
|
||||
if logLevel, ok := b.attemptToLog(); ok {
|
||||
klog.V(logLevel).Infof(message, args...)
|
||||
func (b *throttledLogger) info(logger klog.Logger, message string, kv ...any) {
|
||||
if logLevel, ok := b.attemptToLog(logger); ok {
|
||||
logger.V(logLevel).Info(message, kv...)
|
||||
}
|
||||
}
|
||||
|
||||
@ -739,7 +762,7 @@ func (r *Request) Watch(ctx context.Context) (watch.Interface, error) {
|
||||
|
||||
func (r *Request) watchInternal(ctx context.Context) (watch.Interface, runtime.Decoder, error) {
|
||||
if r.body == nil {
|
||||
logBody(ctx, 2, "Request Body", r.bodyBytes)
|
||||
logBody(klog.FromContext(ctx), 2, "Request Body", r.bodyBytes)
|
||||
}
|
||||
|
||||
// We specifically don't want to rate limit watches, so we
|
||||
@ -776,7 +799,7 @@ func (r *Request) watchInternal(ctx context.Context) (watch.Interface, runtime.D
|
||||
resp, err := client.Do(req)
|
||||
retry.After(ctx, r, resp, err)
|
||||
if err == nil && resp.StatusCode == http.StatusOK {
|
||||
return r.newStreamWatcher(resp)
|
||||
return r.newStreamWatcher(ctx, resp)
|
||||
}
|
||||
|
||||
done, transformErr := func() (bool, error) {
|
||||
@ -898,7 +921,7 @@ func (r WatchListResult) Into(obj runtime.Object) error {
|
||||
// to see what parameters are currently required.
|
||||
func (r *Request) WatchList(ctx context.Context) WatchListResult {
|
||||
if r.body == nil {
|
||||
logBody(ctx, 2, "Request Body", r.bodyBytes)
|
||||
logBody(klog.FromContext(ctx), 2, "Request Body", r.bodyBytes)
|
||||
}
|
||||
|
||||
if !clientfeatures.FeatureGates().Enabled(clientfeatures.WatchListClient) {
|
||||
@ -969,23 +992,24 @@ func (r *Request) handleWatchList(ctx context.Context, w watch.Interface, negoti
|
||||
}
|
||||
}
|
||||
|
||||
func (r *Request) newStreamWatcher(resp *http.Response) (watch.Interface, runtime.Decoder, error) {
|
||||
func (r *Request) newStreamWatcher(ctx context.Context, resp *http.Response) (watch.Interface, runtime.Decoder, error) {
|
||||
contentType := resp.Header.Get("Content-Type")
|
||||
mediaType, params, err := mime.ParseMediaType(contentType)
|
||||
if err != nil {
|
||||
klog.V(4).Infof("Unexpected content type from the server: %q: %v", contentType, err)
|
||||
klog.FromContext(ctx).V(4).Info("Unexpected content type from the server", "contentType", contentType, "err", err)
|
||||
}
|
||||
objectDecoder, streamingSerializer, framer, err := r.contentConfig.Negotiator.StreamDecoder(mediaType, params)
|
||||
if err != nil {
|
||||
return nil, nil, err
|
||||
}
|
||||
|
||||
handleWarnings(resp.Header, r.warningHandler)
|
||||
handleWarnings(ctx, resp.Header, r.warningHandler)
|
||||
|
||||
frameReader := framer.NewFrameReader(resp.Body)
|
||||
watchEventDecoder := streaming.NewDecoder(frameReader, streamingSerializer)
|
||||
|
||||
return watch.NewStreamWatcher(
|
||||
return watch.NewStreamWatcherWithLogger(
|
||||
klog.FromContext(ctx),
|
||||
restclientwatch.NewDecoder(watchEventDecoder, objectDecoder),
|
||||
// use 500 to indicate that the cause of the error is unknown - other error codes
|
||||
// are more specific to HTTP interactions, and set a reason
|
||||
@ -1031,7 +1055,7 @@ func sanitize(req *Request, resp *http.Response, err error) (string, string) {
|
||||
// If we can, we return that as an error. Otherwise, we create an error that lists the http status and the content of the response.
|
||||
func (r *Request) Stream(ctx context.Context) (io.ReadCloser, error) {
|
||||
if r.body == nil {
|
||||
logBody(ctx, 2, "Request Body", r.bodyBytes)
|
||||
logBody(klog.FromContext(ctx), 2, "Request Body", r.bodyBytes)
|
||||
}
|
||||
|
||||
if r.err != nil {
|
||||
@ -1067,7 +1091,7 @@ func (r *Request) Stream(ctx context.Context) (io.ReadCloser, error) {
|
||||
|
||||
switch {
|
||||
case (resp.StatusCode >= 200) && (resp.StatusCode < 300):
|
||||
handleWarnings(resp.Header, r.warningHandler)
|
||||
handleWarnings(ctx, resp.Header, r.warningHandler)
|
||||
return resp.Body, nil
|
||||
|
||||
default:
|
||||
@ -1175,7 +1199,7 @@ func (r *Request) request(ctx context.Context, fn func(*http.Request, *http.Resp
|
||||
}()
|
||||
|
||||
if r.err != nil {
|
||||
klog.V(4).Infof("Error in request: %v", r.err)
|
||||
klog.FromContext(ctx).V(4).Info("Error in request", "err", r.err)
|
||||
return r.err
|
||||
}
|
||||
|
||||
@ -1267,8 +1291,9 @@ func (r *Request) request(ctx context.Context, fn func(*http.Request, *http.Resp
|
||||
// - If the server responds with a status: *errors.StatusError or *errors.UnexpectedObjectError
|
||||
// - http.Client.Do errors are returned directly.
|
||||
func (r *Request) Do(ctx context.Context) Result {
|
||||
logger := klog.FromContext(ctx)
|
||||
if r.body == nil {
|
||||
logBody(ctx, 2, "Request Body", r.bodyBytes)
|
||||
logBody(logger, 2, "Request Body", r.bodyBytes)
|
||||
}
|
||||
|
||||
var result Result
|
||||
@ -1276,7 +1301,7 @@ func (r *Request) Do(ctx context.Context) Result {
|
||||
result = r.transformResponse(ctx, resp, req)
|
||||
})
|
||||
if err != nil {
|
||||
return Result{err: err}
|
||||
return Result{err: err, logger: logger}
|
||||
}
|
||||
if result.err == nil || len(result.body) > 0 {
|
||||
metrics.ResponseSize.Observe(ctx, r.verb, r.URL().Host, float64(len(result.body)))
|
||||
@ -1286,14 +1311,15 @@ func (r *Request) Do(ctx context.Context) Result {
|
||||
|
||||
// DoRaw executes the request but does not process the response body.
|
||||
func (r *Request) DoRaw(ctx context.Context) ([]byte, error) {
|
||||
logger := klog.FromContext(ctx)
|
||||
if r.body == nil {
|
||||
logBody(ctx, 2, "Request Body", r.bodyBytes)
|
||||
logBody(logger, 2, "Request Body", r.bodyBytes)
|
||||
}
|
||||
|
||||
var result Result
|
||||
err := r.request(ctx, func(req *http.Request, resp *http.Response) {
|
||||
result.body, result.err = io.ReadAll(resp.Body)
|
||||
logBody(ctx, 2, "Response Body", result.body)
|
||||
logBody(logger, 2, "Response Body", result.body)
|
||||
if resp.StatusCode < http.StatusOK || resp.StatusCode > http.StatusPartialContent {
|
||||
result.err = r.transformUnstructuredResponseError(resp, req, result.body)
|
||||
}
|
||||
@ -1309,6 +1335,7 @@ func (r *Request) DoRaw(ctx context.Context) ([]byte, error) {
|
||||
|
||||
// transformResponse converts an API response into a structured API object
|
||||
func (r *Request) transformResponse(ctx context.Context, resp *http.Response, req *http.Request) Result {
|
||||
logger := klog.FromContext(ctx)
|
||||
var body []byte
|
||||
if resp.Body != nil {
|
||||
data, err := io.ReadAll(resp.Body)
|
||||
@ -1323,22 +1350,24 @@ func (r *Request) transformResponse(ctx context.Context, resp *http.Response, re
|
||||
// 2. Apiserver sends back the headers and then part of the body
|
||||
// 3. Apiserver closes connection.
|
||||
// 4. client-go should catch this and return an error.
|
||||
klog.V(2).Infof("Stream error %#v when reading response body, may be caused by closed connection.", err)
|
||||
logger.V(2).Info("Stream error when reading response body, may be caused by closed connection", "err", err)
|
||||
streamErr := fmt.Errorf("stream error when reading response body, may be caused by closed connection. Please retry. Original error: %w", err)
|
||||
return Result{
|
||||
err: streamErr,
|
||||
err: streamErr,
|
||||
logger: logger,
|
||||
}
|
||||
default:
|
||||
klog.Errorf("Unexpected error when reading response body: %v", err)
|
||||
logger.Error(err, "Unexpected error when reading response body")
|
||||
unexpectedErr := fmt.Errorf("unexpected error when reading response body. Please retry. Original error: %w", err)
|
||||
return Result{
|
||||
err: unexpectedErr,
|
||||
err: unexpectedErr,
|
||||
logger: logger,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Call depth is tricky. This one is okay for Do and DoRaw.
|
||||
logBody(ctx, 7, "Response Body", body)
|
||||
logBody(logger, 7, "Response Body", body)
|
||||
|
||||
// verify the content type is accurate
|
||||
var decoder runtime.Decoder
|
||||
@ -1350,7 +1379,7 @@ func (r *Request) transformResponse(ctx context.Context, resp *http.Response, re
|
||||
var err error
|
||||
mediaType, params, err := mime.ParseMediaType(contentType)
|
||||
if err != nil {
|
||||
return Result{err: errors.NewInternalError(err)}
|
||||
return Result{err: errors.NewInternalError(err), logger: logger}
|
||||
}
|
||||
decoder, err = r.contentConfig.Negotiator.Decoder(mediaType, params)
|
||||
if err != nil {
|
||||
@ -1359,13 +1388,14 @@ func (r *Request) transformResponse(ctx context.Context, resp *http.Response, re
|
||||
case resp.StatusCode == http.StatusSwitchingProtocols:
|
||||
// no-op, we've been upgraded
|
||||
case resp.StatusCode < http.StatusOK || resp.StatusCode > http.StatusPartialContent:
|
||||
return Result{err: r.transformUnstructuredResponseError(resp, req, body)}
|
||||
return Result{err: r.transformUnstructuredResponseError(resp, req, body), logger: logger}
|
||||
}
|
||||
return Result{
|
||||
body: body,
|
||||
contentType: contentType,
|
||||
statusCode: resp.StatusCode,
|
||||
warnings: handleWarnings(resp.Header, r.warningHandler),
|
||||
warnings: handleWarnings(ctx, resp.Header, r.warningHandler),
|
||||
logger: logger,
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1384,7 +1414,8 @@ func (r *Request) transformResponse(ctx context.Context, resp *http.Response, re
|
||||
statusCode: resp.StatusCode,
|
||||
decoder: decoder,
|
||||
err: err,
|
||||
warnings: handleWarnings(resp.Header, r.warningHandler),
|
||||
warnings: handleWarnings(ctx, resp.Header, r.warningHandler),
|
||||
logger: logger,
|
||||
}
|
||||
}
|
||||
|
||||
@ -1393,7 +1424,8 @@ func (r *Request) transformResponse(ctx context.Context, resp *http.Response, re
|
||||
contentType: contentType,
|
||||
statusCode: resp.StatusCode,
|
||||
decoder: decoder,
|
||||
warnings: handleWarnings(resp.Header, r.warningHandler),
|
||||
warnings: handleWarnings(ctx, resp.Header, r.warningHandler),
|
||||
logger: logger,
|
||||
}
|
||||
}
|
||||
|
||||
@ -1421,8 +1453,7 @@ func truncateBody(logger klog.Logger, body string) string {
|
||||
// whether the body is printable.
|
||||
//
|
||||
// It needs to be called by all functions which send or receive the data.
|
||||
func logBody(ctx context.Context, callDepth int, prefix string, body []byte) {
|
||||
logger := klog.FromContext(ctx)
|
||||
func logBody(logger klog.Logger, callDepth int, prefix string, body []byte) {
|
||||
if loggerV := logger.V(8); loggerV.Enabled() {
|
||||
loggerV := loggerV.WithCallDepth(callDepth)
|
||||
if bytes.IndexFunc(body, func(r rune) bool {
|
||||
@ -1524,6 +1555,7 @@ type Result struct {
|
||||
contentType string
|
||||
err error
|
||||
statusCode int
|
||||
logger klog.Logger
|
||||
|
||||
decoder runtime.Decoder
|
||||
}
|
||||
@ -1629,7 +1661,7 @@ func (r Result) Error() error {
|
||||
// to be backwards compatible with old servers that do not return a version, default to "v1"
|
||||
out, _, err := r.decoder.Decode(r.body, &schema.GroupVersionKind{Version: "v1"}, nil)
|
||||
if err != nil {
|
||||
klog.V(5).Infof("body was not decodable (unable to check for Status): %v", err)
|
||||
r.logger.V(5).Info("Body was not decodable (unable to check for Status)", "err", err)
|
||||
return r.err
|
||||
}
|
||||
switch t := out.(type) {
|
||||
|
Reference in New Issue
Block a user