
- Added metav1.Status() that enforces '406 Not Acceptable' response if protobuf serialization is not fully supported for the API resource type. - JSON and YAML serialization are supposed to be more completely baked in, so serialization involving those, and general errors with seralizing protobuf, will return '500 Internal Server Error'. - If serialization failure occurs and original HTTP status code is error, use the original status code, else use the serialization failure status code. - Write encoded API responses to intermediate buffer - Use apimachinery/runtime::Encode() instead of apimachinery/runtime/protocol::Encode() in apiserver/endpoints/handlers/responsewriters/writers::SerializeObject() - This allows for intended encoder error handling to fully work, facilitated by apiserver/endpoints/handlers/responsewriters/status::ErrorToAPIResponse() before officially writing to the http.ResponseWriter - The specific part that wasn't working by ErrorToAPIResponse() was the HTTP status code set. A direct call to http.ResponseWriter::WriteHeader(statusCode) was made in SerializeObject() with the original response status code, before performing the encode. Once this method is called, it can not again update the status code at a later time, with say, an erro status code due to encode failure. - Updated relevant apiserver unit test to reflect the new behavior (TestWriteJSONDecodeError()) - Add build deps from make update for protobuf serializer 50342: Code review suggestion impl - Ensure that http.ResponseWriter::Header().Set() is called before http.ResponseWriter::WriteHeader() - This will avert a potential issue where changing the response media type to text/plain wouldn't work. - We want to respond with plain text if serialization fails of the original response, and serialization also fails for the resultant error response. 50342: wrapper for http.ResponseWriter - Prevent potential performance regression caused by modifying encode to use a buffer instead of streaming - This is achieved by creating a wrapper type for http.ResponseWriter that will use WriteHeader(statusCode) on the first call to Write(). Thus, on encode success, Write() will write the original statusCode. On encode failure, we pass control onto responsewriters::errSerializationFatal(), which will process the error to obtain potentially a new status code, depending on whether or not the original status code was itself an error. 50342: code review suggestions - Remove historical note from unit test comment - Don't export httpResponseWriterWithInit type (for now)
External Repository Staging Area
This directory is the staging area for packages that have been split to their own repository. The content here will be periodically published to respective top-level k8s.io repositories.
Repositories currently staged here:
k8s.io/apiextensions-apiserver
k8s.io/api
k8s.io/apimachinery
k8s.io/apiserver
k8s.io/client-go
k8s.io/kube-aggregator
k8s.io/code-generator
k8s.io/metrics
k8s.io/sample-apiserver
k8s.io/sample-controller
The code in the staging/ directory is authoritative, i.e. the only copy of the code. You can directly modify such code.
Using staged repositories from Kubernetes code
Kubernetes code uses the repositories in this directory via symlinks in the
vendor/k8s.io
directory into this staging area. For example, when
Kubernetes code imports a package from the k8s.io/client-go
repository, that
import is resolved to staging/src/k8s.io/client-go
relative to the project
root:
// pkg/example/some_code.go
package example
import (
"k8s.io/client-go/dynamic" // resolves to staging/src/k8s.io/client-go/dynamic
)
Once the change-over to external repositories is complete, these repositories
will actually be vendored from k8s.io/<package-name>
.