diff --git a/staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/customresource_handler.go b/staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/customresource_handler.go index e43a96fd6a3..749ad7552f2 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/customresource_handler.go +++ b/staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/customresource_handler.go @@ -673,7 +673,7 @@ func (r *crdHandler) getOrCreateServingInfoFor(uid types.UID, name string) (*crd if openAPIModels != nil { typeConverter, err = fieldmanager.NewTypeConverter(openAPIModels, crd.Spec.PreserveUnknownFields) if err != nil { - typeConverter = nil + return nil, err } } diff --git a/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager/capmanagers_test.go b/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager/capmanagers_test.go index aaf2c96a067..3e79450551a 100644 --- a/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager/capmanagers_test.go +++ b/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager/capmanagers_test.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package fieldmanager_test +package fieldmanager import ( "bytes" @@ -29,19 +29,18 @@ import ( "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" - "k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager" "sigs.k8s.io/structured-merge-diff/v4/fieldpath" ) 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 } -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") return nil, nil, nil } @@ -49,8 +48,8 @@ func (*fakeManager) Apply(_, _ runtime.Object, _ fieldmanager.Managed, _ string, func TestCapManagersManagerMergesEntries(t *testing.T) { f := NewTestFieldManager(schema.FromAPIVersionAndKind("v1", "Pod"), false, - func(m fieldmanager.Manager) fieldmanager.Manager { - return fieldmanager.NewCapManagersManager(m, 3) + func(m Manager) Manager { + return NewCapManagersManager(m, 3) }) podWithLabels := func(labels ...string) runtime.Object { @@ -115,8 +114,8 @@ func TestCapManagersManagerMergesEntries(t *testing.T) { func TestCapUpdateManagers(t *testing.T) { f := NewTestFieldManager(schema.FromAPIVersionAndKind("v1", "Pod"), false, - func(m fieldmanager.Manager) fieldmanager.Manager { - return fieldmanager.NewCapManagersManager(m, 3) + func(m Manager) Manager { + return NewCapManagersManager(m, 3) }) set := func(fields ...string) *metav1.FieldsV1 { diff --git a/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager/fieldmanager_test.go b/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager/fieldmanager_test.go index 971dbe477f8..7dc59285d33 100644 --- a/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager/fieldmanager_test.go +++ b/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager/fieldmanager_test.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package fieldmanager_test +package fieldmanager import ( "errors" @@ -36,7 +36,6 @@ import ( "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apimachinery/pkg/runtime/serializer" yamlutil "k8s.io/apimachinery/pkg/util/yaml" - "k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager" "k8s.io/kube-openapi/pkg/util/proto" prototesting "k8s.io/kube-openapi/pkg/util/proto/testing" "sigs.k8s.io/structured-merge-diff/v4/fieldpath" @@ -45,7 +44,7 @@ import ( "sigs.k8s.io/yaml" ) -var fakeSchema = prototesting.Fake{ +var kubernetesSwaggerSchema = prototesting.Fake{ Path: filepath.Join( strings.Repeat(".."+string(filepath.Separator), 8), "api", "openapi-spec", "swagger.json"), @@ -79,7 +78,7 @@ type fakeObjectDefaulter struct{} func (d *fakeObjectDefaulter) Default(in runtime.Object) {} type TestFieldManager struct { - fieldManager *fieldmanager.FieldManager + fieldManager *FieldManager emptyObj runtime.Object liveObj runtime.Object } @@ -92,13 +91,13 @@ func NewSubresourceTestFieldManager(gvk schema.GroupVersionKind) TestFieldManage 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() typeConverter := NewFakeTypeConverter(m) - converter := fieldmanager.NewVersionConverter(typeConverter, &fakeObjectConvertor{}, gvk.GroupVersion()) + converter := newVersionConverter(typeConverter, &fakeObjectConvertor{}, gvk.GroupVersion()) apiVersion := fieldpath.APIVersion(gvk.GroupVersion().String()) objectConverter := &fakeObjectConvertor{converter, apiVersion} - f, err := fieldmanager.NewStructuredMergeManager( + f, err := NewStructuredMergeManager( typeConverter, objectConverter, &fakeObjectDefaulter{}, @@ -111,24 +110,24 @@ func NewTestFieldManager(gvk schema.GroupVersionKind, ignoreManagedFieldsFromReq live := &unstructured.Unstructured{} live.SetKind(gvk.Kind) live.SetAPIVersion(gvk.GroupVersion().String()) - f = fieldmanager.NewStripMetaManager(f) - f = fieldmanager.NewManagedFieldsUpdater(f) - f = fieldmanager.NewBuildManagerInfoManager(f, gvk.GroupVersion()) - f = fieldmanager.NewProbabilisticSkipNonAppliedManager(f, &fakeObjectCreater{gvk: gvk}, gvk, fieldmanager.DefaultTrackOnCreateProbability) - f = fieldmanager.NewLastAppliedManager(f, typeConverter, objectConverter, gvk.GroupVersion()) - f = fieldmanager.NewLastAppliedUpdater(f) + f = NewStripMetaManager(f) + f = NewManagedFieldsUpdater(f) + f = NewBuildManagerInfoManager(f, gvk.GroupVersion()) + f = NewProbabilisticSkipNonAppliedManager(f, &fakeObjectCreater{gvk: gvk}, gvk, DefaultTrackOnCreateProbability) + f = NewLastAppliedManager(f, typeConverter, objectConverter, gvk.GroupVersion()) + f = NewLastAppliedUpdater(f) if chainFieldManager != nil { f = chainFieldManager(f) } return TestFieldManager{ - fieldManager: fieldmanager.NewFieldManager(f, ignoreManagedFieldsFromRequestObject), + fieldManager: NewFieldManager(f, ignoreManagedFieldsFromRequestObject), emptyObj: live, liveObj: live.DeepCopyObject(), } } -func NewFakeTypeConverter(m proto.Models) fieldmanager.TypeConverter { - tc, err := fieldmanager.NewTypeConverter(m, false) +func NewFakeTypeConverter(m proto.Models) TypeConverter { + tc, err := NewTypeConverter(m, false) if err != nil { panic(fmt.Sprintf("Failed to build TypeConverter: %v", err)) } @@ -136,7 +135,7 @@ func NewFakeTypeConverter(m proto.Models) fieldmanager.TypeConverter { } func NewFakeOpenAPIModels() proto.Models { - d, err := fakeSchema.OpenAPISchema() + d, err := kubernetesSwaggerSchema.OpenAPISchema() if err != nil { panic(err) } @@ -1206,20 +1205,6 @@ func setLastAppliedFromEncoded(obj runtime.Object, lastApplied []byte) error { 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) { accessor := meta.NewAccessor() annotations, err := accessor.Annotations(obj) diff --git a/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager/internal/gvkparser.go b/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager/internal/gvkparser.go index 765d722ba56..f8abcaf04ef 100644 --- a/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager/internal/gvkparser.go +++ b/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager/internal/gvkparser.go @@ -30,11 +30,14 @@ import ( // definition's "extensions" map. const groupVersionKindExtensionKey = "x-kubernetes-group-version-kind" +// GvkParser contains a Parser that allows introspecting the schema. type GvkParser struct { gvks map[schema.GroupVersionKind]string 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 { typeName, ok := p.gvks[gvk] if !ok { @@ -44,6 +47,9 @@ func (p *GvkParser) Type(gvk schema.GroupVersionKind) *typed.ParseableType { 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) { typeSchema, err := schemaconv.ToSchemaWithPreserveUnknownFields(models, preserveUnknownFields) if err != nil { diff --git a/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager/lastappliedmanager_test.go b/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager/lastappliedmanager_test.go index 63adce6831b..f6a2872d748 100644 --- a/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager/lastappliedmanager_test.go +++ b/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager/lastappliedmanager_test.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package fieldmanager_test +package fieldmanager import ( "fmt" diff --git a/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager/lastappliedupdater_test.go b/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager/lastappliedupdater_test.go index 7c3d2362ddf..14e9aa167da 100644 --- a/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager/lastappliedupdater_test.go +++ b/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager/lastappliedupdater_test.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package fieldmanager_test +package fieldmanager import ( "strings" @@ -22,15 +22,14 @@ import ( "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "k8s.io/apimachinery/pkg/runtime/schema" - "k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager" "sigs.k8s.io/yaml" ) func TestLastAppliedUpdater(t *testing.T) { f := NewTestFieldManager(schema.FromAPIVersionAndKind("apps/v1", "Deployment"), false, - func(m fieldmanager.Manager) fieldmanager.Manager { - return fieldmanager.NewLastAppliedUpdater(m) + func(m Manager) Manager { + return NewLastAppliedUpdater(m) }) originalLastApplied := `nonempty` diff --git a/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager/managedfieldsupdater_test.go b/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager/managedfieldsupdater_test.go index f961989b6ab..2e1ad3d0b11 100644 --- a/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager/managedfieldsupdater_test.go +++ b/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager/managedfieldsupdater_test.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package fieldmanager_test +package fieldmanager import ( "reflect" diff --git a/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager/skipnonapplied_test.go b/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager/skipnonapplied_test.go index 8c7ac7019cd..c9e2dc02b13 100644 --- a/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager/skipnonapplied_test.go +++ b/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager/skipnonapplied_test.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package fieldmanager_test +package fieldmanager import ( "strings" @@ -25,7 +25,6 @@ import ( "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" - "k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager" "sigs.k8s.io/yaml" ) @@ -43,8 +42,8 @@ func (f *fakeObjectCreater) New(_ schema.GroupVersionKind) (runtime.Object, erro } func TestNoUpdateBeforeFirstApply(t *testing.T) { - f := NewTestFieldManager(schema.FromAPIVersionAndKind("v1", "Pod"), false, func(m fieldmanager.Manager) fieldmanager.Manager { - return fieldmanager.NewSkipNonAppliedManager( + f := NewTestFieldManager(schema.FromAPIVersionAndKind("v1", "Pod"), false, func(m Manager) Manager { + return NewSkipNonAppliedManager( m, &fakeObjectCreater{gvk: schema.GroupVersionKind{Version: "v1", Kind: "Pod"}}, schema.GroupVersionKind{}, @@ -83,8 +82,8 @@ func TestNoUpdateBeforeFirstApply(t *testing.T) { } func TestUpdateBeforeFirstApply(t *testing.T) { - f := NewTestFieldManager(schema.FromAPIVersionAndKind("v1", "Pod"), false, func(m fieldmanager.Manager) fieldmanager.Manager { - return fieldmanager.NewSkipNonAppliedManager( + f := NewTestFieldManager(schema.FromAPIVersionAndKind("v1", "Pod"), false, func(m Manager) Manager { + return NewSkipNonAppliedManager( m, &fakeObjectCreater{gvk: schema.GroupVersionKind{Version: "v1", Kind: "Pod"}}, schema.GroupVersionKind{}, diff --git a/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager/structuredmerge.go b/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager/structuredmerge.go index 18157370713..216a39cf7a5 100644 --- a/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager/structuredmerge.go +++ b/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager/structuredmerge.go @@ -49,7 +49,7 @@ func NewStructuredMergeManager(typeConverter TypeConverter, objectConverter runt groupVersion: gv, hubVersion: hub, 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 } @@ -65,7 +65,7 @@ func NewCRDStructuredMergeManager(typeConverter TypeConverter, objectConverter r groupVersion: gv, hubVersion: hub, updater: merge.Updater{ - Converter: NewCRDVersionConverter(typeConverter, objectConverter, hub), + Converter: newCRDVersionConverter(typeConverter, objectConverter, hub), }, }, nil } diff --git a/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager/typeconverter_test.go b/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager/typeconverter_test.go index f212649a490..df7312b7306 100644 --- a/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager/typeconverter_test.go +++ b/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager/typeconverter_test.go @@ -31,12 +31,12 @@ import ( prototesting "k8s.io/kube-openapi/pkg/util/proto/testing" ) -var fakeSchema2 = prototesting.Fake{ +var testSchema = prototesting.Fake{ Path: filepath.Join("testdata", "swagger.json"), } func TestTypeConverter(t *testing.T) { - d, err := fakeSchema2.OpenAPISchema() + d, err := testSchema.OpenAPISchema() if err != nil { t.Fatalf("Failed to parse OpenAPI schema: %v", err) } @@ -177,7 +177,7 @@ spec: b.Fatalf("Failed to parse yaml object: %v", err) } - d, err := fakeSchema2.OpenAPISchema() + d, err := testSchema.OpenAPISchema() if err != nil { b.Fatalf("Failed to parse OpenAPI schema: %v", err) } diff --git a/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager/versionconverter.go b/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager/versionconverter.go index 73b86c6aa1c..477e92f796e 100644 --- a/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager/versionconverter.go +++ b/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager/versionconverter.go @@ -35,7 +35,7 @@ type versionConverter struct { var _ merge.Converter = &versionConverter{} // 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{ typeConverter: t, 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. -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{ typeConverter: t, objectConvertor: o, diff --git a/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager/versionconverter_test.go b/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager/versionconverter_test.go index 4257a33f0db..c6ca32007cf 100644 --- a/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager/versionconverter_test.go +++ b/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager/versionconverter_test.go @@ -14,24 +14,29 @@ See the License for the specific language governing permissions and limitations under the License. */ -package fieldmanager_test +package fieldmanager import ( "fmt" + "path/filepath" "reflect" "testing" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" - "k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager" "k8s.io/kube-openapi/pkg/util/proto" + prototesting "k8s.io/kube-openapi/pkg/util/proto/testing" "sigs.k8s.io/structured-merge-diff/v4/fieldpath" ) +var testSchema = prototesting.Fake{ + Path: filepath.Join("testdata", "swagger.json"), +} + // TestVersionConverter tests the version converter func TestVersionConverter(t *testing.T) { - d, err := fakeSchema2.OpenAPISchema() + d, err := testSchema.OpenAPISchema() if err != nil { t.Fatalf("Failed to parse OpenAPI schema: %v", err) } @@ -39,7 +44,7 @@ func TestVersionConverter(t *testing.T) { if err != nil { t.Fatalf("Failed to build OpenAPI models: %v", err) } - tc, err := fieldmanager.NewTypeConverter(m, false) + tc, err := NewTypeConverter(m, false) if err != nil { t.Fatalf("Failed to build TypeConverter: %v", err) } @@ -47,7 +52,7 @@ func TestVersionConverter(t *testing.T) { gvkForVersion("v1beta1"): objForGroupVersion("apps/v1beta1"), 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")) if err != nil {