diff --git a/api/openapi-spec/swagger.json b/api/openapi-spec/swagger.json index 078cff53343..885025a8104 100644 --- a/api/openapi-spec/swagger.json +++ b/api/openapi-spec/swagger.json @@ -3638,7 +3638,7 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/v1.Pod" + "type": "string" } }, "401": { diff --git a/api/swagger-spec/v1.json b/api/swagger-spec/v1.json index 02068ffd1fb..575bc377fb4 100644 --- a/api/swagger-spec/v1.json +++ b/api/swagger-spec/v1.json @@ -8980,7 +8980,7 @@ "description": "API at /api/v1", "operations": [ { - "type": "v1.Pod", + "type": "string", "method": "GET", "summary": "read log of the specified Pod", "nickname": "readNamespacedPodLog", @@ -9070,7 +9070,7 @@ { "code": 200, "message": "OK", - "responseModel": "v1.Pod" + "responseModel": "string" } ], "produces": [ diff --git a/docs/api-reference/v1/operations.html b/docs/api-reference/v1/operations.html index 27054537768..c61291da5c4 100755 --- a/docs/api-reference/v1/operations.html +++ b/docs/api-reference/v1/operations.html @@ -8971,7 +8971,7 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }

200

success

-

v1.Pod

+

string

@@ -33308,7 +33308,7 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; } diff --git a/pkg/api/rest/rest.go b/pkg/api/rest/rest.go index 993a9ccea1a..f7c3d05c224 100644 --- a/pkg/api/rest/rest.go +++ b/pkg/api/rest/rest.go @@ -290,6 +290,10 @@ type StorageMetadata interface { // ProducesMIMETypes returns a list of the MIME types the specified HTTP verb (GET, POST, DELETE, // PATCH) can respond with. ProducesMIMETypes(verb string) []string + + // ProducesObject returns an object the specified HTTP verb respond with. It will overwrite storage object if + // it is not nil. Only the type of the return object matters, the value will be ignored. + ProducesObject(verb string) interface{} } // ConnectRequest is an object passed to admission control for Connect operations diff --git a/pkg/apiserver/api_installer.go b/pkg/apiserver/api_installer.go index 28a8442a6ae..5238cd01c8d 100644 --- a/pkg/apiserver/api_installer.go +++ b/pkg/apiserver/api_installer.go @@ -213,7 +213,7 @@ func (a *APIInstaller) registerResourceHandlers(path string, storage rest.Storag if err != nil { return nil, err } - versionedObject := indirectArbitraryPointer(versionedPtr) + defaultVersionedObject := indirectArbitraryPointer(versionedPtr) kind := fqKindToRegister.Kind hasSubresource := len(subresource) > 0 @@ -520,6 +520,10 @@ func (a *APIInstaller) registerResourceHandlers(path string, storage rest.Storag Kind: fqKindToRegister, } for _, action := range actions { + versionedObject := storageMeta.ProducesObject(action.Verb) + if versionedObject == nil { + versionedObject = defaultVersionedObject + } reqScope.Namer = action.Namer namespaced := "" if apiResource.Namespaced { @@ -1054,6 +1058,10 @@ func (defaultStorageMetadata) ProducesMIMETypes(verb string) []string { return nil } +func (defaultStorageMetadata) ProducesObject(verb string) interface{} { + return nil +} + // splitSubresource checks if the given storage path is the path of a subresource and returns // the resource and subresource components. func splitSubresource(path string) (string, string, error) { diff --git a/pkg/apiserver/apiserver_test.go b/pkg/apiserver/apiserver_test.go index 3c73db845da..ce2ef5afb75 100644 --- a/pkg/apiserver/apiserver_test.go +++ b/pkg/apiserver/apiserver_test.go @@ -620,6 +620,10 @@ func (m *MetadataRESTStorage) ProducesMIMETypes(method string) []string { return m.types } +func (m *MetadataRESTStorage) ProducesObject(verb string) interface{} { + return nil +} + var _ rest.StorageMetadata = &MetadataRESTStorage{} type GetWithOptionsRESTStorage struct { diff --git a/pkg/registry/core/pod/rest/log.go b/pkg/registry/core/pod/rest/log.go index 5f14e95dd7d..989df4bd60e 100644 --- a/pkg/registry/core/pod/rest/log.go +++ b/pkg/registry/core/pod/rest/log.go @@ -55,6 +55,11 @@ func (r *LogREST) ProducesMIMETypes(verb string) []string { } } +// LogREST implements StorageMetadata, return string as the generating object +func (r *LogREST) ProducesObject(verb string) interface{} { + return "" +} + // Get retrieves a runtime.Object that will stream the contents of the pod log func (r *LogREST) Get(ctx api.Context, name string, opts runtime.Object) (runtime.Object, error) { logOpts, ok := opts.(*api.PodLogOptions)