From 3aa055295987b0156b91a50c22a3bfb5232bb1fc Mon Sep 17 00:00:00 2001 From: Jordan Liggitt Date: Tue, 26 Nov 2019 13:13:25 -0500 Subject: [PATCH] Switch TableGenerator/TableConvertor interfaces to metav1 Kubernetes-commit: 36eb250cbb441984260ded6f7abeb796974031c3 --- pkg/endpoints/apiserver_test.go | 52 ++++++++++++++------------ pkg/endpoints/handlers/response.go | 8 ++-- pkg/endpoints/handlers/watch.go | 3 +- pkg/registry/generic/registry/store.go | 3 +- pkg/registry/rest/rest.go | 5 ++- pkg/registry/rest/table.go | 11 +++--- 6 files changed, 42 insertions(+), 40 deletions(-) diff --git a/pkg/endpoints/apiserver_test.go b/pkg/endpoints/apiserver_test.go index 80c70f50b..bdd41236a 100644 --- a/pkg/endpoints/apiserver_test.go +++ b/pkg/endpoints/apiserver_test.go @@ -377,7 +377,7 @@ func (storage *SimpleRESTStorage) Export(ctx context.Context, name string, opts return obj, storage.errors["export"] } -func (storage *SimpleRESTStorage) ConvertToTable(ctx context.Context, obj runtime.Object, tableOptions runtime.Object) (*metav1beta1.Table, error) { +func (storage *SimpleRESTStorage) ConvertToTable(ctx context.Context, obj runtime.Object, tableOptions runtime.Object) (*metav1.Table, error) { return rest.NewDefaultTableConvertor(schema.GroupResource{Resource: "simple"}).ConvertToTable(ctx, obj, tableOptions) } @@ -895,6 +895,10 @@ func (OnlyGetRESTStorage) List(ctx context.Context, options *metainternalversion return nil, nil } +func (OnlyGetRESTStorage) ConvertToTable(ctx context.Context, object runtime.Object, tableOptions runtime.Object) (*metav1.Table, error) { + return nil, nil +} + // TestSomeUnimplementedRESTStorage ensures that if a rest.Storage does // not implement a given method, that it is literally not registered // with the server. We need to have at least one verb supported inorder @@ -1900,7 +1904,7 @@ func TestGetTable(t *testing.T) { accept string params url.Values pretty bool - expected *metav1beta1.Table + expected *metav1.Table statusCode int item bool }{ @@ -1935,14 +1939,14 @@ func TestGetTable(t *testing.T) { { item: true, accept: "application/json;as=Table;v=v1beta1;g=meta.k8s.io", - expected: &metav1beta1.Table{ + expected: &metav1.Table{ TypeMeta: metav1.TypeMeta{Kind: "Table", APIVersion: "meta.k8s.io/v1beta1"}, ListMeta: metav1.ListMeta{ResourceVersion: "10", SelfLink: "/blah"}, - ColumnDefinitions: []metav1beta1.TableColumnDefinition{ + ColumnDefinitions: []metav1.TableColumnDefinition{ {Name: "Name", Type: "string", Format: "name", Description: metaDoc["name"]}, {Name: "Created At", Type: "date", Description: metaDoc["creationTimestamp"]}, }, - Rows: []metav1beta1.TableRow{ + Rows: []metav1.TableRow{ {Cells: []interface{}{"foo1", now.Time.UTC().Format(time.RFC3339)}, Object: runtime.RawExtension{Raw: encodedV1Beta1Body}}, }, }, @@ -1953,14 +1957,14 @@ func TestGetTable(t *testing.T) { runtime.ContentTypeProtobuf + ";as=Table;v=v1beta1;g=meta.k8s.io", "application/json;as=Table;v=v1beta1;g=meta.k8s.io", }, ","), - expected: &metav1beta1.Table{ + expected: &metav1.Table{ TypeMeta: metav1.TypeMeta{Kind: "Table", APIVersion: "meta.k8s.io/v1beta1"}, ListMeta: metav1.ListMeta{ResourceVersion: "10", SelfLink: "/blah"}, - ColumnDefinitions: []metav1beta1.TableColumnDefinition{ + ColumnDefinitions: []metav1.TableColumnDefinition{ {Name: "Name", Type: "string", Format: "name", Description: metaDoc["name"]}, {Name: "Created At", Type: "date", Description: metaDoc["creationTimestamp"]}, }, - Rows: []metav1beta1.TableRow{ + Rows: []metav1.TableRow{ {Cells: []interface{}{"foo1", now.Time.UTC().Format(time.RFC3339)}, Object: runtime.RawExtension{Raw: encodedV1Beta1Body}}, }, }, @@ -1969,14 +1973,14 @@ func TestGetTable(t *testing.T) { item: true, accept: "application/json;as=Table;v=v1beta1;g=meta.k8s.io", params: url.Values{"includeObject": []string{"Metadata"}}, - expected: &metav1beta1.Table{ + expected: &metav1.Table{ TypeMeta: metav1.TypeMeta{Kind: "Table", APIVersion: "meta.k8s.io/v1beta1"}, ListMeta: metav1.ListMeta{ResourceVersion: "10", SelfLink: "/blah"}, - ColumnDefinitions: []metav1beta1.TableColumnDefinition{ + ColumnDefinitions: []metav1.TableColumnDefinition{ {Name: "Name", Type: "string", Format: "name", Description: metaDoc["name"]}, {Name: "Created At", Type: "date", Description: metaDoc["creationTimestamp"]}, }, - Rows: []metav1beta1.TableRow{ + Rows: []metav1.TableRow{ {Cells: []interface{}{"foo1", now.Time.UTC().Format(time.RFC3339)}, Object: runtime.RawExtension{Raw: encodedV1Beta1Body}}, }, }, @@ -1984,14 +1988,14 @@ func TestGetTable(t *testing.T) { { accept: "application/json;as=Table;v=v1beta1;g=meta.k8s.io", params: url.Values{"includeObject": []string{"Metadata"}}, - expected: &metav1beta1.Table{ + expected: &metav1.Table{ TypeMeta: metav1.TypeMeta{Kind: "Table", APIVersion: "meta.k8s.io/v1beta1"}, ListMeta: metav1.ListMeta{ResourceVersion: "10", SelfLink: "/test/link"}, - ColumnDefinitions: []metav1beta1.TableColumnDefinition{ + ColumnDefinitions: []metav1.TableColumnDefinition{ {Name: "Name", Type: "string", Format: "name", Description: metaDoc["name"]}, {Name: "Created At", Type: "date", Description: metaDoc["creationTimestamp"]}, }, - Rows: []metav1beta1.TableRow{ + Rows: []metav1.TableRow{ {Cells: []interface{}{"foo1", now.Time.UTC().Format(time.RFC3339)}, Object: runtime.RawExtension{Raw: encodedV1Beta1Body}}, }, }, @@ -2051,7 +2055,7 @@ func TestGetTable(t *testing.T) { if resp.StatusCode != http.StatusOK { t.Errorf("%d: unexpected response: %#v", i, resp) } - var itemOut metav1beta1.Table + var itemOut metav1.Table body, err := extractBody(resp, &itemOut) if err != nil { t.Fatal(err) @@ -2117,14 +2121,14 @@ func TestWatchTable(t *testing.T) { { Type: "ADDED", Object: runtime.RawExtension{ - Raw: []byte(strings.TrimSpace(runtime.EncodeOrDie(s, &metav1beta1.Table{ + Raw: []byte(strings.TrimSpace(runtime.EncodeOrDie(s, &metav1.Table{ TypeMeta: metav1.TypeMeta{Kind: "Table", APIVersion: "meta.k8s.io/v1beta1"}, ListMeta: metav1.ListMeta{ResourceVersion: "10", SelfLink: "/blah"}, - ColumnDefinitions: []metav1beta1.TableColumnDefinition{ + ColumnDefinitions: []metav1.TableColumnDefinition{ {Name: "Name", Type: "string", Format: "name", Description: metaDoc["name"]}, {Name: "Created At", Type: "date", Description: metaDoc["creationTimestamp"]}, }, - Rows: []metav1beta1.TableRow{ + Rows: []metav1.TableRow{ {Cells: []interface{}{"foo1", time.Unix(1, 0).UTC().Format(time.RFC3339)}, Object: runtime.RawExtension{Raw: encodedBody}}, }, }))), @@ -2142,14 +2146,14 @@ func TestWatchTable(t *testing.T) { { Type: "ADDED", Object: runtime.RawExtension{ - Raw: []byte(strings.TrimSpace(runtime.EncodeOrDie(s, &metav1beta1.Table{ + Raw: []byte(strings.TrimSpace(runtime.EncodeOrDie(s, &metav1.Table{ TypeMeta: metav1.TypeMeta{Kind: "Table", APIVersion: "meta.k8s.io/v1beta1"}, ListMeta: metav1.ListMeta{ResourceVersion: "10", SelfLink: "/blah"}, - ColumnDefinitions: []metav1beta1.TableColumnDefinition{ + ColumnDefinitions: []metav1.TableColumnDefinition{ {Name: "Name", Type: "string", Format: "name", Description: metaDoc["name"]}, {Name: "Created At", Type: "date", Description: metaDoc["creationTimestamp"]}, }, - Rows: []metav1beta1.TableRow{ + Rows: []metav1.TableRow{ {Cells: []interface{}{"foo1", time.Unix(1, 0).UTC().Format(time.RFC3339)}, Object: runtime.RawExtension{Raw: encodedBody}}, }, }))), @@ -2158,10 +2162,10 @@ func TestWatchTable(t *testing.T) { { Type: "MODIFIED", Object: runtime.RawExtension{ - Raw: []byte(strings.TrimSpace(runtime.EncodeOrDie(s, &metav1beta1.Table{ + Raw: []byte(strings.TrimSpace(runtime.EncodeOrDie(s, &metav1.Table{ TypeMeta: metav1.TypeMeta{Kind: "Table", APIVersion: "meta.k8s.io/v1beta1"}, ListMeta: metav1.ListMeta{ResourceVersion: "10", SelfLink: "/blah"}, - Rows: []metav1beta1.TableRow{ + Rows: []metav1.TableRow{ {Cells: []interface{}{"foo1", time.Unix(1, 0).UTC().Format(time.RFC3339)}, Object: runtime.RawExtension{Raw: encodedBody}}, }, }))), @@ -2182,7 +2186,7 @@ func TestWatchTable(t *testing.T) { Raw: []byte(strings.TrimSpace(runtime.EncodeOrDie(s, &metav1.Table{ TypeMeta: metav1.TypeMeta{Kind: "Table", APIVersion: "meta.k8s.io/v1"}, ListMeta: metav1.ListMeta{ResourceVersion: "10", SelfLink: "/blah"}, - ColumnDefinitions: []metav1beta1.TableColumnDefinition{ + ColumnDefinitions: []metav1.TableColumnDefinition{ {Name: "Name", Type: "string", Format: "name", Description: metaDoc["name"]}, {Name: "Created At", Type: "date", Description: metaDoc["creationTimestamp"]}, }, diff --git a/pkg/endpoints/handlers/response.go b/pkg/endpoints/handlers/response.go index 6a13a8d5e..f9b38e07d 100644 --- a/pkg/endpoints/handlers/response.go +++ b/pkg/endpoints/handlers/response.go @@ -74,7 +74,7 @@ func doTransformObject(ctx context.Context, obj runtime.Object, opts interface{} return asPartialObjectMetadataList(obj, target.GroupVersion()) case target.Kind == "Table": - options, ok := opts.(*metav1beta1.TableOptions) + options, ok := opts.(*metav1.TableOptions) if !ok { return nil, fmt.Errorf("unexpected TableOptions, got %T", opts) } @@ -93,8 +93,8 @@ func optionsForTransform(mediaType negotiation.MediaTypeOptions, req *http.Reque switch target := mediaType.Convert; { case target == nil: case target.Kind == "Table" && (target.GroupVersion() == metav1beta1.SchemeGroupVersion || target.GroupVersion() == metav1.SchemeGroupVersion): - opts := &metav1beta1.TableOptions{} - if err := metainternalversionscheme.ParameterCodec.DecodeParameters(req.URL.Query(), metav1beta1.SchemeGroupVersion, opts); err != nil { + opts := &metav1.TableOptions{} + if err := metainternalversionscheme.ParameterCodec.DecodeParameters(req.URL.Query(), metav1.SchemeGroupVersion, opts); err != nil { return nil, err } switch errs := validation.ValidateTableOptions(opts); len(errs) { @@ -159,7 +159,7 @@ func (e errNotAcceptable) Status() metav1.Status { } } -func asTable(ctx context.Context, result runtime.Object, opts *metav1beta1.TableOptions, scope *RequestScope, groupVersion schema.GroupVersion) (runtime.Object, error) { +func asTable(ctx context.Context, result runtime.Object, opts *metav1.TableOptions, scope *RequestScope, groupVersion schema.GroupVersion) (runtime.Object, error) { switch groupVersion { case metav1beta1.SchemeGroupVersion, metav1.SchemeGroupVersion: default: diff --git a/pkg/endpoints/handlers/watch.go b/pkg/endpoints/handlers/watch.go index fb201ba16..e79e72e4e 100644 --- a/pkg/endpoints/handlers/watch.go +++ b/pkg/endpoints/handlers/watch.go @@ -25,7 +25,6 @@ import ( "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - metav1beta1 "k8s.io/apimachinery/pkg/apis/meta/v1beta1" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/serializer/streaming" utilruntime "k8s.io/apimachinery/pkg/util/runtime" @@ -125,7 +124,7 @@ func serveWatch(watcher watch.Interface, scope *RequestScope, mediaTypeOptions n // When we are transformed to a table, use the table options as the state for whether we // should print headers - on watch, we only want to print table headers on the first object // and omit them on subsequent events. - if tableOptions, ok := options.(*metav1beta1.TableOptions); ok { + if tableOptions, ok := options.(*metav1.TableOptions); ok { tableOptions.NoHeaders = true } return result diff --git a/pkg/registry/generic/registry/store.go b/pkg/registry/generic/registry/store.go index 07ef46cbd..f12975d31 100644 --- a/pkg/registry/generic/registry/store.go +++ b/pkg/registry/generic/registry/store.go @@ -29,7 +29,6 @@ import ( "k8s.io/apimachinery/pkg/api/validation/path" metainternalversion "k8s.io/apimachinery/pkg/apis/meta/internalversion" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - metav1beta1 "k8s.io/apimachinery/pkg/apis/meta/v1beta1" "k8s.io/apimachinery/pkg/fields" "k8s.io/apimachinery/pkg/labels" "k8s.io/apimachinery/pkg/runtime" @@ -1362,7 +1361,7 @@ func (e *Store) startObservingCount(period time.Duration) func() { return func() { close(stopCh) } } -func (e *Store) ConvertToTable(ctx context.Context, object runtime.Object, tableOptions runtime.Object) (*metav1beta1.Table, error) { +func (e *Store) ConvertToTable(ctx context.Context, object runtime.Object, tableOptions runtime.Object) (*metav1.Table, error) { if e.TableConvertor != nil { return e.TableConvertor.ConvertToTable(ctx, object, tableOptions) } diff --git a/pkg/registry/rest/rest.go b/pkg/registry/rest/rest.go index 28f4bf07c..9ea6f9897 100644 --- a/pkg/registry/rest/rest.go +++ b/pkg/registry/rest/rest.go @@ -24,7 +24,6 @@ import ( metainternalversion "k8s.io/apimachinery/pkg/apis/meta/internalversion" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - metav1beta1 "k8s.io/apimachinery/pkg/apis/meta/v1beta1" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apimachinery/pkg/watch" @@ -99,6 +98,8 @@ type Lister interface { NewList() runtime.Object // List selects resources in the storage which match to the selector. 'options' can be nil. List(ctx context.Context, options *metainternalversion.ListOptions) (runtime.Object, error) + // TableConvertor ensures all list implementers also implement table conversion + TableConvertor } // Exporter is an object that knows how to strip a RESTful resource for export. A store should implement this interface @@ -141,7 +142,7 @@ type GetterWithOptions interface { } type TableConvertor interface { - ConvertToTable(ctx context.Context, object runtime.Object, tableOptions runtime.Object) (*metav1beta1.Table, error) + ConvertToTable(ctx context.Context, object runtime.Object, tableOptions runtime.Object) (*metav1.Table, error) } // GracefulDeleter knows how to pass deletion options to allow delayed deletion of a diff --git a/pkg/registry/rest/table.go b/pkg/registry/rest/table.go index 684f4acdc..31a46c743 100644 --- a/pkg/registry/rest/table.go +++ b/pkg/registry/rest/table.go @@ -24,7 +24,6 @@ import ( "k8s.io/apimachinery/pkg/api/meta" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - metav1beta1 "k8s.io/apimachinery/pkg/apis/meta/v1beta1" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" ) @@ -40,14 +39,14 @@ func NewDefaultTableConvertor(resource schema.GroupResource) TableConvertor { var swaggerMetadataDescriptions = metav1.ObjectMeta{}.SwaggerDoc() -func (c defaultTableConvertor) ConvertToTable(ctx context.Context, object runtime.Object, tableOptions runtime.Object) (*metav1beta1.Table, error) { - var table metav1beta1.Table +func (c defaultTableConvertor) ConvertToTable(ctx context.Context, object runtime.Object, tableOptions runtime.Object) (*metav1.Table, error) { + var table metav1.Table fn := func(obj runtime.Object) error { m, err := meta.Accessor(obj) if err != nil { return errNotAcceptable{resource: c.qualifiedResource} } - table.Rows = append(table.Rows, metav1beta1.TableRow{ + table.Rows = append(table.Rows, metav1.TableRow{ Cells: []interface{}{m.GetName(), m.GetCreationTimestamp().Time.UTC().Format(time.RFC3339)}, Object: runtime.RawExtension{Object: obj}, }) @@ -74,8 +73,8 @@ func (c defaultTableConvertor) ConvertToTable(ctx context.Context, object runtim table.SelfLink = m.GetSelfLink() } } - if opt, ok := tableOptions.(*metav1beta1.TableOptions); !ok || !opt.NoHeaders { - table.ColumnDefinitions = []metav1beta1.TableColumnDefinition{ + if opt, ok := tableOptions.(*metav1.TableOptions); !ok || !opt.NoHeaders { + table.ColumnDefinitions = []metav1.TableColumnDefinition{ {Name: "Name", Type: "string", Format: "name", Description: swaggerMetadataDescriptions["name"]}, {Name: "Created At", Type: "date", Description: swaggerMetadataDescriptions["creationTimestamp"]}, }