Make versionconverter functions private

This commit is contained in:
Jefftree 2020-10-22 13:21:38 -07:00
parent 7182d84b10
commit 1f986cc69d
12 changed files with 58 additions and 65 deletions

View File

@ -673,7 +673,7 @@ func (r *crdHandler) getOrCreateServingInfoFor(uid types.UID, name string) (*crd
if openAPIModels != nil { if openAPIModels != nil {
typeConverter, err = fieldmanager.NewTypeConverter(openAPIModels, crd.Spec.PreserveUnknownFields) typeConverter, err = fieldmanager.NewTypeConverter(openAPIModels, crd.Spec.PreserveUnknownFields)
if err != nil { if err != nil {
typeConverter = nil return nil, err
} }
} }

View File

@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
package fieldmanager_test package fieldmanager
import ( import (
"bytes" "bytes"
@ -29,19 +29,18 @@ import (
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
"k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apimachinery/pkg/runtime/schema"
"k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager"
"sigs.k8s.io/structured-merge-diff/v4/fieldpath" "sigs.k8s.io/structured-merge-diff/v4/fieldpath"
) )
type fakeManager struct{} type fakeManager struct{}
var _ fieldmanager.Manager = &fakeManager{} var _ Manager = &fakeManager{}
func (*fakeManager) Update(_, newObj runtime.Object, managed fieldmanager.Managed, _ string) (runtime.Object, fieldmanager.Managed, error) { func (*fakeManager) Update(_, newObj runtime.Object, managed Managed, _ string) (runtime.Object, Managed, error) {
return newObj, managed, nil return newObj, managed, nil
} }
func (*fakeManager) Apply(_, _ runtime.Object, _ fieldmanager.Managed, _ string, _ bool) (runtime.Object, fieldmanager.Managed, error) { func (*fakeManager) Apply(_, _ runtime.Object, _ Managed, _ string, _ bool) (runtime.Object, Managed, error) {
panic("not implemented") panic("not implemented")
return nil, nil, nil return nil, nil, nil
} }
@ -49,8 +48,8 @@ func (*fakeManager) Apply(_, _ runtime.Object, _ fieldmanager.Managed, _ string,
func TestCapManagersManagerMergesEntries(t *testing.T) { func TestCapManagersManagerMergesEntries(t *testing.T) {
f := NewTestFieldManager(schema.FromAPIVersionAndKind("v1", "Pod"), f := NewTestFieldManager(schema.FromAPIVersionAndKind("v1", "Pod"),
false, false,
func(m fieldmanager.Manager) fieldmanager.Manager { func(m Manager) Manager {
return fieldmanager.NewCapManagersManager(m, 3) return NewCapManagersManager(m, 3)
}) })
podWithLabels := func(labels ...string) runtime.Object { podWithLabels := func(labels ...string) runtime.Object {
@ -115,8 +114,8 @@ func TestCapManagersManagerMergesEntries(t *testing.T) {
func TestCapUpdateManagers(t *testing.T) { func TestCapUpdateManagers(t *testing.T) {
f := NewTestFieldManager(schema.FromAPIVersionAndKind("v1", "Pod"), f := NewTestFieldManager(schema.FromAPIVersionAndKind("v1", "Pod"),
false, false,
func(m fieldmanager.Manager) fieldmanager.Manager { func(m Manager) Manager {
return fieldmanager.NewCapManagersManager(m, 3) return NewCapManagersManager(m, 3)
}) })
set := func(fields ...string) *metav1.FieldsV1 { set := func(fields ...string) *metav1.FieldsV1 {

View File

@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
package fieldmanager_test package fieldmanager
import ( import (
"errors" "errors"
@ -36,7 +36,6 @@ import (
"k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apimachinery/pkg/runtime/schema"
"k8s.io/apimachinery/pkg/runtime/serializer" "k8s.io/apimachinery/pkg/runtime/serializer"
yamlutil "k8s.io/apimachinery/pkg/util/yaml" yamlutil "k8s.io/apimachinery/pkg/util/yaml"
"k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager"
"k8s.io/kube-openapi/pkg/util/proto" "k8s.io/kube-openapi/pkg/util/proto"
prototesting "k8s.io/kube-openapi/pkg/util/proto/testing" prototesting "k8s.io/kube-openapi/pkg/util/proto/testing"
"sigs.k8s.io/structured-merge-diff/v4/fieldpath" "sigs.k8s.io/structured-merge-diff/v4/fieldpath"
@ -45,7 +44,7 @@ import (
"sigs.k8s.io/yaml" "sigs.k8s.io/yaml"
) )
var fakeSchema = prototesting.Fake{ var kubernetesSwaggerSchema = prototesting.Fake{
Path: filepath.Join( Path: filepath.Join(
strings.Repeat(".."+string(filepath.Separator), 8), strings.Repeat(".."+string(filepath.Separator), 8),
"api", "openapi-spec", "swagger.json"), "api", "openapi-spec", "swagger.json"),
@ -79,7 +78,7 @@ type fakeObjectDefaulter struct{}
func (d *fakeObjectDefaulter) Default(in runtime.Object) {} func (d *fakeObjectDefaulter) Default(in runtime.Object) {}
type TestFieldManager struct { type TestFieldManager struct {
fieldManager *fieldmanager.FieldManager fieldManager *FieldManager
emptyObj runtime.Object emptyObj runtime.Object
liveObj runtime.Object liveObj runtime.Object
} }
@ -92,13 +91,13 @@ func NewSubresourceTestFieldManager(gvk schema.GroupVersionKind) TestFieldManage
return NewTestFieldManager(gvk, true, nil) return NewTestFieldManager(gvk, true, nil)
} }
func NewTestFieldManager(gvk schema.GroupVersionKind, ignoreManagedFieldsFromRequestObject bool, chainFieldManager func(fieldmanager.Manager) fieldmanager.Manager) TestFieldManager { func NewTestFieldManager(gvk schema.GroupVersionKind, ignoreManagedFieldsFromRequestObject bool, chainFieldManager func(Manager) Manager) TestFieldManager {
m := NewFakeOpenAPIModels() m := NewFakeOpenAPIModels()
typeConverter := NewFakeTypeConverter(m) typeConverter := NewFakeTypeConverter(m)
converter := fieldmanager.NewVersionConverter(typeConverter, &fakeObjectConvertor{}, gvk.GroupVersion()) converter := newVersionConverter(typeConverter, &fakeObjectConvertor{}, gvk.GroupVersion())
apiVersion := fieldpath.APIVersion(gvk.GroupVersion().String()) apiVersion := fieldpath.APIVersion(gvk.GroupVersion().String())
objectConverter := &fakeObjectConvertor{converter, apiVersion} objectConverter := &fakeObjectConvertor{converter, apiVersion}
f, err := fieldmanager.NewStructuredMergeManager( f, err := NewStructuredMergeManager(
typeConverter, typeConverter,
objectConverter, objectConverter,
&fakeObjectDefaulter{}, &fakeObjectDefaulter{},
@ -111,24 +110,24 @@ func NewTestFieldManager(gvk schema.GroupVersionKind, ignoreManagedFieldsFromReq
live := &unstructured.Unstructured{} live := &unstructured.Unstructured{}
live.SetKind(gvk.Kind) live.SetKind(gvk.Kind)
live.SetAPIVersion(gvk.GroupVersion().String()) live.SetAPIVersion(gvk.GroupVersion().String())
f = fieldmanager.NewStripMetaManager(f) f = NewStripMetaManager(f)
f = fieldmanager.NewManagedFieldsUpdater(f) f = NewManagedFieldsUpdater(f)
f = fieldmanager.NewBuildManagerInfoManager(f, gvk.GroupVersion()) f = NewBuildManagerInfoManager(f, gvk.GroupVersion())
f = fieldmanager.NewProbabilisticSkipNonAppliedManager(f, &fakeObjectCreater{gvk: gvk}, gvk, fieldmanager.DefaultTrackOnCreateProbability) f = NewProbabilisticSkipNonAppliedManager(f, &fakeObjectCreater{gvk: gvk}, gvk, DefaultTrackOnCreateProbability)
f = fieldmanager.NewLastAppliedManager(f, typeConverter, objectConverter, gvk.GroupVersion()) f = NewLastAppliedManager(f, typeConverter, objectConverter, gvk.GroupVersion())
f = fieldmanager.NewLastAppliedUpdater(f) f = NewLastAppliedUpdater(f)
if chainFieldManager != nil { if chainFieldManager != nil {
f = chainFieldManager(f) f = chainFieldManager(f)
} }
return TestFieldManager{ return TestFieldManager{
fieldManager: fieldmanager.NewFieldManager(f, ignoreManagedFieldsFromRequestObject), fieldManager: NewFieldManager(f, ignoreManagedFieldsFromRequestObject),
emptyObj: live, emptyObj: live,
liveObj: live.DeepCopyObject(), liveObj: live.DeepCopyObject(),
} }
} }
func NewFakeTypeConverter(m proto.Models) fieldmanager.TypeConverter { func NewFakeTypeConverter(m proto.Models) TypeConverter {
tc, err := fieldmanager.NewTypeConverter(m, false) tc, err := NewTypeConverter(m, false)
if err != nil { if err != nil {
panic(fmt.Sprintf("Failed to build TypeConverter: %v", err)) panic(fmt.Sprintf("Failed to build TypeConverter: %v", err))
} }
@ -136,7 +135,7 @@ func NewFakeTypeConverter(m proto.Models) fieldmanager.TypeConverter {
} }
func NewFakeOpenAPIModels() proto.Models { func NewFakeOpenAPIModels() proto.Models {
d, err := fakeSchema.OpenAPISchema() d, err := kubernetesSwaggerSchema.OpenAPISchema()
if err != nil { if err != nil {
panic(err) panic(err)
} }
@ -1206,20 +1205,6 @@ func setLastAppliedFromEncoded(obj runtime.Object, lastApplied []byte) error {
return setLastApplied(obj, lastAppliedJSON) return setLastApplied(obj, lastAppliedJSON)
} }
func setLastApplied(obj runtime.Object, lastApplied string) error {
accessor := meta.NewAccessor()
annotations, err := accessor.Annotations(obj)
if err != nil {
return fmt.Errorf("failed to access annotations: %v", err)
}
if annotations == nil {
annotations = map[string]string{}
}
annotations[corev1.LastAppliedConfigAnnotation] = lastApplied
accessor.SetAnnotations(obj, annotations)
return nil
}
func getLastApplied(obj runtime.Object) (string, error) { func getLastApplied(obj runtime.Object) (string, error) {
accessor := meta.NewAccessor() accessor := meta.NewAccessor()
annotations, err := accessor.Annotations(obj) annotations, err := accessor.Annotations(obj)

View File

@ -30,11 +30,14 @@ import (
// definition's "extensions" map. // definition's "extensions" map.
const groupVersionKindExtensionKey = "x-kubernetes-group-version-kind" const groupVersionKindExtensionKey = "x-kubernetes-group-version-kind"
// GvkParser contains a Parser that allows introspecting the schema.
type GvkParser struct { type GvkParser struct {
gvks map[schema.GroupVersionKind]string gvks map[schema.GroupVersionKind]string
parser typed.Parser parser typed.Parser
} }
// Type returns a helper which can produce objects of the given type. Any
// errors are deferred until a further function is called.
func (p *GvkParser) Type(gvk schema.GroupVersionKind) *typed.ParseableType { func (p *GvkParser) Type(gvk schema.GroupVersionKind) *typed.ParseableType {
typeName, ok := p.gvks[gvk] typeName, ok := p.gvks[gvk]
if !ok { if !ok {
@ -44,6 +47,9 @@ func (p *GvkParser) Type(gvk schema.GroupVersionKind) *typed.ParseableType {
return &t return &t
} }
// NewGVKParser builds a GVKParser from a proto.Models. This
// will automatically find the proper version of the object, and the
// corresponding schema information.
func NewGVKParser(models proto.Models, preserveUnknownFields bool) (*GvkParser, error) { func NewGVKParser(models proto.Models, preserveUnknownFields bool) (*GvkParser, error) {
typeSchema, err := schemaconv.ToSchemaWithPreserveUnknownFields(models, preserveUnknownFields) typeSchema, err := schemaconv.ToSchemaWithPreserveUnknownFields(models, preserveUnknownFields)
if err != nil { if err != nil {

View File

@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
package fieldmanager_test package fieldmanager
import ( import (
"fmt" "fmt"

View File

@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
package fieldmanager_test package fieldmanager
import ( import (
"strings" "strings"
@ -22,15 +22,14 @@ import (
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
"k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apimachinery/pkg/runtime/schema"
"k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager"
"sigs.k8s.io/yaml" "sigs.k8s.io/yaml"
) )
func TestLastAppliedUpdater(t *testing.T) { func TestLastAppliedUpdater(t *testing.T) {
f := NewTestFieldManager(schema.FromAPIVersionAndKind("apps/v1", "Deployment"), f := NewTestFieldManager(schema.FromAPIVersionAndKind("apps/v1", "Deployment"),
false, false,
func(m fieldmanager.Manager) fieldmanager.Manager { func(m Manager) Manager {
return fieldmanager.NewLastAppliedUpdater(m) return NewLastAppliedUpdater(m)
}) })
originalLastApplied := `nonempty` originalLastApplied := `nonempty`

View File

@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
package fieldmanager_test package fieldmanager
import ( import (
"reflect" "reflect"

View File

@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
package fieldmanager_test package fieldmanager
import ( import (
"strings" "strings"
@ -25,7 +25,6 @@ import (
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
"k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apimachinery/pkg/runtime/schema"
"k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager"
"sigs.k8s.io/yaml" "sigs.k8s.io/yaml"
) )
@ -43,8 +42,8 @@ func (f *fakeObjectCreater) New(_ schema.GroupVersionKind) (runtime.Object, erro
} }
func TestNoUpdateBeforeFirstApply(t *testing.T) { func TestNoUpdateBeforeFirstApply(t *testing.T) {
f := NewTestFieldManager(schema.FromAPIVersionAndKind("v1", "Pod"), false, func(m fieldmanager.Manager) fieldmanager.Manager { f := NewTestFieldManager(schema.FromAPIVersionAndKind("v1", "Pod"), false, func(m Manager) Manager {
return fieldmanager.NewSkipNonAppliedManager( return NewSkipNonAppliedManager(
m, m,
&fakeObjectCreater{gvk: schema.GroupVersionKind{Version: "v1", Kind: "Pod"}}, &fakeObjectCreater{gvk: schema.GroupVersionKind{Version: "v1", Kind: "Pod"}},
schema.GroupVersionKind{}, schema.GroupVersionKind{},
@ -83,8 +82,8 @@ func TestNoUpdateBeforeFirstApply(t *testing.T) {
} }
func TestUpdateBeforeFirstApply(t *testing.T) { func TestUpdateBeforeFirstApply(t *testing.T) {
f := NewTestFieldManager(schema.FromAPIVersionAndKind("v1", "Pod"), false, func(m fieldmanager.Manager) fieldmanager.Manager { f := NewTestFieldManager(schema.FromAPIVersionAndKind("v1", "Pod"), false, func(m Manager) Manager {
return fieldmanager.NewSkipNonAppliedManager( return NewSkipNonAppliedManager(
m, m,
&fakeObjectCreater{gvk: schema.GroupVersionKind{Version: "v1", Kind: "Pod"}}, &fakeObjectCreater{gvk: schema.GroupVersionKind{Version: "v1", Kind: "Pod"}},
schema.GroupVersionKind{}, schema.GroupVersionKind{},

View File

@ -49,7 +49,7 @@ func NewStructuredMergeManager(typeConverter TypeConverter, objectConverter runt
groupVersion: gv, groupVersion: gv,
hubVersion: hub, hubVersion: hub,
updater: merge.Updater{ updater: merge.Updater{
Converter: NewVersionConverter(typeConverter, objectConverter, hub), // This is the converter provided to SMD from k8s Converter: newVersionConverter(typeConverter, objectConverter, hub), // This is the converter provided to SMD from k8s
}, },
}, nil }, nil
} }
@ -65,7 +65,7 @@ func NewCRDStructuredMergeManager(typeConverter TypeConverter, objectConverter r
groupVersion: gv, groupVersion: gv,
hubVersion: hub, hubVersion: hub,
updater: merge.Updater{ updater: merge.Updater{
Converter: NewCRDVersionConverter(typeConverter, objectConverter, hub), Converter: newCRDVersionConverter(typeConverter, objectConverter, hub),
}, },
}, nil }, nil
} }

View File

@ -31,12 +31,12 @@ import (
prototesting "k8s.io/kube-openapi/pkg/util/proto/testing" prototesting "k8s.io/kube-openapi/pkg/util/proto/testing"
) )
var fakeSchema2 = prototesting.Fake{ var testSchema = prototesting.Fake{
Path: filepath.Join("testdata", "swagger.json"), Path: filepath.Join("testdata", "swagger.json"),
} }
func TestTypeConverter(t *testing.T) { func TestTypeConverter(t *testing.T) {
d, err := fakeSchema2.OpenAPISchema() d, err := testSchema.OpenAPISchema()
if err != nil { if err != nil {
t.Fatalf("Failed to parse OpenAPI schema: %v", err) t.Fatalf("Failed to parse OpenAPI schema: %v", err)
} }
@ -177,7 +177,7 @@ spec:
b.Fatalf("Failed to parse yaml object: %v", err) b.Fatalf("Failed to parse yaml object: %v", err)
} }
d, err := fakeSchema2.OpenAPISchema() d, err := testSchema.OpenAPISchema()
if err != nil { if err != nil {
b.Fatalf("Failed to parse OpenAPI schema: %v", err) b.Fatalf("Failed to parse OpenAPI schema: %v", err)
} }

View File

@ -35,7 +35,7 @@ type versionConverter struct {
var _ merge.Converter = &versionConverter{} var _ merge.Converter = &versionConverter{}
// NewVersionConverter builds a VersionConverter from a TypeConverter and an ObjectConvertor. // NewVersionConverter builds a VersionConverter from a TypeConverter and an ObjectConvertor.
func NewVersionConverter(t TypeConverter, o runtime.ObjectConvertor, h schema.GroupVersion) merge.Converter { func newVersionConverter(t TypeConverter, o runtime.ObjectConvertor, h schema.GroupVersion) merge.Converter {
return &versionConverter{ return &versionConverter{
typeConverter: t, typeConverter: t,
objectConvertor: o, objectConvertor: o,
@ -49,7 +49,7 @@ func NewVersionConverter(t TypeConverter, o runtime.ObjectConvertor, h schema.Gr
} }
// NewCRDVersionConverter builds a VersionConverter for CRDs from a TypeConverter and an ObjectConvertor. // NewCRDVersionConverter builds a VersionConverter for CRDs from a TypeConverter and an ObjectConvertor.
func NewCRDVersionConverter(t TypeConverter, o runtime.ObjectConvertor, h schema.GroupVersion) merge.Converter { func newCRDVersionConverter(t TypeConverter, o runtime.ObjectConvertor, h schema.GroupVersion) merge.Converter {
return &versionConverter{ return &versionConverter{
typeConverter: t, typeConverter: t,
objectConvertor: o, objectConvertor: o,

View File

@ -14,24 +14,29 @@ See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
package fieldmanager_test package fieldmanager
import ( import (
"fmt" "fmt"
"path/filepath"
"reflect" "reflect"
"testing" "testing"
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
"k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apimachinery/pkg/runtime/schema"
"k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager"
"k8s.io/kube-openapi/pkg/util/proto" "k8s.io/kube-openapi/pkg/util/proto"
prototesting "k8s.io/kube-openapi/pkg/util/proto/testing"
"sigs.k8s.io/structured-merge-diff/v4/fieldpath" "sigs.k8s.io/structured-merge-diff/v4/fieldpath"
) )
var testSchema = prototesting.Fake{
Path: filepath.Join("testdata", "swagger.json"),
}
// TestVersionConverter tests the version converter // TestVersionConverter tests the version converter
func TestVersionConverter(t *testing.T) { func TestVersionConverter(t *testing.T) {
d, err := fakeSchema2.OpenAPISchema() d, err := testSchema.OpenAPISchema()
if err != nil { if err != nil {
t.Fatalf("Failed to parse OpenAPI schema: %v", err) t.Fatalf("Failed to parse OpenAPI schema: %v", err)
} }
@ -39,7 +44,7 @@ func TestVersionConverter(t *testing.T) {
if err != nil { if err != nil {
t.Fatalf("Failed to build OpenAPI models: %v", err) t.Fatalf("Failed to build OpenAPI models: %v", err)
} }
tc, err := fieldmanager.NewTypeConverter(m, false) tc, err := NewTypeConverter(m, false)
if err != nil { if err != nil {
t.Fatalf("Failed to build TypeConverter: %v", err) t.Fatalf("Failed to build TypeConverter: %v", err)
} }
@ -47,7 +52,7 @@ func TestVersionConverter(t *testing.T) {
gvkForVersion("v1beta1"): objForGroupVersion("apps/v1beta1"), gvkForVersion("v1beta1"): objForGroupVersion("apps/v1beta1"),
gvkForVersion("v1"): objForGroupVersion("apps/v1"), gvkForVersion("v1"): objForGroupVersion("apps/v1"),
} }
vc := fieldmanager.NewVersionConverter(tc, oc, schema.GroupVersion{Group: "apps", Version: runtime.APIVersionInternal}) vc := newVersionConverter(tc, oc, schema.GroupVersion{Group: "apps", Version: runtime.APIVersionInternal})
input, err := tc.ObjectToTyped(objForGroupVersion("apps/v1beta1")) input, err := tc.ObjectToTyped(objForGroupVersion("apps/v1beta1"))
if err != nil { if err != nil {