From fec79e75a50f334d8384a5377513fc78222ea36a Mon Sep 17 00:00:00 2001 From: Alexander Zielenski <351783+alexzielenski@users.noreply.github.com> Date: Wed, 12 Oct 2022 11:43:46 -0700 Subject: [PATCH] add more options for fetching openapiv3 in clients remove serialized types from client update tests --- .../cached/disk/cached_discovery_test.go | 6 ++-- .../discovery/cached/memory/memcache_test.go | 6 ++-- .../discovery/discovery_client_test.go | 12 +++++--- .../client-go/openapi/cached/groupversion.go | 28 +++++++++++++------ .../k8s.io/client-go/openapi/groupversion.go | 24 ++++++++++------ 5 files changed, 50 insertions(+), 26 deletions(-) diff --git a/staging/src/k8s.io/client-go/discovery/cached/disk/cached_discovery_test.go b/staging/src/k8s.io/client-go/discovery/cached/disk/cached_discovery_test.go index f7fabab57fd..c632648069d 100644 --- a/staging/src/k8s.io/client-go/discovery/cached/disk/cached_discovery_test.go +++ b/staging/src/k8s.io/client-go/discovery/cached/disk/cached_discovery_test.go @@ -175,14 +175,14 @@ func TestOpenAPIDiskCache(t *testing.T) { for k, v := range paths { i++ - _, err = v.Schema() + _, err = v.SchemaJSON() assert.NoError(t, err) path := "/openapi/v3/" + strings.TrimPrefix(k, "/") assert.Equal(t, 1, fakeServer.RequestCounters[path]) // Ensure schema call is served from memory - _, err = v.Schema() + _, err = v.SchemaJSON() assert.NoError(t, err) assert.Equal(t, 1, fakeServer.RequestCounters[path]) @@ -196,7 +196,7 @@ func TestOpenAPIDiskCache(t *testing.T) { } // Ensure schema call is still served from disk - _, err = newPaths[k].Schema() + _, err = newPaths[k].SchemaJSON() assert.NoError(t, err) assert.Equal(t, 1+i, fakeServer.RequestCounters["/openapi/v3"]) assert.Equal(t, 1, fakeServer.RequestCounters[path]) diff --git a/staging/src/k8s.io/client-go/discovery/cached/memory/memcache_test.go b/staging/src/k8s.io/client-go/discovery/cached/memory/memcache_test.go index 2130fce1143..9d57f400515 100644 --- a/staging/src/k8s.io/client-go/discovery/cached/memory/memcache_test.go +++ b/staging/src/k8s.io/client-go/discovery/cached/memory/memcache_test.go @@ -416,7 +416,7 @@ func TestOpenAPIMemCache(t *testing.T) { require.NoError(t, err) for k, v := range paths { - original, err := v.Schema() + original, err := v.SchemaPB() if !assert.NoError(t, err) { continue } @@ -426,7 +426,7 @@ func TestOpenAPIMemCache(t *testing.T) { continue } - schemaAgain, err := pathsAgain[k].Schema() + schemaAgain, err := pathsAgain[k].SchemaPB() if !assert.NoError(t, err) { continue } @@ -442,7 +442,7 @@ func TestOpenAPIMemCache(t *testing.T) { continue } - schemaAgain, err = pathsAgain[k].Schema() + schemaAgain, err = pathsAgain[k].SchemaPB() if !assert.NoError(t, err) { continue } diff --git a/staging/src/k8s.io/client-go/discovery/discovery_client_test.go b/staging/src/k8s.io/client-go/discovery/discovery_client_test.go index b34b96901a9..4d8a275423f 100644 --- a/staging/src/k8s.io/client-go/discovery/discovery_client_test.go +++ b/staging/src/k8s.io/client-go/discovery/discovery_client_test.go @@ -577,25 +577,29 @@ func TestGetOpenAPISchemaV3(t *testing.T) { } for k, v := range paths { - actual, err := v.Schema() + actual, err := v.SchemaPB() if err != nil { t.Fatal(err) } expected := testV3Specs[k] - if !golangproto.Equal(expected, actual) { + expectedPB, err := golangproto.Marshal(expected) + if err != nil { + t.Fatal(err) + } + if !reflect.DeepEqual(expectedPB, actual) { t.Fatalf("expected \n%v\n\ngot:\n%v", expected, actual) } // Ensure that fetching schema once again does not return same instance - actualAgain, err := v.Schema() + actualAgain, err := v.SchemaPB() if err != nil { t.Fatal(err) } if reflect.ValueOf(actual).Pointer() == reflect.ValueOf(actualAgain).Pointer() { t.Fatal("expected schema not to be cached") - } else if !golangproto.Equal(actual, actualAgain) { + } else if !reflect.DeepEqual(expectedPB, actualAgain) { t.Fatal("expected schema values to be equal") } } diff --git a/staging/src/k8s.io/client-go/openapi/cached/groupversion.go b/staging/src/k8s.io/client-go/openapi/cached/groupversion.go index ba78b048b51..079deda5b36 100644 --- a/staging/src/k8s.io/client-go/openapi/cached/groupversion.go +++ b/staging/src/k8s.io/client-go/openapi/cached/groupversion.go @@ -19,15 +19,19 @@ package cached import ( "sync" - openapi_v3 "github.com/google/gnostic/openapiv3" "k8s.io/client-go/openapi" ) type groupversion struct { delegate openapi.GroupVersion - once sync.Once - doc *openapi_v3.Document - err error + + jsonOnce sync.Once + jsonBytes []byte + jsonErr error + + pbOnce sync.Once + pbBytes []byte + pbErr error } func newGroupVersion(delegate openapi.GroupVersion) *groupversion { @@ -36,10 +40,18 @@ func newGroupVersion(delegate openapi.GroupVersion) *groupversion { } } -func (g *groupversion) Schema() (*openapi_v3.Document, error) { - g.once.Do(func() { - g.doc, g.err = g.delegate.Schema() +func (g *groupversion) SchemaPB() ([]byte, error) { + g.pbOnce.Do(func() { + g.pbBytes, g.pbErr = g.delegate.SchemaPB() }) - return g.doc, g.err + return g.pbBytes, g.pbErr +} + +func (g *groupversion) SchemaJSON() ([]byte, error) { + g.jsonOnce.Do(func() { + g.jsonBytes, g.jsonErr = g.delegate.SchemaJSON() + }) + + return g.jsonBytes, g.jsonErr } diff --git a/staging/src/k8s.io/client-go/openapi/groupversion.go b/staging/src/k8s.io/client-go/openapi/groupversion.go index 7c35833b483..1041c42ef9b 100644 --- a/staging/src/k8s.io/client-go/openapi/groupversion.go +++ b/staging/src/k8s.io/client-go/openapi/groupversion.go @@ -19,15 +19,16 @@ package openapi import ( "context" - openapi_v3 "github.com/google/gnostic/openapiv3" - "google.golang.org/protobuf/proto" "k8s.io/kube-openapi/pkg/handler3" ) const openAPIV3mimePb = "application/com.github.proto-openapi.spec.v3@v1.0+protobuf" +const jsonMime = "application/json" type GroupVersion interface { - Schema() (*openapi_v3.Document, error) + // Raw data types + SchemaJSON() ([]byte, error) + SchemaPB() ([]byte, error) } type groupversion struct { @@ -39,7 +40,7 @@ func newGroupVersion(client *client, item handler3.OpenAPIV3DiscoveryGroupVersio return &groupversion{client: client, item: item} } -func (g *groupversion) Schema() (*openapi_v3.Document, error) { +func (g *groupversion) SchemaPB() ([]byte, error) { data, err := g.client.restClient.Get(). RequestURI(g.item.ServerRelativeURL). SetHeader("Accept", openAPIV3mimePb). @@ -49,11 +50,18 @@ func (g *groupversion) Schema() (*openapi_v3.Document, error) { if err != nil { return nil, err } + return data, nil +} - document := &openapi_v3.Document{} - if err := proto.Unmarshal(data, document); err != nil { +func (g *groupversion) SchemaJSON() ([]byte, error) { + data, err := g.client.restClient.Get(). + RequestURI(g.item.ServerRelativeURL). + SetHeader("Accept", jsonMime). + Do(context.TODO()). + Raw() + + if err != nil { return nil, err } - - return document, nil + return data, nil }