remove objectmetafor

Kubernetes-commit: 04460c8750b9a47672aa708251de0e703cfb7266
This commit is contained in:
deads2k 2017-04-10 11:20:51 -04:00 committed by Kubernetes Publisher
parent a35798188a
commit 5e858945af
9 changed files with 181 additions and 176 deletions

View File

@ -331,17 +331,17 @@ func (e *Store) shouldDeleteDuringUpdate(ctx genericapirequest.Context, key stri
if !e.EnableGarbageCollection { if !e.EnableGarbageCollection {
return false return false
} }
newMeta, err := metav1.ObjectMetaFor(obj) newMeta, err := meta.Accessor(obj)
if err != nil { if err != nil {
utilruntime.HandleError(err) utilruntime.HandleError(err)
return false return false
} }
oldMeta, err := metav1.ObjectMetaFor(existing) oldMeta, err := meta.Accessor(existing)
if err != nil { if err != nil {
utilruntime.HandleError(err) utilruntime.HandleError(err)
return false return false
} }
return len(newMeta.Finalizers) == 0 && oldMeta.DeletionGracePeriodSeconds != nil && *oldMeta.DeletionGracePeriodSeconds == 0 return len(newMeta.GetFinalizers()) == 0 && oldMeta.GetDeletionGracePeriodSeconds() != nil && *oldMeta.GetDeletionGracePeriodSeconds() == 0
} }
// deleteForEmptyFinalizers handles deleting an object once its finalizer list // deleteForEmptyFinalizers handles deleting an object once its finalizer list
@ -652,7 +652,7 @@ func shouldUpdateFinalizers(e *Store, accessor metav1.Object, options *metav1.De
// DeletionTimestamp to "now". Finalizers are watching for such updates and will // DeletionTimestamp to "now". Finalizers are watching for such updates and will
// finalize the object if their IDs are present in the object's Finalizers list. // finalize the object if their IDs are present in the object's Finalizers list.
func markAsDeleting(obj runtime.Object) (err error) { func markAsDeleting(obj runtime.Object) (err error) {
objectMeta, kerr := metav1.ObjectMetaFor(obj) objectMeta, kerr := meta.Accessor(obj)
if kerr != nil { if kerr != nil {
return kerr return kerr
} }
@ -660,12 +660,12 @@ func markAsDeleting(obj runtime.Object) (err error) {
// This handles Generation bump for resources that don't support graceful // This handles Generation bump for resources that don't support graceful
// deletion. For resources that support graceful deletion is handle in // deletion. For resources that support graceful deletion is handle in
// pkg/api/rest/delete.go // pkg/api/rest/delete.go
if objectMeta.DeletionTimestamp == nil && objectMeta.Generation > 0 { if objectMeta.GetDeletionTimestamp() == nil && objectMeta.GetGeneration() > 0 {
objectMeta.Generation++ objectMeta.SetGeneration(objectMeta.GetGeneration() + 1)
} }
objectMeta.DeletionTimestamp = &now objectMeta.SetDeletionTimestamp(&now)
var zero int64 = 0 var zero int64 = 0
objectMeta.DeletionGracePeriodSeconds = &zero objectMeta.SetDeletionGracePeriodSeconds(&zero)
return nil return nil
} }

View File

@ -18,6 +18,7 @@ package rest
import ( import (
"k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/api/errors"
"k8s.io/apimachinery/pkg/api/meta"
genericvalidation "k8s.io/apimachinery/pkg/api/validation" genericvalidation "k8s.io/apimachinery/pkg/api/validation"
"k8s.io/apimachinery/pkg/api/validation/path" "k8s.io/apimachinery/pkg/api/validation/path"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@ -71,28 +72,28 @@ func BeforeCreate(strategy RESTCreateStrategy, ctx genericapirequest.Context, ob
return errors.NewBadRequest("the namespace of the provided object does not match the namespace sent on the request") return errors.NewBadRequest("the namespace of the provided object does not match the namespace sent on the request")
} }
} else { } else {
objectMeta.Namespace = metav1.NamespaceNone objectMeta.SetNamespace(metav1.NamespaceNone)
} }
objectMeta.DeletionTimestamp = nil objectMeta.SetDeletionTimestamp(nil)
objectMeta.DeletionGracePeriodSeconds = nil objectMeta.SetDeletionGracePeriodSeconds(nil)
strategy.PrepareForCreate(ctx, obj) strategy.PrepareForCreate(ctx, obj)
FillObjectMetaSystemFields(ctx, objectMeta) FillObjectMetaSystemFields(ctx, objectMeta)
if len(objectMeta.GenerateName) > 0 && len(objectMeta.Name) == 0 { if len(objectMeta.GetGenerateName()) > 0 && len(objectMeta.GetName()) == 0 {
objectMeta.Name = strategy.GenerateName(objectMeta.GenerateName) objectMeta.SetName(strategy.GenerateName(objectMeta.GetGenerateName()))
} }
// ClusterName is ignored and should not be saved // ClusterName is ignored and should not be saved
objectMeta.ClusterName = "" objectMeta.SetClusterName("")
if errs := strategy.Validate(ctx, obj); len(errs) > 0 { if errs := strategy.Validate(ctx, obj); len(errs) > 0 {
return errors.NewInvalid(kind.GroupKind(), objectMeta.Name, errs) return errors.NewInvalid(kind.GroupKind(), objectMeta.GetName(), errs)
} }
// Custom validation (including name validation) passed // Custom validation (including name validation) passed
// Now run common validation on object meta // Now run common validation on object meta
// Do this *after* custom validation so that specific error messages are shown whenever possible // Do this *after* custom validation so that specific error messages are shown whenever possible
if errs := genericvalidation.ValidateObjectMeta(objectMeta, strategy.NamespaceScoped(), path.ValidatePathSegmentName, field.NewPath("metadata")); len(errs) > 0 { if errs := genericvalidation.ValidateObjectMetaAccessor(objectMeta, strategy.NamespaceScoped(), path.ValidatePathSegmentName, field.NewPath("metadata")); len(errs) > 0 {
return errors.NewInvalid(kind.GroupKind(), objectMeta.Name, errs) return errors.NewInvalid(kind.GroupKind(), objectMeta.GetName(), errs)
} }
strategy.Canonicalize(obj) strategy.Canonicalize(obj)
@ -112,7 +113,7 @@ func CheckGeneratedNameError(strategy RESTCreateStrategy, err error, obj runtime
return kerr return kerr
} }
if len(objectMeta.GenerateName) == 0 { if len(objectMeta.GetGenerateName()) == 0 {
return err return err
} }
@ -120,8 +121,8 @@ func CheckGeneratedNameError(strategy RESTCreateStrategy, err error, obj runtime
} }
// objectMetaAndKind retrieves kind and ObjectMeta from a runtime object, or returns an error. // objectMetaAndKind retrieves kind and ObjectMeta from a runtime object, or returns an error.
func objectMetaAndKind(typer runtime.ObjectTyper, obj runtime.Object) (*metav1.ObjectMeta, schema.GroupVersionKind, error) { func objectMetaAndKind(typer runtime.ObjectTyper, obj runtime.Object) (metav1.Object, schema.GroupVersionKind, error) {
objectMeta, err := metav1.ObjectMetaFor(obj) objectMeta, err := meta.Accessor(obj)
if err != nil { if err != nil {
return nil, schema.GroupVersionKind{}, errors.NewInternalError(err) return nil, schema.GroupVersionKind{}, errors.NewInternalError(err)
} }

View File

@ -71,8 +71,8 @@ func BeforeDelete(strategy RESTDeleteStrategy, ctx genericapirequest.Context, ob
return false, false, errors.NewInvalid(schema.GroupKind{}, "", errs) return false, false, errors.NewInvalid(schema.GroupKind{}, "", errs)
} }
// Checking the Preconditions here to fail early. They'll be enforced later on when we actually do the deletion, too. // Checking the Preconditions here to fail early. They'll be enforced later on when we actually do the deletion, too.
if options.Preconditions != nil && options.Preconditions.UID != nil && *options.Preconditions.UID != objectMeta.UID { if options.Preconditions != nil && options.Preconditions.UID != nil && *options.Preconditions.UID != objectMeta.GetUID() {
return false, false, errors.NewConflict(schema.GroupResource{Group: gvk.Group, Resource: gvk.Kind}, objectMeta.Name, fmt.Errorf("the UID in the precondition (%s) does not match the UID in record (%s). The object might have been deleted and then recreated", *options.Preconditions.UID, objectMeta.UID)) return false, false, errors.NewConflict(schema.GroupResource{Group: gvk.Group, Resource: gvk.Kind}, objectMeta.GetName(), fmt.Errorf("the UID in the precondition (%s) does not match the UID in record (%s). The object might have been deleted and then recreated", *options.Preconditions.UID, objectMeta.GetUID()))
} }
gracefulStrategy, ok := strategy.(RESTGracefulDeleteStrategy) gracefulStrategy, ok := strategy.(RESTGracefulDeleteStrategy)
if !ok { if !ok {
@ -81,7 +81,7 @@ func BeforeDelete(strategy RESTDeleteStrategy, ctx genericapirequest.Context, ob
return false, false, nil return false, false, nil
} }
// if the object is already being deleted, no need to update generation. // if the object is already being deleted, no need to update generation.
if objectMeta.DeletionTimestamp != nil { if objectMeta.GetDeletionTimestamp() != nil {
// if we are already being deleted, we may only shorten the deletion grace period // if we are already being deleted, we may only shorten the deletion grace period
// this means the object was gracefully deleted previously but deletionGracePeriodSeconds was not set, // this means the object was gracefully deleted previously but deletionGracePeriodSeconds was not set,
// so we force deletion immediately // so we force deletion immediately
@ -93,24 +93,24 @@ func BeforeDelete(strategy RESTDeleteStrategy, ctx genericapirequest.Context, ob
// a resource was previously left in a state that was non-recoverable. We // a resource was previously left in a state that was non-recoverable. We
// check if the existing stored resource has a grace period as 0 and if so // check if the existing stored resource has a grace period as 0 and if so
// attempt to delete immediately in order to recover from this scenario. // attempt to delete immediately in order to recover from this scenario.
if objectMeta.DeletionGracePeriodSeconds == nil || *objectMeta.DeletionGracePeriodSeconds == 0 { if objectMeta.GetDeletionGracePeriodSeconds() == nil || *objectMeta.GetDeletionGracePeriodSeconds() == 0 {
return false, false, nil return false, false, nil
} }
// only a shorter grace period may be provided by a user // only a shorter grace period may be provided by a user
if options.GracePeriodSeconds != nil { if options.GracePeriodSeconds != nil {
period := int64(*options.GracePeriodSeconds) period := int64(*options.GracePeriodSeconds)
if period >= *objectMeta.DeletionGracePeriodSeconds { if period >= *objectMeta.GetDeletionGracePeriodSeconds() {
return false, true, nil return false, true, nil
} }
newDeletionTimestamp := metav1.NewTime( newDeletionTimestamp := metav1.NewTime(
objectMeta.DeletionTimestamp.Add(-time.Second * time.Duration(*objectMeta.DeletionGracePeriodSeconds)). objectMeta.GetDeletionTimestamp().Add(-time.Second * time.Duration(*objectMeta.GetDeletionGracePeriodSeconds())).
Add(time.Second * time.Duration(*options.GracePeriodSeconds))) Add(time.Second * time.Duration(*options.GracePeriodSeconds)))
objectMeta.DeletionTimestamp = &newDeletionTimestamp objectMeta.SetDeletionTimestamp(&newDeletionTimestamp)
objectMeta.DeletionGracePeriodSeconds = &period objectMeta.SetDeletionGracePeriodSeconds(&period)
return true, false, nil return true, false, nil
} }
// graceful deletion is pending, do nothing // graceful deletion is pending, do nothing
options.GracePeriodSeconds = objectMeta.DeletionGracePeriodSeconds options.GracePeriodSeconds = objectMeta.GetDeletionGracePeriodSeconds()
return false, true, nil return false, true, nil
} }
@ -118,14 +118,14 @@ func BeforeDelete(strategy RESTDeleteStrategy, ctx genericapirequest.Context, ob
return false, false, nil return false, false, nil
} }
now := metav1.NewTime(metav1.Now().Add(time.Second * time.Duration(*options.GracePeriodSeconds))) now := metav1.NewTime(metav1.Now().Add(time.Second * time.Duration(*options.GracePeriodSeconds)))
objectMeta.DeletionTimestamp = &now objectMeta.SetDeletionTimestamp(&now)
objectMeta.DeletionGracePeriodSeconds = options.GracePeriodSeconds objectMeta.SetDeletionGracePeriodSeconds(options.GracePeriodSeconds)
// If it's the first graceful deletion we are going to set the DeletionTimestamp to non-nil. // If it's the first graceful deletion we are going to set the DeletionTimestamp to non-nil.
// Controllers of the object that's being deleted shouldn't take any nontrivial actions, hence its behavior changes. // Controllers of the object that's being deleted shouldn't take any nontrivial actions, hence its behavior changes.
// Thus we need to bump object's Generation (if set). This handles generation bump during graceful deletion. // Thus we need to bump object's Generation (if set). This handles generation bump during graceful deletion.
// The bump for objects that don't support graceful deletion is handled in pkg/registry/generic/registry/store.go. // The bump for objects that don't support graceful deletion is handled in pkg/registry/generic/registry/store.go.
if objectMeta.Generation > 0 { if objectMeta.GetGeneration() > 0 {
objectMeta.Generation++ objectMeta.SetGeneration(objectMeta.GetGeneration() + 1)
} }
return true, false, nil return true, false, nil
} }

View File

@ -23,16 +23,16 @@ import (
) )
// FillObjectMetaSystemFields populates fields that are managed by the system on ObjectMeta. // FillObjectMetaSystemFields populates fields that are managed by the system on ObjectMeta.
func FillObjectMetaSystemFields(ctx genericapirequest.Context, meta *metav1.ObjectMeta) { func FillObjectMetaSystemFields(ctx genericapirequest.Context, meta metav1.Object) {
meta.CreationTimestamp = metav1.Now() meta.SetCreationTimestamp(metav1.Now())
// allows admission controllers to assign a UID earlier in the request processing // allows admission controllers to assign a UID earlier in the request processing
// to support tracking resources pending creation. // to support tracking resources pending creation.
uid, found := genericapirequest.UIDFrom(ctx) uid, found := genericapirequest.UIDFrom(ctx)
if !found { if !found {
uid = uuid.NewUUID() uid = uuid.NewUUID()
} }
meta.UID = uid meta.SetUID(uid)
meta.SelfLink = "" meta.SetSelfLink("")
} }
// ValidNamespace returns false if the namespace on the context differs from // ValidNamespace returns false if the namespace on the context differs from
@ -40,10 +40,10 @@ func FillObjectMetaSystemFields(ctx genericapirequest.Context, meta *metav1.Obje
// the context. // the context.
// //
// TODO(sttts): move into pkg/genericapiserver/endpoints // TODO(sttts): move into pkg/genericapiserver/endpoints
func ValidNamespace(ctx genericapirequest.Context, resource *metav1.ObjectMeta) bool { func ValidNamespace(ctx genericapirequest.Context, resource metav1.Object) bool {
ns, ok := genericapirequest.NamespaceFrom(ctx) ns, ok := genericapirequest.NamespaceFrom(ctx)
if len(resource.Namespace) == 0 { if len(resource.GetNamespace()) == 0 {
resource.Namespace = ns resource.SetNamespace(ns)
} }
return ns == resource.Namespace && ok return ns == resource.GetNamespace() && ok
} }

View File

@ -19,6 +19,7 @@ package rest
import ( import (
"testing" "testing"
"k8s.io/apimachinery/pkg/api/meta"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/util/uuid" "k8s.io/apimachinery/pkg/util/uuid"
"k8s.io/apiserver/pkg/apis/example" "k8s.io/apiserver/pkg/apis/example"
@ -49,11 +50,15 @@ func TestFillObjectMetaSystemFields(t *testing.T) {
func TestHasObjectMetaSystemFieldValues(t *testing.T) { func TestHasObjectMetaSystemFieldValues(t *testing.T) {
ctx := genericapirequest.NewDefaultContext() ctx := genericapirequest.NewDefaultContext()
resource := metav1.ObjectMeta{} resource := metav1.ObjectMeta{}
if metav1.HasObjectMetaSystemFieldValues(&resource) { objMeta, err := meta.Accessor(&resource)
if err != nil {
t.Fatal(err)
}
if metav1.HasObjectMetaSystemFieldValues(objMeta) {
t.Errorf("the resource does not have all fields yet populated, but incorrectly reports it does") t.Errorf("the resource does not have all fields yet populated, but incorrectly reports it does")
} }
FillObjectMetaSystemFields(ctx, &resource) FillObjectMetaSystemFields(ctx, &resource)
if !metav1.HasObjectMetaSystemFieldValues(&resource) { if !metav1.HasObjectMetaSystemFieldValues(objMeta) {
t.Errorf("the resource does have all fields populated, but incorrectly reports it does not") t.Errorf("the resource does have all fields populated, but incorrectly reports it does not")
} }
} }

View File

@ -25,6 +25,7 @@ import (
apiequality "k8s.io/apimachinery/pkg/api/equality" apiequality "k8s.io/apimachinery/pkg/api/equality"
"k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/api/errors"
"k8s.io/apimachinery/pkg/api/meta"
"k8s.io/apimachinery/pkg/api/validation/path" "k8s.io/apimachinery/pkg/api/validation/path"
metainternalversion "k8s.io/apimachinery/pkg/apis/meta/internalversion" metainternalversion "k8s.io/apimachinery/pkg/apis/meta/internalversion"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@ -107,24 +108,24 @@ func (t *Tester) TestContext() genericapirequest.Context {
return genericapirequest.WithNamespace(genericapirequest.NewContext(), t.TestNamespace()) return genericapirequest.WithNamespace(genericapirequest.NewContext(), t.TestNamespace())
} }
func (t *Tester) getObjectMetaOrFail(obj runtime.Object) *metav1.ObjectMeta { func (t *Tester) getObjectMetaOrFail(obj runtime.Object) metav1.Object {
meta, err := metav1.ObjectMetaFor(obj) objMeta, err := meta.Accessor(obj)
if err != nil { if err != nil {
t.Fatalf("object does not have ObjectMeta: %v\n%#v", err, obj) t.Fatalf("object does not have ObjectMeta: %v\n%#v", err, obj)
} }
return meta return objMeta
} }
func (t *Tester) setObjectMeta(obj runtime.Object, name string) { func (t *Tester) setObjectMeta(obj runtime.Object, name string) {
meta := t.getObjectMetaOrFail(obj) meta := t.getObjectMetaOrFail(obj)
meta.Name = name meta.SetName(name)
if t.clusterScope { if t.clusterScope {
meta.Namespace = metav1.NamespaceNone meta.SetNamespace(metav1.NamespaceNone)
} else { } else {
meta.Namespace = genericapirequest.NamespaceValue(t.TestContext()) meta.SetNamespace(genericapirequest.NamespaceValue(t.TestContext()))
} }
meta.GenerateName = "" meta.SetGenerateName("")
meta.Generation = 1 meta.SetGeneration(1)
} }
func copyOrDie(obj runtime.Object, copier runtime.ObjectCopier) runtime.Object { func copyOrDie(obj runtime.Object, copier runtime.ObjectCopier) runtime.Object {
@ -228,7 +229,7 @@ func (t *Tester) TestWatch(
// Creation tests. // Creation tests.
func (t *Tester) delete(ctx genericapirequest.Context, obj runtime.Object) error { func (t *Tester) delete(ctx genericapirequest.Context, obj runtime.Object) error {
objectMeta, err := metav1.ObjectMetaFor(obj) objectMeta, err := meta.Accessor(obj)
if err != nil { if err != nil {
return err return err
} }
@ -236,7 +237,7 @@ func (t *Tester) delete(ctx genericapirequest.Context, obj runtime.Object) error
if !ok { if !ok {
return fmt.Errorf("Expected deleting storage, got %v", t.storage) return fmt.Errorf("Expected deleting storage, got %v", t.storage)
} }
_, _, err = deleter.Delete(ctx, objectMeta.Name, nil) _, _, err = deleter.Delete(ctx, objectMeta.GetName(), nil)
return err return err
} }
@ -276,7 +277,7 @@ func (t *Tester) testCreateEquals(obj runtime.Object, getFn GetFunc) {
// Set resource version which might be unset in created object. // Set resource version which might be unset in created object.
createdMeta := t.getObjectMetaOrFail(created) createdMeta := t.getObjectMetaOrFail(created)
gotMeta := t.getObjectMetaOrFail(got) gotMeta := t.getObjectMetaOrFail(got)
createdMeta.ResourceVersion = gotMeta.ResourceVersion createdMeta.SetResourceVersion(gotMeta.GetResourceVersion())
if e, a := created, got; !apiequality.Semantic.DeepEqual(e, a) { if e, a := created, got; !apiequality.Semantic.DeepEqual(e, a) {
t.Errorf("unexpected obj: %#v, expected %#v", e, a) t.Errorf("unexpected obj: %#v, expected %#v", e, a)
@ -287,7 +288,7 @@ func (t *Tester) testCreateDiscardsObjectNamespace(valid runtime.Object) {
objectMeta := t.getObjectMetaOrFail(valid) objectMeta := t.getObjectMetaOrFail(valid)
// Ignore non-empty namespace in object meta // Ignore non-empty namespace in object meta
objectMeta.Namespace = "not-default" objectMeta.SetNamespace("not-default")
// Ideally, we'd get an error back here, but at least verify the namespace wasn't persisted // Ideally, we'd get an error back here, but at least verify the namespace wasn't persisted
created, err := t.storage.(rest.Creater).Create(t.TestContext(), copyOrDie(valid, t.scheme)) created, err := t.storage.(rest.Creater).Create(t.TestContext(), copyOrDie(valid, t.scheme))
@ -296,30 +297,30 @@ func (t *Tester) testCreateDiscardsObjectNamespace(valid runtime.Object) {
} }
defer t.delete(t.TestContext(), created) defer t.delete(t.TestContext(), created)
createdObjectMeta := t.getObjectMetaOrFail(created) createdObjectMeta := t.getObjectMetaOrFail(created)
if createdObjectMeta.Namespace != metav1.NamespaceNone { if createdObjectMeta.GetNamespace() != metav1.NamespaceNone {
t.Errorf("Expected empty namespace on created object, got '%v'", createdObjectMeta.Namespace) t.Errorf("Expected empty namespace on created object, got '%v'", createdObjectMeta.GetNamespace())
} }
} }
func (t *Tester) testCreateGeneratesName(valid runtime.Object) { func (t *Tester) testCreateGeneratesName(valid runtime.Object) {
objectMeta := t.getObjectMetaOrFail(valid) objectMeta := t.getObjectMetaOrFail(valid)
objectMeta.Name = "" objectMeta.SetName("")
objectMeta.GenerateName = "test-" objectMeta.SetGenerateName("test-")
created, err := t.storage.(rest.Creater).Create(t.TestContext(), valid) created, err := t.storage.(rest.Creater).Create(t.TestContext(), valid)
if err != nil { if err != nil {
t.Fatalf("Unexpected error: %v", err) t.Fatalf("Unexpected error: %v", err)
} }
defer t.delete(t.TestContext(), created) defer t.delete(t.TestContext(), created)
if objectMeta.Name == "test-" || !strings.HasPrefix(objectMeta.Name, "test-") { if objectMeta.GetName() == "test-" || !strings.HasPrefix(objectMeta.GetName(), "test-") {
t.Errorf("unexpected name: %#v", valid) t.Errorf("unexpected name: %#v", valid)
} }
} }
func (t *Tester) testCreateHasMetadata(valid runtime.Object) { func (t *Tester) testCreateHasMetadata(valid runtime.Object) {
objectMeta := t.getObjectMetaOrFail(valid) objectMeta := t.getObjectMetaOrFail(valid)
objectMeta.Name = t.namer(1) objectMeta.SetName(t.namer(1))
objectMeta.Namespace = t.TestNamespace() objectMeta.SetNamespace(t.TestNamespace())
obj, err := t.storage.(rest.Creater).Create(t.TestContext(), valid) obj, err := t.storage.(rest.Creater).Create(t.TestContext(), valid)
if err != nil { if err != nil {
@ -345,8 +346,8 @@ func (t *Tester) testCreateIgnoresContextNamespace(valid runtime.Object) {
} }
defer t.delete(ctx, created) defer t.delete(ctx, created)
createdObjectMeta := t.getObjectMetaOrFail(created) createdObjectMeta := t.getObjectMetaOrFail(created)
if createdObjectMeta.Namespace != metav1.NamespaceNone { if createdObjectMeta.GetNamespace() != metav1.NamespaceNone {
t.Errorf("Expected empty namespace on created object, got '%v'", createdObjectMeta.Namespace) t.Errorf("Expected empty namespace on created object, got '%v'", createdObjectMeta.GetNamespace())
} }
} }
@ -354,7 +355,7 @@ func (t *Tester) testCreateIgnoresMismatchedNamespace(valid runtime.Object) {
objectMeta := t.getObjectMetaOrFail(valid) objectMeta := t.getObjectMetaOrFail(valid)
// Ignore non-empty namespace in object meta // Ignore non-empty namespace in object meta
objectMeta.Namespace = "not-default" objectMeta.SetNamespace("not-default")
ctx := genericapirequest.WithNamespace(genericapirequest.NewContext(), "not-default2") ctx := genericapirequest.WithNamespace(genericapirequest.NewContext(), "not-default2")
// Ideally, we'd get an error back here, but at least verify the namespace wasn't persisted // Ideally, we'd get an error back here, but at least verify the namespace wasn't persisted
@ -364,8 +365,8 @@ func (t *Tester) testCreateIgnoresMismatchedNamespace(valid runtime.Object) {
} }
defer t.delete(ctx, created) defer t.delete(ctx, created)
createdObjectMeta := t.getObjectMetaOrFail(created) createdObjectMeta := t.getObjectMetaOrFail(created)
if createdObjectMeta.Namespace != metav1.NamespaceNone { if createdObjectMeta.GetNamespace() != metav1.NamespaceNone {
t.Errorf("Expected empty namespace on created object, got '%v'", createdObjectMeta.Namespace) t.Errorf("Expected empty namespace on created object, got '%v'", createdObjectMeta.GetNamespace())
} }
} }
@ -373,7 +374,7 @@ func (t *Tester) testCreateValidatesNames(valid runtime.Object) {
for _, invalidName := range path.NameMayNotBe { for _, invalidName := range path.NameMayNotBe {
objCopy := copyOrDie(valid, t.scheme) objCopy := copyOrDie(valid, t.scheme)
objCopyMeta := t.getObjectMetaOrFail(objCopy) objCopyMeta := t.getObjectMetaOrFail(objCopy)
objCopyMeta.Name = invalidName objCopyMeta.SetName(invalidName)
ctx := t.TestContext() ctx := t.TestContext()
_, err := t.storage.(rest.Creater).Create(ctx, objCopy) _, err := t.storage.(rest.Creater).Create(ctx, objCopy)
@ -385,7 +386,7 @@ func (t *Tester) testCreateValidatesNames(valid runtime.Object) {
for _, invalidSuffix := range path.NameMayNotContain { for _, invalidSuffix := range path.NameMayNotContain {
objCopy := copyOrDie(valid, t.scheme) objCopy := copyOrDie(valid, t.scheme)
objCopyMeta := t.getObjectMetaOrFail(objCopy) objCopyMeta := t.getObjectMetaOrFail(objCopy)
objCopyMeta.Name += invalidSuffix objCopyMeta.SetName(objCopyMeta.GetName() + invalidSuffix)
ctx := t.TestContext() ctx := t.TestContext()
_, err := t.storage.(rest.Creater).Create(ctx, objCopy) _, err := t.storage.(rest.Creater).Create(ctx, objCopy)
@ -407,7 +408,7 @@ func (t *Tester) testCreateInvokesValidation(invalid ...runtime.Object) {
func (t *Tester) testCreateRejectsMismatchedNamespace(valid runtime.Object) { func (t *Tester) testCreateRejectsMismatchedNamespace(valid runtime.Object) {
objectMeta := t.getObjectMetaOrFail(valid) objectMeta := t.getObjectMetaOrFail(valid)
objectMeta.Namespace = "not-default" objectMeta.SetNamespace("not-default")
_, err := t.storage.(rest.Creater).Create(t.TestContext(), valid) _, err := t.storage.(rest.Creater).Create(t.TestContext(), valid)
if err == nil { if err == nil {
@ -420,8 +421,8 @@ func (t *Tester) testCreateRejectsMismatchedNamespace(valid runtime.Object) {
func (t *Tester) testCreateResetsUserData(valid runtime.Object) { func (t *Tester) testCreateResetsUserData(valid runtime.Object) {
objectMeta := t.getObjectMetaOrFail(valid) objectMeta := t.getObjectMetaOrFail(valid)
now := metav1.Now() now := metav1.Now()
objectMeta.UID = "bad-uid" objectMeta.SetUID("bad-uid")
objectMeta.CreationTimestamp = now objectMeta.SetCreationTimestamp(now)
obj, err := t.storage.(rest.Creater).Create(t.TestContext(), valid) obj, err := t.storage.(rest.Creater).Create(t.TestContext(), valid)
if err != nil { if err != nil {
@ -431,15 +432,15 @@ func (t *Tester) testCreateResetsUserData(valid runtime.Object) {
t.Fatalf("Unexpected object from result: %#v", obj) t.Fatalf("Unexpected object from result: %#v", obj)
} }
defer t.delete(t.TestContext(), obj) defer t.delete(t.TestContext(), obj)
if objectMeta.UID == "bad-uid" || objectMeta.CreationTimestamp == now { if objectMeta.GetUID() == "bad-uid" || objectMeta.GetCreationTimestamp() == now {
t.Errorf("ObjectMeta did not reset basic fields: %#v", objectMeta) t.Errorf("ObjectMeta did not reset basic fields: %#v", objectMeta)
} }
} }
func (t *Tester) testCreateIgnoreClusterName(valid runtime.Object) { func (t *Tester) testCreateIgnoreClusterName(valid runtime.Object) {
objectMeta := t.getObjectMetaOrFail(valid) objectMeta := t.getObjectMetaOrFail(valid)
objectMeta.Name = t.namer(3) objectMeta.SetName(t.namer(3))
objectMeta.ClusterName = "clustername-to-ignore" objectMeta.SetClusterName("clustername-to-ignore")
obj, err := t.storage.(rest.Creater).Create(t.TestContext(), copyOrDie(valid, t.scheme)) obj, err := t.storage.(rest.Creater).Create(t.TestContext(), copyOrDie(valid, t.scheme))
if err != nil { if err != nil {
@ -447,8 +448,8 @@ func (t *Tester) testCreateIgnoreClusterName(valid runtime.Object) {
} }
defer t.delete(t.TestContext(), obj) defer t.delete(t.TestContext(), obj)
createdObjectMeta := t.getObjectMetaOrFail(obj) createdObjectMeta := t.getObjectMetaOrFail(obj)
if len(createdObjectMeta.ClusterName) != 0 { if len(createdObjectMeta.GetClusterName()) != 0 {
t.Errorf("Expected empty clusterName on created object, got '%v'", createdObjectMeta.ClusterName) t.Errorf("Expected empty clusterName on created object, got '%v'", createdObjectMeta.GetClusterName())
} }
} }
@ -470,7 +471,7 @@ func (t *Tester) testUpdateEquals(obj runtime.Object, createFn CreateFunc, getFn
} }
toUpdate = updateFn(toUpdate) toUpdate = updateFn(toUpdate)
toUpdateMeta := t.getObjectMetaOrFail(toUpdate) toUpdateMeta := t.getObjectMetaOrFail(toUpdate)
updated, created, err := t.storage.(rest.Updater).Update(ctx, toUpdateMeta.Name, rest.DefaultUpdatedObjectInfo(toUpdate, t.scheme)) updated, created, err := t.storage.(rest.Updater).Update(ctx, toUpdateMeta.GetName(), rest.DefaultUpdatedObjectInfo(toUpdate, t.scheme))
if err != nil { if err != nil {
t.Errorf("unexpected error: %v", err) t.Errorf("unexpected error: %v", err)
} }
@ -484,7 +485,7 @@ func (t *Tester) testUpdateEquals(obj runtime.Object, createFn CreateFunc, getFn
// Set resource version which might be unset in created object. // Set resource version which might be unset in created object.
updatedMeta := t.getObjectMetaOrFail(updated) updatedMeta := t.getObjectMetaOrFail(updated)
gotMeta := t.getObjectMetaOrFail(got) gotMeta := t.getObjectMetaOrFail(got)
updatedMeta.ResourceVersion = gotMeta.ResourceVersion updatedMeta.SetResourceVersion(gotMeta.GetResourceVersion())
if e, a := updated, got; !apiequality.Semantic.DeepEqual(e, a) { if e, a := updated, got; !apiequality.Semantic.DeepEqual(e, a) {
t.Errorf("unexpected obj: %#v, expected %#v", e, a) t.Errorf("unexpected obj: %#v, expected %#v", e, a)
@ -508,9 +509,9 @@ func (t *Tester) testUpdateFailsOnVersionTooOld(obj runtime.Object, createFn Cre
older := copyOrDie(storedFoo, t.scheme) older := copyOrDie(storedFoo, t.scheme)
olderMeta := t.getObjectMetaOrFail(older) olderMeta := t.getObjectMetaOrFail(older)
olderMeta.ResourceVersion = "1" olderMeta.SetResourceVersion("1")
_, _, err = t.storage.(rest.Updater).Update(t.TestContext(), olderMeta.Name, rest.DefaultUpdatedObjectInfo(older, t.scheme)) _, _, err = t.storage.(rest.Updater).Update(t.TestContext(), olderMeta.GetName(), rest.DefaultUpdatedObjectInfo(older, t.scheme))
if err == nil { if err == nil {
t.Errorf("Expected an error, but we didn't get one") t.Errorf("Expected an error, but we didn't get one")
} else if !errors.IsConflict(err) { } else if !errors.IsConflict(err) {
@ -530,7 +531,7 @@ func (t *Tester) testUpdateInvokesValidation(obj runtime.Object, createFn Create
for _, update := range invalidUpdateFn { for _, update := range invalidUpdateFn {
toUpdate := update(copyOrDie(foo, t.scheme)) toUpdate := update(copyOrDie(foo, t.scheme))
toUpdateMeta := t.getObjectMetaOrFail(toUpdate) toUpdateMeta := t.getObjectMetaOrFail(toUpdate)
got, created, err := t.storage.(rest.Updater).Update(t.TestContext(), toUpdateMeta.Name, rest.DefaultUpdatedObjectInfo(toUpdate, t.scheme)) got, created, err := t.storage.(rest.Updater).Update(t.TestContext(), toUpdateMeta.GetName(), rest.DefaultUpdatedObjectInfo(toUpdate, t.scheme))
if got != nil || created { if got != nil || created {
t.Errorf("expected nil object and no creation for object: %v", toUpdate) t.Errorf("expected nil object and no creation for object: %v", toUpdate)
} }
@ -545,13 +546,13 @@ func (t *Tester) testUpdateWithWrongUID(obj runtime.Object, createFn CreateFunc,
foo := copyOrDie(obj, t.scheme) foo := copyOrDie(obj, t.scheme)
t.setObjectMeta(foo, t.namer(5)) t.setObjectMeta(foo, t.namer(5))
objectMeta := t.getObjectMetaOrFail(foo) objectMeta := t.getObjectMetaOrFail(foo)
objectMeta.UID = types.UID("UID0000") objectMeta.SetUID(types.UID("UID0000"))
if err := createFn(ctx, foo); err != nil { if err := createFn(ctx, foo); err != nil {
t.Errorf("unexpected error: %v", err) t.Errorf("unexpected error: %v", err)
} }
objectMeta.UID = types.UID("UID1111") objectMeta.SetUID(types.UID("UID1111"))
obj, created, err := t.storage.(rest.Updater).Update(ctx, objectMeta.Name, rest.DefaultUpdatedObjectInfo(foo, t.scheme)) obj, created, err := t.storage.(rest.Updater).Update(ctx, objectMeta.GetName(), rest.DefaultUpdatedObjectInfo(foo, t.scheme))
if created || obj != nil { if created || obj != nil {
t.Errorf("expected nil object and no creation for object: %v", foo) t.Errorf("expected nil object and no creation for object: %v", foo)
} }
@ -565,7 +566,7 @@ func (t *Tester) testUpdateRetrievesOldObject(obj runtime.Object, createFn Creat
foo := copyOrDie(obj, t.scheme) foo := copyOrDie(obj, t.scheme)
t.setObjectMeta(foo, t.namer(6)) t.setObjectMeta(foo, t.namer(6))
objectMeta := t.getObjectMetaOrFail(foo) objectMeta := t.getObjectMetaOrFail(foo)
objectMeta.Annotations = map[string]string{"A": "1"} objectMeta.SetAnnotations(map[string]string{"A": "1"})
if err := createFn(ctx, foo); err != nil { if err := createFn(ctx, foo); err != nil {
t.Errorf("unexpected error: %v", err) t.Errorf("unexpected error: %v", err)
return return
@ -579,7 +580,7 @@ func (t *Tester) testUpdateRetrievesOldObject(obj runtime.Object, createFn Creat
storedFooWithUpdates := copyOrDie(storedFoo, t.scheme) storedFooWithUpdates := copyOrDie(storedFoo, t.scheme)
objectMeta = t.getObjectMetaOrFail(storedFooWithUpdates) objectMeta = t.getObjectMetaOrFail(storedFooWithUpdates)
objectMeta.Annotations = map[string]string{"A": "2"} objectMeta.SetAnnotations(map[string]string{"A": "2"})
// Make sure a custom transform is called, and sees the expected updatedObject and oldObject // Make sure a custom transform is called, and sees the expected updatedObject and oldObject
// This tests the mechanism used to pass the old and new object to admission // This tests the mechanism used to pass the old and new object to admission
@ -595,7 +596,7 @@ func (t *Tester) testUpdateRetrievesOldObject(obj runtime.Object, createFn Creat
return updatedObject, nil return updatedObject, nil
} }
updatedObj, created, err := t.storage.(rest.Updater).Update(ctx, objectMeta.Name, rest.DefaultUpdatedObjectInfo(storedFooWithUpdates, t.scheme, noopTransform)) updatedObj, created, err := t.storage.(rest.Updater).Update(ctx, objectMeta.GetName(), rest.DefaultUpdatedObjectInfo(storedFooWithUpdates, t.scheme, noopTransform))
if err != nil { if err != nil {
t.Errorf("unexpected error: %v", err) t.Errorf("unexpected error: %v", err)
return return
@ -654,9 +655,9 @@ func (t *Tester) testUpdateIgnoreGenerationUpdates(obj runtime.Object, createFn
older := copyOrDie(storedFoo, t.scheme) older := copyOrDie(storedFoo, t.scheme)
olderMeta := t.getObjectMetaOrFail(older) olderMeta := t.getObjectMetaOrFail(older)
olderMeta.Generation = 2 olderMeta.SetGeneration(2)
_, _, err = t.storage.(rest.Updater).Update(t.TestContext(), olderMeta.Name, rest.DefaultUpdatedObjectInfo(older, t.scheme)) _, _, err = t.storage.(rest.Updater).Update(t.TestContext(), olderMeta.GetName(), rest.DefaultUpdatedObjectInfo(older, t.scheme))
if err != nil { if err != nil {
t.Errorf("Unexpected error: %v", err) t.Errorf("Unexpected error: %v", err)
} }
@ -665,7 +666,7 @@ func (t *Tester) testUpdateIgnoreGenerationUpdates(obj runtime.Object, createFn
if err != nil { if err != nil {
t.Errorf("unexpected error: %v", err) t.Errorf("unexpected error: %v", err)
} }
if exp, got := int64(1), t.getObjectMetaOrFail(updatedFoo).Generation; exp != got { if exp, got := int64(1), t.getObjectMetaOrFail(updatedFoo).GetGeneration(); exp != got {
t.Errorf("Unexpected generation update: expected %d, got %d", exp, got) t.Errorf("Unexpected generation update: expected %d, got %d", exp, got)
} }
} }
@ -704,8 +705,8 @@ func (t *Tester) testUpdateRejectsMismatchedNamespace(obj runtime.Object, create
} }
objectMeta := t.getObjectMetaOrFail(storedFoo) objectMeta := t.getObjectMetaOrFail(storedFoo)
objectMeta.Name = t.namer(1) objectMeta.SetName(t.namer(1))
objectMeta.Namespace = "not-default" objectMeta.SetNamespace("not-default")
obj, updated, err := t.storage.(rest.Updater).Update(t.TestContext(), "foo1", rest.DefaultUpdatedObjectInfo(storedFoo, t.scheme)) obj, updated, err := t.storage.(rest.Updater).Update(t.TestContext(), "foo1", rest.DefaultUpdatedObjectInfo(storedFoo, t.scheme))
if obj != nil || updated { if obj != nil || updated {
@ -736,9 +737,9 @@ func (t *Tester) testUpdateIgnoreClusterName(obj runtime.Object, createFn Create
older := copyOrDie(storedFoo, t.scheme) older := copyOrDie(storedFoo, t.scheme)
olderMeta := t.getObjectMetaOrFail(older) olderMeta := t.getObjectMetaOrFail(older)
olderMeta.ClusterName = "clustername-to-ignore" olderMeta.SetClusterName("clustername-to-ignore")
_, _, err = t.storage.(rest.Updater).Update(t.TestContext(), olderMeta.Name, rest.DefaultUpdatedObjectInfo(older, t.scheme)) _, _, err = t.storage.(rest.Updater).Update(t.TestContext(), olderMeta.GetName(), rest.DefaultUpdatedObjectInfo(older, t.scheme))
if err != nil { if err != nil {
t.Errorf("Unexpected error: %v", err) t.Errorf("Unexpected error: %v", err)
} }
@ -747,7 +748,7 @@ func (t *Tester) testUpdateIgnoreClusterName(obj runtime.Object, createFn Create
if err != nil { if err != nil {
t.Errorf("unexpected error: %v", err) t.Errorf("unexpected error: %v", err)
} }
if clusterName := t.getObjectMetaOrFail(updatedFoo).ClusterName; len(clusterName) != 0 { if clusterName := t.getObjectMetaOrFail(updatedFoo).GetClusterName(); len(clusterName) != 0 {
t.Errorf("Unexpected clusterName update: expected empty, got %v", clusterName) t.Errorf("Unexpected clusterName update: expected empty, got %v", clusterName)
} }
@ -765,12 +766,12 @@ func (t *Tester) testDeleteNoGraceful(obj runtime.Object, createFn CreateFunc, g
t.Errorf("unexpected error: %v", err) t.Errorf("unexpected error: %v", err)
} }
objectMeta := t.getObjectMetaOrFail(foo) objectMeta := t.getObjectMetaOrFail(foo)
obj, wasDeleted, err := t.storage.(rest.GracefulDeleter).Delete(ctx, objectMeta.Name, metav1.NewDeleteOptions(10)) obj, wasDeleted, err := t.storage.(rest.GracefulDeleter).Delete(ctx, objectMeta.GetName(), metav1.NewDeleteOptions(10))
if err != nil { if err != nil {
t.Errorf("unexpected error: %v", err) t.Errorf("unexpected error: %v", err)
} }
if !wasDeleted { if !wasDeleted {
t.Errorf("unexpected, object %s should have been deleted immediately", objectMeta.Name) t.Errorf("unexpected, object %s should have been deleted immediately", objectMeta.GetName())
} }
if !t.returnDeletedObject { if !t.returnDeletedObject {
if status, ok := obj.(*metav1.Status); !ok { if status, ok := obj.(*metav1.Status); !ok {
@ -789,7 +790,7 @@ func (t *Tester) testDeleteNoGraceful(obj runtime.Object, createFn CreateFunc, g
func (t *Tester) testDeleteNonExist(obj runtime.Object) { func (t *Tester) testDeleteNonExist(obj runtime.Object) {
objectMeta := t.getObjectMetaOrFail(obj) objectMeta := t.getObjectMetaOrFail(obj)
_, _, err := t.storage.(rest.GracefulDeleter).Delete(t.TestContext(), objectMeta.Name, nil) _, _, err := t.storage.(rest.GracefulDeleter).Delete(t.TestContext(), objectMeta.GetName(), nil)
if err == nil || !errors.IsNotFound(err) { if err == nil || !errors.IsNotFound(err) {
t.Errorf("unexpected error: %v", err) t.Errorf("unexpected error: %v", err)
} }
@ -804,16 +805,16 @@ func (t *Tester) testDeleteWithUID(obj runtime.Object, createFn CreateFunc, getF
foo := copyOrDie(obj, t.scheme) foo := copyOrDie(obj, t.scheme)
t.setObjectMeta(foo, t.namer(1)) t.setObjectMeta(foo, t.namer(1))
objectMeta := t.getObjectMetaOrFail(foo) objectMeta := t.getObjectMetaOrFail(foo)
objectMeta.UID = types.UID("UID0000") objectMeta.SetUID(types.UID("UID0000"))
if err := createFn(ctx, foo); err != nil { if err := createFn(ctx, foo); err != nil {
t.Errorf("unexpected error: %v", err) t.Errorf("unexpected error: %v", err)
} }
obj, _, err := t.storage.(rest.GracefulDeleter).Delete(ctx, objectMeta.Name, metav1.NewPreconditionDeleteOptions("UID1111")) obj, _, err := t.storage.(rest.GracefulDeleter).Delete(ctx, objectMeta.GetName(), metav1.NewPreconditionDeleteOptions("UID1111"))
if err == nil || !errors.IsConflict(err) { if err == nil || !errors.IsConflict(err) {
t.Errorf("unexpected error: %v", err) t.Errorf("unexpected error: %v", err)
} }
obj, _, err = t.storage.(rest.GracefulDeleter).Delete(ctx, objectMeta.Name, metav1.NewPreconditionDeleteOptions("UID0000")) obj, _, err = t.storage.(rest.GracefulDeleter).Delete(ctx, objectMeta.GetName(), metav1.NewPreconditionDeleteOptions("UID0000"))
if err != nil { if err != nil {
t.Errorf("unexpected error: %v", err) t.Errorf("unexpected error: %v", err)
} }
@ -844,27 +845,27 @@ func (t *Tester) testDeleteGracefulHasDefault(obj runtime.Object, createFn Creat
t.Errorf("unexpected error: %v", err) t.Errorf("unexpected error: %v", err)
} }
objectMeta := t.getObjectMetaOrFail(foo) objectMeta := t.getObjectMetaOrFail(foo)
generation := objectMeta.Generation generation := objectMeta.GetGeneration()
_, wasDeleted, err := t.storage.(rest.GracefulDeleter).Delete(ctx, objectMeta.Name, &metav1.DeleteOptions{}) _, wasDeleted, err := t.storage.(rest.GracefulDeleter).Delete(ctx, objectMeta.GetName(), &metav1.DeleteOptions{})
if err != nil { if err != nil {
t.Errorf("unexpected error: %v", err) t.Errorf("unexpected error: %v", err)
} }
if wasDeleted { if wasDeleted {
t.Errorf("unexpected, object %s should not have been deleted immediately", objectMeta.Name) t.Errorf("unexpected, object %s should not have been deleted immediately", objectMeta.GetName())
} }
if _, err := getFn(ctx, foo); err != nil { if _, err := getFn(ctx, foo); err != nil {
t.Fatalf("did not gracefully delete resource: %v", err) t.Fatalf("did not gracefully delete resource: %v", err)
} }
object, err := t.storage.(rest.Getter).Get(ctx, objectMeta.Name, &metav1.GetOptions{}) object, err := t.storage.(rest.Getter).Get(ctx, objectMeta.GetName(), &metav1.GetOptions{})
if err != nil { if err != nil {
t.Fatalf("unexpected error, object should exist: %v", err) t.Fatalf("unexpected error, object should exist: %v", err)
} }
objectMeta = t.getObjectMetaOrFail(object) objectMeta = t.getObjectMetaOrFail(object)
if objectMeta.DeletionTimestamp == nil || objectMeta.DeletionGracePeriodSeconds == nil || *objectMeta.DeletionGracePeriodSeconds != expectedGrace { if objectMeta.GetDeletionTimestamp() == nil || objectMeta.GetDeletionGracePeriodSeconds() == nil || *objectMeta.GetDeletionGracePeriodSeconds() != expectedGrace {
t.Errorf("unexpected deleted meta: %#v", objectMeta) t.Errorf("unexpected deleted meta: %#v", objectMeta)
} }
if generation >= objectMeta.Generation { if generation >= objectMeta.GetGeneration() {
t.Error("Generation wasn't bumped when deletion timestamp was set") t.Error("Generation wasn't bumped when deletion timestamp was set")
} }
} }
@ -878,27 +879,27 @@ func (t *Tester) testDeleteGracefulWithValue(obj runtime.Object, createFn Create
t.Errorf("unexpected error: %v", err) t.Errorf("unexpected error: %v", err)
} }
objectMeta := t.getObjectMetaOrFail(foo) objectMeta := t.getObjectMetaOrFail(foo)
generation := objectMeta.Generation generation := objectMeta.GetGeneration()
_, wasDeleted, err := t.storage.(rest.GracefulDeleter).Delete(ctx, objectMeta.Name, metav1.NewDeleteOptions(expectedGrace+2)) _, wasDeleted, err := t.storage.(rest.GracefulDeleter).Delete(ctx, objectMeta.GetName(), metav1.NewDeleteOptions(expectedGrace+2))
if err != nil { if err != nil {
t.Errorf("unexpected error: %v", err) t.Errorf("unexpected error: %v", err)
} }
if wasDeleted { if wasDeleted {
t.Errorf("unexpected, object %s should not have been deleted immediately", objectMeta.Name) t.Errorf("unexpected, object %s should not have been deleted immediately", objectMeta.GetName())
} }
if _, err := getFn(ctx, foo); err != nil { if _, err := getFn(ctx, foo); err != nil {
t.Fatalf("did not gracefully delete resource: %v", err) t.Fatalf("did not gracefully delete resource: %v", err)
} }
object, err := t.storage.(rest.Getter).Get(ctx, objectMeta.Name, &metav1.GetOptions{}) object, err := t.storage.(rest.Getter).Get(ctx, objectMeta.GetName(), &metav1.GetOptions{})
if err != nil { if err != nil {
t.Errorf("unexpected error, object should exist: %v", err) t.Errorf("unexpected error, object should exist: %v", err)
} }
objectMeta = t.getObjectMetaOrFail(object) objectMeta = t.getObjectMetaOrFail(object)
if objectMeta.DeletionTimestamp == nil || objectMeta.DeletionGracePeriodSeconds == nil || *objectMeta.DeletionGracePeriodSeconds != expectedGrace+2 { if objectMeta.GetDeletionTimestamp() == nil || objectMeta.GetDeletionGracePeriodSeconds() == nil || *objectMeta.GetDeletionGracePeriodSeconds() != expectedGrace+2 {
t.Errorf("unexpected deleted meta: %#v", objectMeta) t.Errorf("unexpected deleted meta: %#v", objectMeta)
} }
if generation >= objectMeta.Generation { if generation >= objectMeta.GetGeneration() {
t.Error("Generation wasn't bumped when deletion timestamp was set") t.Error("Generation wasn't bumped when deletion timestamp was set")
} }
} }
@ -912,35 +913,35 @@ func (t *Tester) testDeleteGracefulExtend(obj runtime.Object, createFn CreateFun
t.Errorf("unexpected error: %v", err) t.Errorf("unexpected error: %v", err)
} }
objectMeta := t.getObjectMetaOrFail(foo) objectMeta := t.getObjectMetaOrFail(foo)
generation := objectMeta.Generation generation := objectMeta.GetGeneration()
_, wasDeleted, err := t.storage.(rest.GracefulDeleter).Delete(ctx, objectMeta.Name, metav1.NewDeleteOptions(expectedGrace)) _, wasDeleted, err := t.storage.(rest.GracefulDeleter).Delete(ctx, objectMeta.GetName(), metav1.NewDeleteOptions(expectedGrace))
if err != nil { if err != nil {
t.Errorf("unexpected error: %v", err) t.Errorf("unexpected error: %v", err)
} }
if wasDeleted { if wasDeleted {
t.Errorf("unexpected, object %s should not have been deleted immediately", objectMeta.Name) t.Errorf("unexpected, object %s should not have been deleted immediately", objectMeta.GetName())
} }
if _, err := getFn(ctx, foo); err != nil { if _, err := getFn(ctx, foo); err != nil {
t.Fatalf("did not gracefully delete resource: %v", err) t.Fatalf("did not gracefully delete resource: %v", err)
} }
// second delete duration is ignored // second delete duration is ignored
_, wasDeleted, err = t.storage.(rest.GracefulDeleter).Delete(ctx, objectMeta.Name, metav1.NewDeleteOptions(expectedGrace+2)) _, wasDeleted, err = t.storage.(rest.GracefulDeleter).Delete(ctx, objectMeta.GetName(), metav1.NewDeleteOptions(expectedGrace+2))
if err != nil { if err != nil {
t.Errorf("unexpected error: %v", err) t.Errorf("unexpected error: %v", err)
} }
if wasDeleted { if wasDeleted {
t.Errorf("unexpected, object %s should not have been deleted immediately", objectMeta.Name) t.Errorf("unexpected, object %s should not have been deleted immediately", objectMeta.GetName())
} }
object, err := t.storage.(rest.Getter).Get(ctx, objectMeta.Name, &metav1.GetOptions{}) object, err := t.storage.(rest.Getter).Get(ctx, objectMeta.GetName(), &metav1.GetOptions{})
if err != nil { if err != nil {
t.Errorf("unexpected error, object should exist: %v", err) t.Errorf("unexpected error, object should exist: %v", err)
} }
objectMeta = t.getObjectMetaOrFail(object) objectMeta = t.getObjectMetaOrFail(object)
if objectMeta.DeletionTimestamp == nil || objectMeta.DeletionGracePeriodSeconds == nil || *objectMeta.DeletionGracePeriodSeconds != expectedGrace { if objectMeta.GetDeletionTimestamp() == nil || objectMeta.GetDeletionGracePeriodSeconds() == nil || *objectMeta.GetDeletionGracePeriodSeconds() != expectedGrace {
t.Errorf("unexpected deleted meta: %#v", objectMeta) t.Errorf("unexpected deleted meta: %#v", objectMeta)
} }
if generation >= objectMeta.Generation { if generation >= objectMeta.GetGeneration() {
t.Error("Generation wasn't bumped when deletion timestamp was set") t.Error("Generation wasn't bumped when deletion timestamp was set")
} }
} }
@ -954,36 +955,36 @@ func (t *Tester) testDeleteGracefulImmediate(obj runtime.Object, createFn Create
t.Errorf("unexpected error: %v", err) t.Errorf("unexpected error: %v", err)
} }
objectMeta := t.getObjectMetaOrFail(foo) objectMeta := t.getObjectMetaOrFail(foo)
generation := objectMeta.Generation generation := objectMeta.GetGeneration()
_, wasDeleted, err := t.storage.(rest.GracefulDeleter).Delete(ctx, objectMeta.Name, metav1.NewDeleteOptions(expectedGrace)) _, wasDeleted, err := t.storage.(rest.GracefulDeleter).Delete(ctx, objectMeta.GetName(), metav1.NewDeleteOptions(expectedGrace))
if err != nil { if err != nil {
t.Errorf("unexpected error: %v", err) t.Errorf("unexpected error: %v", err)
} }
if wasDeleted { if wasDeleted {
t.Errorf("unexpected, object %s should not have been deleted immediately", objectMeta.Name) t.Errorf("unexpected, object %s should not have been deleted immediately", objectMeta.GetName())
} }
if _, err := getFn(ctx, foo); err != nil { if _, err := getFn(ctx, foo); err != nil {
t.Fatalf("did not gracefully delete resource: %v", err) t.Fatalf("did not gracefully delete resource: %v", err)
} }
// second delete is immediate, resource is deleted // second delete is immediate, resource is deleted
out, wasDeleted, err := t.storage.(rest.GracefulDeleter).Delete(ctx, objectMeta.Name, metav1.NewDeleteOptions(0)) out, wasDeleted, err := t.storage.(rest.GracefulDeleter).Delete(ctx, objectMeta.GetName(), metav1.NewDeleteOptions(0))
if err != nil { if err != nil {
t.Errorf("unexpected error: %v", err) t.Errorf("unexpected error: %v", err)
} }
if wasDeleted != true { if wasDeleted != true {
t.Errorf("unexpected, object %s should have been deleted immediately", objectMeta.Name) t.Errorf("unexpected, object %s should have been deleted immediately", objectMeta.GetName())
} }
_, err = t.storage.(rest.Getter).Get(ctx, objectMeta.Name, &metav1.GetOptions{}) _, err = t.storage.(rest.Getter).Get(ctx, objectMeta.GetName(), &metav1.GetOptions{})
if !errors.IsNotFound(err) { if !errors.IsNotFound(err) {
t.Errorf("unexpected error, object should be deleted immediately: %v", err) t.Errorf("unexpected error, object should be deleted immediately: %v", err)
} }
objectMeta = t.getObjectMetaOrFail(out) objectMeta = t.getObjectMetaOrFail(out)
// the second delete shouldn't update the object, so the objectMeta.DeletionGracePeriodSeconds should eqaul to the value set in the first delete. // the second delete shouldn't update the object, so the objectMeta.GetDeletionGracePeriodSeconds() should eqaul to the value set in the first delete.
if objectMeta.DeletionTimestamp == nil || objectMeta.DeletionGracePeriodSeconds == nil || *objectMeta.DeletionGracePeriodSeconds != 0 { if objectMeta.GetDeletionTimestamp() == nil || objectMeta.GetDeletionGracePeriodSeconds() == nil || *objectMeta.GetDeletionGracePeriodSeconds() != 0 {
t.Errorf("unexpected deleted meta: %#v", objectMeta) t.Errorf("unexpected deleted meta: %#v", objectMeta)
} }
if generation >= objectMeta.Generation { if generation >= objectMeta.GetGeneration() {
t.Error("Generation wasn't bumped when deletion timestamp was set") t.Error("Generation wasn't bumped when deletion timestamp was set")
} }
} }
@ -997,14 +998,14 @@ func (t *Tester) testDeleteGracefulUsesZeroOnNil(obj runtime.Object, createFn Cr
t.Errorf("unexpected error: %v", err) t.Errorf("unexpected error: %v", err)
} }
objectMeta := t.getObjectMetaOrFail(foo) objectMeta := t.getObjectMetaOrFail(foo)
_, wasDeleted, err := t.storage.(rest.GracefulDeleter).Delete(ctx, objectMeta.Name, nil) _, wasDeleted, err := t.storage.(rest.GracefulDeleter).Delete(ctx, objectMeta.GetName(), nil)
if err != nil { if err != nil {
t.Errorf("unexpected error: %v", err) t.Errorf("unexpected error: %v", err)
} }
if !wasDeleted { if !wasDeleted {
t.Errorf("unexpected, object %s should have been deleted immediately", objectMeta.Name) t.Errorf("unexpected, object %s should have been deleted immediately", objectMeta.GetName())
} }
if _, err := t.storage.(rest.Getter).Get(ctx, objectMeta.Name, &metav1.GetOptions{}); !errors.IsNotFound(err) { if _, err := t.storage.(rest.Getter).Get(ctx, objectMeta.GetName(), &metav1.GetOptions{}); !errors.IsNotFound(err) {
t.Errorf("unexpected error, object should not exist: %v", err) t.Errorf("unexpected error, object should not exist: %v", err)
} }
} }
@ -1023,35 +1024,35 @@ func (t *Tester) testDeleteGracefulShorten(obj runtime.Object, createFn CreateFu
bigGrace = 2 * expectedGrace bigGrace = 2 * expectedGrace
} }
objectMeta := t.getObjectMetaOrFail(foo) objectMeta := t.getObjectMetaOrFail(foo)
_, wasDeleted, err := t.storage.(rest.GracefulDeleter).Delete(ctx, objectMeta.Name, metav1.NewDeleteOptions(bigGrace)) _, wasDeleted, err := t.storage.(rest.GracefulDeleter).Delete(ctx, objectMeta.GetName(), metav1.NewDeleteOptions(bigGrace))
if err != nil { if err != nil {
t.Errorf("unexpected error: %v", err) t.Errorf("unexpected error: %v", err)
} }
if wasDeleted { if wasDeleted {
t.Errorf("unexpected, object %s should not have been deleted immediately", objectMeta.Name) t.Errorf("unexpected, object %s should not have been deleted immediately", objectMeta.GetName())
} }
object, err := getFn(ctx, foo) object, err := getFn(ctx, foo)
if err != nil { if err != nil {
t.Fatalf("did not gracefully delete resource: %v", err) t.Fatalf("did not gracefully delete resource: %v", err)
} }
objectMeta = t.getObjectMetaOrFail(object) objectMeta = t.getObjectMetaOrFail(object)
deletionTimestamp := *objectMeta.DeletionTimestamp deletionTimestamp := *objectMeta.GetDeletionTimestamp()
// second delete duration is ignored // second delete duration is ignored
_, wasDeleted, err = t.storage.(rest.GracefulDeleter).Delete(ctx, objectMeta.Name, metav1.NewDeleteOptions(expectedGrace)) _, wasDeleted, err = t.storage.(rest.GracefulDeleter).Delete(ctx, objectMeta.GetName(), metav1.NewDeleteOptions(expectedGrace))
if err != nil { if err != nil {
t.Errorf("unexpected error: %v", err) t.Errorf("unexpected error: %v", err)
} }
if wasDeleted { if wasDeleted {
t.Errorf("unexpected, object %s should not have been deleted immediately", objectMeta.Name) t.Errorf("unexpected, object %s should not have been deleted immediately", objectMeta.GetName())
} }
object, err = t.storage.(rest.Getter).Get(ctx, objectMeta.Name, &metav1.GetOptions{}) object, err = t.storage.(rest.Getter).Get(ctx, objectMeta.GetName(), &metav1.GetOptions{})
if err != nil { if err != nil {
t.Errorf("unexpected error, object should exist: %v", err) t.Errorf("unexpected error, object should exist: %v", err)
} }
objectMeta = t.getObjectMetaOrFail(object) objectMeta = t.getObjectMetaOrFail(object)
if objectMeta.DeletionTimestamp == nil || objectMeta.DeletionGracePeriodSeconds == nil || if objectMeta.GetDeletionTimestamp() == nil || objectMeta.GetDeletionGracePeriodSeconds() == nil ||
*objectMeta.DeletionGracePeriodSeconds != expectedGrace || !objectMeta.DeletionTimestamp.Before(deletionTimestamp) { *objectMeta.GetDeletionGracePeriodSeconds() != expectedGrace || !objectMeta.GetDeletionTimestamp().Before(deletionTimestamp) {
t.Errorf("unexpected deleted meta: %#v", objectMeta) t.Errorf("unexpected deleted meta: %#v", objectMeta)
} }
} }
@ -1066,43 +1067,43 @@ func (t *Tester) testGetDifferentNamespace(obj runtime.Object) {
} }
objMeta := t.getObjectMetaOrFail(obj) objMeta := t.getObjectMetaOrFail(obj)
objMeta.Name = t.namer(5) objMeta.SetName(t.namer(5))
ctx1 := genericapirequest.WithNamespace(genericapirequest.NewContext(), "bar3") ctx1 := genericapirequest.WithNamespace(genericapirequest.NewContext(), "bar3")
objMeta.Namespace = genericapirequest.NamespaceValue(ctx1) objMeta.SetNamespace(genericapirequest.NamespaceValue(ctx1))
_, err := t.storage.(rest.Creater).Create(ctx1, obj) _, err := t.storage.(rest.Creater).Create(ctx1, obj)
if err != nil { if err != nil {
t.Errorf("unexpected error: %v", err) t.Errorf("unexpected error: %v", err)
} }
ctx2 := genericapirequest.WithNamespace(genericapirequest.NewContext(), "bar4") ctx2 := genericapirequest.WithNamespace(genericapirequest.NewContext(), "bar4")
objMeta.Namespace = genericapirequest.NamespaceValue(ctx2) objMeta.SetNamespace(genericapirequest.NamespaceValue(ctx2))
_, err = t.storage.(rest.Creater).Create(ctx2, obj) _, err = t.storage.(rest.Creater).Create(ctx2, obj)
if err != nil { if err != nil {
t.Errorf("unexpected error: %v", err) t.Errorf("unexpected error: %v", err)
} }
got1, err := t.storage.(rest.Getter).Get(ctx1, objMeta.Name, &metav1.GetOptions{}) got1, err := t.storage.(rest.Getter).Get(ctx1, objMeta.GetName(), &metav1.GetOptions{})
if err != nil { if err != nil {
t.Errorf("unexpected error: %v", err) t.Errorf("unexpected error: %v", err)
} }
got1Meta := t.getObjectMetaOrFail(got1) got1Meta := t.getObjectMetaOrFail(got1)
if got1Meta.Name != objMeta.Name { if got1Meta.GetName() != objMeta.GetName() {
t.Errorf("unexpected name of object: %#v, expected: %s", got1, objMeta.Name) t.Errorf("unexpected name of object: %#v, expected: %s", got1, objMeta.GetName())
} }
if got1Meta.Namespace != genericapirequest.NamespaceValue(ctx1) { if got1Meta.GetNamespace() != genericapirequest.NamespaceValue(ctx1) {
t.Errorf("unexpected namespace of object: %#v, expected: %s", got1, genericapirequest.NamespaceValue(ctx1)) t.Errorf("unexpected namespace of object: %#v, expected: %s", got1, genericapirequest.NamespaceValue(ctx1))
} }
got2, err := t.storage.(rest.Getter).Get(ctx2, objMeta.Name, &metav1.GetOptions{}) got2, err := t.storage.(rest.Getter).Get(ctx2, objMeta.GetName(), &metav1.GetOptions{})
if err != nil { if err != nil {
t.Errorf("unexpected error: %v", err) t.Errorf("unexpected error: %v", err)
} }
got2Meta := t.getObjectMetaOrFail(got2) got2Meta := t.getObjectMetaOrFail(got2)
if got2Meta.Name != objMeta.Name { if got2Meta.GetName() != objMeta.GetName() {
t.Errorf("unexpected name of object: %#v, expected: %s", got2, objMeta.Name) t.Errorf("unexpected name of object: %#v, expected: %s", got2, objMeta.GetName())
} }
if got2Meta.Namespace != genericapirequest.NamespaceValue(ctx2) { if got2Meta.GetNamespace() != genericapirequest.NamespaceValue(ctx2) {
t.Errorf("unexpected namespace of object: %#v, expected: %s", got2, genericapirequest.NamespaceValue(ctx2)) t.Errorf("unexpected namespace of object: %#v, expected: %s", got2, genericapirequest.NamespaceValue(ctx2))
} }
} }
@ -1122,7 +1123,7 @@ func (t *Tester) testGetFound(obj runtime.Object) {
t.Errorf("unexpected error: %v", err) t.Errorf("unexpected error: %v", err)
} }
gotMeta := t.getObjectMetaOrFail(got) gotMeta := t.getObjectMetaOrFail(got)
gotMeta.ResourceVersion = existingMeta.ResourceVersion gotMeta.SetResourceVersion(existingMeta.GetResourceVersion())
if e, a := existing, got; !apiequality.Semantic.DeepEqual(e, a) { if e, a := existing, got; !apiequality.Semantic.DeepEqual(e, a) {
t.Errorf("unexpected obj: %#v, expected %#v", e, a) t.Errorf("unexpected obj: %#v, expected %#v", e, a)
} }
@ -1132,8 +1133,8 @@ func (t *Tester) testGetMimatchedNamespace(obj runtime.Object) {
ctx1 := genericapirequest.WithNamespace(genericapirequest.NewContext(), "bar1") ctx1 := genericapirequest.WithNamespace(genericapirequest.NewContext(), "bar1")
ctx2 := genericapirequest.WithNamespace(genericapirequest.NewContext(), "bar2") ctx2 := genericapirequest.WithNamespace(genericapirequest.NewContext(), "bar2")
objMeta := t.getObjectMetaOrFail(obj) objMeta := t.getObjectMetaOrFail(obj)
objMeta.Name = t.namer(4) objMeta.SetName(t.namer(4))
objMeta.Namespace = genericapirequest.NamespaceValue(ctx1) objMeta.SetNamespace(genericapirequest.NamespaceValue(ctx1))
_, err := t.storage.(rest.Creater).Create(ctx1, obj) _, err := t.storage.(rest.Creater).Create(ctx1, obj)
if err != nil { if err != nil {
t.Errorf("unexpected error: %v", err) t.Errorf("unexpected error: %v", err)
@ -1219,9 +1220,9 @@ func (t *Tester) testListMatchLabels(obj runtime.Object, assignFn AssignFunc) {
t.setObjectMeta(foo3, "foo3") t.setObjectMeta(foo3, "foo3")
foo4 := copyOrDie(obj, t.scheme) foo4 := copyOrDie(obj, t.scheme)
foo4Meta := t.getObjectMetaOrFail(foo4) foo4Meta := t.getObjectMetaOrFail(foo4)
foo4Meta.Name = "foo4" foo4Meta.SetName("foo4")
foo4Meta.Namespace = genericapirequest.NamespaceValue(ctx) foo4Meta.SetNamespace(genericapirequest.NamespaceValue(ctx))
foo4Meta.Labels = testLabels foo4Meta.SetLabels(testLabels)
objs := ([]runtime.Object{foo3, foo4}) objs := ([]runtime.Object{foo3, foo4})

View File

@ -63,16 +63,16 @@ type RESTUpdateStrategy interface {
// TODO: add other common fields that require global validation. // TODO: add other common fields that require global validation.
func validateCommonFields(obj, old runtime.Object, strategy RESTUpdateStrategy) (field.ErrorList, error) { func validateCommonFields(obj, old runtime.Object, strategy RESTUpdateStrategy) (field.ErrorList, error) {
allErrs := field.ErrorList{} allErrs := field.ErrorList{}
objectMeta, err := metav1.ObjectMetaFor(obj) objectMeta, err := meta.Accessor(obj)
if err != nil { if err != nil {
return nil, fmt.Errorf("failed to get new object metadata: %v", err) return nil, fmt.Errorf("failed to get new object metadata: %v", err)
} }
oldObjectMeta, err := metav1.ObjectMetaFor(old) oldObjectMeta, err := meta.Accessor(old)
if err != nil { if err != nil {
return nil, fmt.Errorf("failed to get old object metadata: %v", err) return nil, fmt.Errorf("failed to get old object metadata: %v", err)
} }
allErrs = append(allErrs, genericvalidation.ValidateObjectMeta(objectMeta, strategy.NamespaceScoped(), path.ValidatePathSegmentName, field.NewPath("metadata"))...) allErrs = append(allErrs, genericvalidation.ValidateObjectMetaAccessor(objectMeta, strategy.NamespaceScoped(), path.ValidatePathSegmentName, field.NewPath("metadata"))...)
allErrs = append(allErrs, genericvalidation.ValidateObjectMetaUpdate(objectMeta, oldObjectMeta, field.NewPath("metadata"))...) allErrs = append(allErrs, genericvalidation.ValidateObjectMetaAccessorUpdate(objectMeta, oldObjectMeta, field.NewPath("metadata"))...)
return allErrs, nil return allErrs, nil
} }
@ -90,19 +90,19 @@ func BeforeUpdate(strategy RESTUpdateStrategy, ctx genericapirequest.Context, ob
return errors.NewBadRequest("the namespace of the provided object does not match the namespace sent on the request") return errors.NewBadRequest("the namespace of the provided object does not match the namespace sent on the request")
} }
} else { } else {
objectMeta.Namespace = metav1.NamespaceNone objectMeta.SetNamespace(metav1.NamespaceNone)
} }
// Ensure requests cannot update generation // Ensure requests cannot update generation
oldMeta, err := metav1.ObjectMetaFor(old) oldMeta, err := meta.Accessor(old)
if err != nil { if err != nil {
return err return err
} }
objectMeta.Generation = oldMeta.Generation objectMeta.SetGeneration(oldMeta.GetGeneration())
strategy.PrepareForUpdate(ctx, obj, old) strategy.PrepareForUpdate(ctx, obj, old)
// ClusterName is ignored and should not be saved // ClusterName is ignored and should not be saved
objectMeta.ClusterName = "" objectMeta.SetClusterName("")
// Ensure some common fields, like UID, are validated for all resources. // Ensure some common fields, like UID, are validated for all resources.
errs, err := validateCommonFields(obj, old, strategy) errs, err := validateCommonFields(obj, old, strategy)
@ -112,7 +112,7 @@ func BeforeUpdate(strategy RESTUpdateStrategy, ctx genericapirequest.Context, ob
errs = append(errs, strategy.ValidateUpdate(ctx, obj, old)...) errs = append(errs, strategy.ValidateUpdate(ctx, obj, old)...)
if len(errs) > 0 { if len(errs) > 0 {
return errors.NewInvalid(kind.GroupKind(), objectMeta.Name, errs) return errors.NewInvalid(kind.GroupKind(), objectMeta.GetName(), errs)
} }
strategy.Canonicalize(obj) strategy.Canonicalize(obj)

View File

@ -28,7 +28,6 @@ import (
"golang.org/x/net/context" "golang.org/x/net/context"
"k8s.io/apimachinery/pkg/api/meta" "k8s.io/apimachinery/pkg/api/meta"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/conversion" "k8s.io/apimachinery/pkg/conversion"
"k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime"
utilruntime "k8s.io/apimachinery/pkg/util/runtime" utilruntime "k8s.io/apimachinery/pkg/util/runtime"
@ -161,12 +160,12 @@ func checkPreconditions(key string, preconditions *storage.Preconditions, out ru
if preconditions == nil { if preconditions == nil {
return nil return nil
} }
objMeta, err := metav1.ObjectMetaFor(out) objMeta, err := meta.Accessor(out)
if err != nil { if err != nil {
return storage.NewInternalErrorf("can't enforce preconditions %v on un-introspectable object %v, got error: %v", *preconditions, out, err) return storage.NewInternalErrorf("can't enforce preconditions %v on un-introspectable object %v, got error: %v", *preconditions, out, err)
} }
if preconditions.UID != nil && *preconditions.UID != objMeta.UID { if preconditions.UID != nil && *preconditions.UID != objMeta.GetUID() {
errMsg := fmt.Sprintf("Precondition failed: UID in precondition: %v, UID in object meta: %v", preconditions.UID, objMeta.UID) errMsg := fmt.Sprintf("Precondition failed: UID in precondition: %v, UID in object meta: %v", preconditions.UID, objMeta.GetUID())
return storage.NewInvalidObjError(key, errMsg) return storage.NewInvalidObjError(key, errMsg)
} }
return nil return nil

View File

@ -30,7 +30,6 @@ import (
"golang.org/x/net/context" "golang.org/x/net/context"
"k8s.io/apimachinery/pkg/api/meta" "k8s.io/apimachinery/pkg/api/meta"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/conversion" "k8s.io/apimachinery/pkg/conversion"
"k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime"
utilruntime "k8s.io/apimachinery/pkg/util/runtime" utilruntime "k8s.io/apimachinery/pkg/util/runtime"
@ -559,12 +558,12 @@ func checkPreconditions(key string, preconditions *storage.Preconditions, out ru
if preconditions == nil { if preconditions == nil {
return nil return nil
} }
objMeta, err := metav1.ObjectMetaFor(out) objMeta, err := meta.Accessor(out)
if err != nil { if err != nil {
return storage.NewInternalErrorf("can't enforce preconditions %v on un-introspectable object %v, got error: %v", *preconditions, out, err) return storage.NewInternalErrorf("can't enforce preconditions %v on un-introspectable object %v, got error: %v", *preconditions, out, err)
} }
if preconditions.UID != nil && *preconditions.UID != objMeta.UID { if preconditions.UID != nil && *preconditions.UID != objMeta.GetUID() {
errMsg := fmt.Sprintf("Precondition failed: UID in precondition: %v, UID in object meta: %v", *preconditions.UID, objMeta.UID) errMsg := fmt.Sprintf("Precondition failed: UID in precondition: %v, UID in object meta: %v", *preconditions.UID, objMeta.GetUID())
return storage.NewInvalidObjError(key, errMsg) return storage.NewInvalidObjError(key, errMsg)
} }
return nil return nil