Merge pull request #23472 from wojtek-t/fix_object_meta_for

Automatic merge from submit-queue

Switch from api.ObjectMetaFor to meta.Accessor in most of places

Fix #23278

@smarterclayton @lavalamp
This commit is contained in:
k8s-merge-robot 2016-04-02 02:33:40 -07:00
commit f5c93c8ddc
17 changed files with 160 additions and 108 deletions

View File

@ -17,8 +17,8 @@ limitations under the License.
package admission package admission
import ( import (
"k8s.io/kubernetes/pkg/api"
apierrors "k8s.io/kubernetes/pkg/api/errors" apierrors "k8s.io/kubernetes/pkg/api/errors"
"k8s.io/kubernetes/pkg/api/meta"
"k8s.io/kubernetes/pkg/api/unversioned" "k8s.io/kubernetes/pkg/api/unversioned"
utilerrors "k8s.io/kubernetes/pkg/util/errors" utilerrors "k8s.io/kubernetes/pkg/util/errors"
) )
@ -28,16 +28,16 @@ func extractResourceName(a Attributes) (name string, resource unversioned.GroupR
resource = a.GetResource() resource = a.GetResource()
obj := a.GetObject() obj := a.GetObject()
if obj != nil { if obj != nil {
objectMeta, err := api.ObjectMetaFor(obj) accessor, err := meta.Accessor(obj)
if err != nil { if err != nil {
return "", unversioned.GroupResource{}, err return "", unversioned.GroupResource{}, err
} }
// this is necessary because name object name generation has not occurred yet // this is necessary because name object name generation has not occurred yet
if len(objectMeta.Name) > 0 { if len(accessor.GetName()) > 0 {
name = objectMeta.Name name = accessor.GetName()
} else if len(objectMeta.GenerateName) > 0 { } else if len(accessor.GetGenerateName()) > 0 {
name = objectMeta.GenerateName name = accessor.GetGenerateName()
} }
} }
return name, resource, nil return name, resource, nil

View File

@ -39,6 +39,7 @@ func HasObjectMetaSystemFieldValues(meta *ObjectMeta) bool {
// ObjectMetaFor returns a pointer to a provided object's ObjectMeta. // ObjectMetaFor returns a pointer to a provided object's ObjectMeta.
// TODO: allow runtime.Unknown to extract this object // TODO: allow runtime.Unknown to extract this object
// TODO: Remove this function and use meta.Accessor() instead.
func ObjectMetaFor(obj runtime.Object) (*ObjectMeta, error) { func ObjectMetaFor(obj runtime.Object) (*ObjectMeta, error) {
v, err := conversion.EnforcePtr(obj) v, err := conversion.EnforcePtr(obj)
if err != nil { if err != nil {
@ -64,18 +65,26 @@ func ListMetaFor(obj runtime.Object) (*unversioned.ListMeta, error) {
// Namespace implements meta.Object for any object with an ObjectMeta typed field. Allows // Namespace implements meta.Object for any object with an ObjectMeta typed field. Allows
// fast, direct access to metadata fields for API objects. // fast, direct access to metadata fields for API objects.
func (meta *ObjectMeta) GetNamespace() string { return meta.Namespace } func (meta *ObjectMeta) GetNamespace() string { return meta.Namespace }
func (meta *ObjectMeta) SetNamespace(namespace string) { meta.Namespace = namespace } func (meta *ObjectMeta) SetNamespace(namespace string) { meta.Namespace = namespace }
func (meta *ObjectMeta) GetName() string { return meta.Name } func (meta *ObjectMeta) GetName() string { return meta.Name }
func (meta *ObjectMeta) SetName(name string) { meta.Name = name } func (meta *ObjectMeta) SetName(name string) { meta.Name = name }
func (meta *ObjectMeta) GetGenerateName() string { return meta.GenerateName } func (meta *ObjectMeta) GetGenerateName() string { return meta.GenerateName }
func (meta *ObjectMeta) SetGenerateName(generateName string) { meta.GenerateName = generateName } func (meta *ObjectMeta) SetGenerateName(generateName string) { meta.GenerateName = generateName }
func (meta *ObjectMeta) GetUID() types.UID { return meta.UID } func (meta *ObjectMeta) GetUID() types.UID { return meta.UID }
func (meta *ObjectMeta) SetUID(uid types.UID) { meta.UID = uid } func (meta *ObjectMeta) SetUID(uid types.UID) { meta.UID = uid }
func (meta *ObjectMeta) GetResourceVersion() string { return meta.ResourceVersion } func (meta *ObjectMeta) GetResourceVersion() string { return meta.ResourceVersion }
func (meta *ObjectMeta) SetResourceVersion(version string) { meta.ResourceVersion = version } func (meta *ObjectMeta) SetResourceVersion(version string) { meta.ResourceVersion = version }
func (meta *ObjectMeta) GetSelfLink() string { return meta.SelfLink } func (meta *ObjectMeta) GetSelfLink() string { return meta.SelfLink }
func (meta *ObjectMeta) SetSelfLink(selfLink string) { meta.SelfLink = selfLink } func (meta *ObjectMeta) SetSelfLink(selfLink string) { meta.SelfLink = selfLink }
func (meta *ObjectMeta) GetCreationTimestamp() unversioned.Time { return meta.CreationTimestamp }
func (meta *ObjectMeta) SetCreationTimestamp(creationTimestamp unversioned.Time) {
meta.CreationTimestamp = creationTimestamp
}
func (meta *ObjectMeta) GetDeletionTimestamp() *unversioned.Time { return meta.DeletionTimestamp }
func (meta *ObjectMeta) SetDeletionTimestamp(deletionTimestamp *unversioned.Time) {
meta.DeletionTimestamp = deletionTimestamp
}
func (meta *ObjectMeta) GetLabels() map[string]string { return meta.Labels } func (meta *ObjectMeta) GetLabels() map[string]string { return meta.Labels }
func (meta *ObjectMeta) SetLabels(labels map[string]string) { meta.Labels = labels } func (meta *ObjectMeta) SetLabels(labels map[string]string) { meta.Labels = labels }
func (meta *ObjectMeta) GetAnnotations() map[string]string { return meta.Annotations } func (meta *ObjectMeta) GetAnnotations() map[string]string { return meta.Annotations }

View File

@ -49,6 +49,10 @@ type Object interface {
SetResourceVersion(version string) SetResourceVersion(version string)
GetSelfLink() string GetSelfLink() string
SetSelfLink(selfLink string) SetSelfLink(selfLink string)
GetCreationTimestamp() unversioned.Time
SetCreationTimestamp(timestamp unversioned.Time)
GetDeletionTimestamp() *unversioned.Time
SetDeletionTimestamp(timestamp *unversioned.Time)
GetLabels() map[string]string GetLabels() map[string]string
SetLabels(labels map[string]string) SetLabels(labels map[string]string)
GetAnnotations() map[string]string GetAnnotations() map[string]string

View File

@ -24,6 +24,8 @@ import (
"k8s.io/kubernetes/pkg/conversion" "k8s.io/kubernetes/pkg/conversion"
"k8s.io/kubernetes/pkg/runtime" "k8s.io/kubernetes/pkg/runtime"
"k8s.io/kubernetes/pkg/types" "k8s.io/kubernetes/pkg/types"
"github.com/golang/glog"
) )
// Accessor takes an arbitrary object pointer and returns meta.Interface. // Accessor takes an arbitrary object pointer and returns meta.Interface.
@ -40,6 +42,8 @@ func Accessor(obj interface{}) (Object, error) {
if oi, ok := obj.(Object); ok { if oi, ok := obj.(Object); ok {
return oi, nil return oi, nil
} }
glog.V(4).Infof("Calling Accessor on non-internal object: %v", reflect.TypeOf(obj))
// legacy path for objects that do not implement Object and ObjectMetaAccessor via // legacy path for objects that do not implement Object and ObjectMetaAccessor via
// reflection - very slow code path. // reflection - very slow code path.
v, err := conversion.EnforcePtr(obj) v, err := conversion.EnforcePtr(obj)
@ -321,16 +325,18 @@ func (resourceAccessor) SetResourceVersion(obj runtime.Object, version string) e
// genericAccessor contains pointers to strings that can modify an arbitrary // genericAccessor contains pointers to strings that can modify an arbitrary
// struct and implements the Accessor interface. // struct and implements the Accessor interface.
type genericAccessor struct { type genericAccessor struct {
namespace *string namespace *string
name *string name *string
generateName *string generateName *string
uid *types.UID uid *types.UID
apiVersion *string apiVersion *string
kind *string kind *string
resourceVersion *string resourceVersion *string
selfLink *string selfLink *string
labels *map[string]string creationTimestamp *unversioned.Time
annotations *map[string]string deletionTimestamp **unversioned.Time
labels *map[string]string
annotations *map[string]string
} }
func (a genericAccessor) GetNamespace() string { func (a genericAccessor) GetNamespace() string {
@ -421,6 +427,22 @@ func (a genericAccessor) SetSelfLink(selfLink string) {
*a.selfLink = selfLink *a.selfLink = selfLink
} }
func (a genericAccessor) GetCreationTimestamp() unversioned.Time {
return *a.creationTimestamp
}
func (a genericAccessor) SetCreationTimestamp(timestamp unversioned.Time) {
*a.creationTimestamp = timestamp
}
func (a genericAccessor) GetDeletionTimestamp() *unversioned.Time {
return *a.deletionTimestamp
}
func (a genericAccessor) SetDeletionTimestamp(timestamp *unversioned.Time) {
*a.deletionTimestamp = timestamp
}
func (a genericAccessor) GetLabels() map[string]string { func (a genericAccessor) GetLabels() map[string]string {
if a.labels == nil { if a.labels == nil {
return nil return nil

View File

@ -22,7 +22,6 @@ import (
"reflect" "reflect"
"strings" "strings"
"k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/api/errors" "k8s.io/kubernetes/pkg/api/errors"
"k8s.io/kubernetes/pkg/api/meta" "k8s.io/kubernetes/pkg/api/meta"
"k8s.io/kubernetes/pkg/api/unversioned" "k8s.io/kubernetes/pkg/api/unversioned"
@ -79,19 +78,19 @@ func ObjectReaction(o ObjectRetriever, mapper meta.RESTMapper) ReactionFunc {
return true, resource, err return true, resource, err
case CreateAction: case CreateAction:
meta, err := api.ObjectMetaFor(castAction.GetObject()) accessor, err := meta.Accessor(castAction.GetObject())
if err != nil { if err != nil {
return true, nil, err return true, nil, err
} }
resource, err := o.Kind(kind, meta.Name) resource, err := o.Kind(kind, accessor.GetName())
return true, resource, err return true, resource, err
case UpdateAction: case UpdateAction:
meta, err := api.ObjectMetaFor(castAction.GetObject()) accessor, err := meta.Accessor(castAction.GetObject())
if err != nil { if err != nil {
return true, nil, err return true, nil, err
} }
resource, err := o.Kind(kind, meta.Name) resource, err := o.Kind(kind, accessor.GetName())
return true, resource, err return true, resource, err
default: default:

View File

@ -22,7 +22,6 @@ import (
"reflect" "reflect"
"strings" "strings"
"k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/api/errors" "k8s.io/kubernetes/pkg/api/errors"
"k8s.io/kubernetes/pkg/api/meta" "k8s.io/kubernetes/pkg/api/meta"
"k8s.io/kubernetes/pkg/api/unversioned" "k8s.io/kubernetes/pkg/api/unversioned"
@ -80,19 +79,19 @@ func ObjectReaction(o ObjectRetriever, mapper meta.RESTMapper) ReactionFunc {
return true, resource, err return true, resource, err
case CreateAction: case CreateAction:
meta, err := api.ObjectMetaFor(castAction.GetObject()) accessor, err := meta.Accessor(castAction.GetObject())
if err != nil { if err != nil {
return true, nil, err return true, nil, err
} }
resource, err := o.Kind(kind, meta.Name) resource, err := o.Kind(kind, accessor.GetName())
return true, resource, err return true, resource, err
case UpdateAction: case UpdateAction:
meta, err := api.ObjectMetaFor(castAction.GetObject()) accessor, err := meta.Accessor(castAction.GetObject())
if err != nil { if err != nil {
return true, nil, err return true, nil, err
} }
resource, err := o.Kind(kind, meta.Name) resource, err := o.Kind(kind, accessor.GetName())
return true, resource, err return true, resource, err
default: default:

View File

@ -24,6 +24,7 @@ import (
"github.com/golang/glog" "github.com/golang/glog"
"k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/api/meta"
"k8s.io/kubernetes/pkg/api/unversioned" "k8s.io/kubernetes/pkg/api/unversioned"
"k8s.io/kubernetes/pkg/api/validation" "k8s.io/kubernetes/pkg/api/validation"
"k8s.io/kubernetes/pkg/apis/extensions" "k8s.io/kubernetes/pkg/apis/extensions"
@ -418,11 +419,11 @@ func (r RealPodControl) createPods(nodeName, namespace string, template *api.Pod
if err != nil { if err != nil {
return err return err
} }
meta, err := api.ObjectMetaFor(object) accessor, err := meta.Accessor(object)
if err != nil { if err != nil {
return fmt.Errorf("object does not have ObjectMeta, %v", err) return fmt.Errorf("object does not have ObjectMeta, %v", err)
} }
prefix := getPodsPrefix(meta.Name) prefix := getPodsPrefix(accessor.GetName())
pod := &api.Pod{ pod := &api.Pod{
ObjectMeta: api.ObjectMeta{ ObjectMeta: api.ObjectMeta{
@ -444,14 +445,14 @@ func (r RealPodControl) createPods(nodeName, namespace string, template *api.Pod
r.Recorder.Eventf(object, api.EventTypeWarning, "FailedCreate", "Error creating: %v", err) r.Recorder.Eventf(object, api.EventTypeWarning, "FailedCreate", "Error creating: %v", err)
return fmt.Errorf("unable to create pods: %v", err) return fmt.Errorf("unable to create pods: %v", err)
} else { } else {
glog.V(4).Infof("Controller %v created pod %v", meta.Name, newPod.Name) glog.V(4).Infof("Controller %v created pod %v", accessor.GetName(), newPod.Name)
r.Recorder.Eventf(object, api.EventTypeNormal, "SuccessfulCreate", "Created pod: %v", newPod.Name) r.Recorder.Eventf(object, api.EventTypeNormal, "SuccessfulCreate", "Created pod: %v", newPod.Name)
} }
return nil return nil
} }
func (r RealPodControl) DeletePod(namespace string, podID string, object runtime.Object) error { func (r RealPodControl) DeletePod(namespace string, podID string, object runtime.Object) error {
meta, err := api.ObjectMetaFor(object) accessor, err := meta.Accessor(object)
if err != nil { if err != nil {
return fmt.Errorf("object does not have ObjectMeta, %v", err) return fmt.Errorf("object does not have ObjectMeta, %v", err)
} }
@ -459,7 +460,7 @@ func (r RealPodControl) DeletePod(namespace string, podID string, object runtime
r.Recorder.Eventf(object, api.EventTypeWarning, "FailedDelete", "Error deleting: %v", err) r.Recorder.Eventf(object, api.EventTypeWarning, "FailedDelete", "Error deleting: %v", err)
return fmt.Errorf("unable to delete pods: %v", err) return fmt.Errorf("unable to delete pods: %v", err)
} else { } else {
glog.V(4).Infof("Controller %v deleted pod %v", meta.Name, podID) glog.V(4).Infof("Controller %v deleted pod %v", accessor.GetName(), podID)
r.Recorder.Eventf(object, api.EventTypeNormal, "SuccessfulDelete", "Deleted pod: %v", podID) r.Recorder.Eventf(object, api.EventTypeNormal, "SuccessfulDelete", "Deleted pod: %v", podID)
} }
return nil return nil

View File

@ -89,8 +89,8 @@ func (f *FakeControllerSource) DeleteDropWatch(lastValue runtime.Object) {
f.Change(watch.Event{Type: watch.Deleted, Object: lastValue}, 0) f.Change(watch.Event{Type: watch.Deleted, Object: lastValue}, 0)
} }
func (f *FakeControllerSource) key(meta *api.ObjectMeta) nnu { func (f *FakeControllerSource) key(accessor meta.Object) nnu {
return nnu{meta.Namespace, meta.Name, meta.UID} return nnu{accessor.GetNamespace(), accessor.GetName(), accessor.GetUID()}
} }
// Change records the given event (setting the object's resource version) and // Change records the given event (setting the object's resource version) and
@ -99,15 +99,15 @@ func (f *FakeControllerSource) Change(e watch.Event, watchProbability float64) {
f.lock.Lock() f.lock.Lock()
defer f.lock.Unlock() defer f.lock.Unlock()
objMeta, err := api.ObjectMetaFor(e.Object) accessor, err := meta.Accessor(e.Object)
if err != nil { if err != nil {
panic(err) // this is test code only panic(err) // this is test code only
} }
resourceVersion := len(f.changes) + 1 resourceVersion := len(f.changes) + 1
objMeta.ResourceVersion = strconv.Itoa(resourceVersion) accessor.SetResourceVersion(strconv.Itoa(resourceVersion))
f.changes = append(f.changes, e) f.changes = append(f.changes, e)
key := f.key(objMeta) key := f.key(accessor)
switch e.Type { switch e.Type {
case watch.Added, watch.Modified: case watch.Added, watch.Modified:
f.items[key] = e.Object f.items[key] = e.Object

View File

@ -26,6 +26,7 @@ import (
"github.com/golang/glog" "github.com/golang/glog"
"github.com/spf13/cobra" "github.com/spf13/cobra"
"k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/api/meta"
"k8s.io/kubernetes/pkg/kubectl" "k8s.io/kubernetes/pkg/kubectl"
cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util"
"k8s.io/kubernetes/pkg/kubectl/resource" "k8s.io/kubernetes/pkg/kubectl/resource"
@ -310,14 +311,14 @@ func validateAnnotations(removeAnnotations []string, newAnnotations map[string]s
} }
// validateNoAnnotationOverwrites validates that when overwrite is false, to-be-updated annotations don't exist in the object annotation map (yet) // validateNoAnnotationOverwrites validates that when overwrite is false, to-be-updated annotations don't exist in the object annotation map (yet)
func validateNoAnnotationOverwrites(meta *api.ObjectMeta, annotations map[string]string) error { func validateNoAnnotationOverwrites(accessor meta.Object, annotations map[string]string) error {
var buf bytes.Buffer var buf bytes.Buffer
for key := range annotations { for key := range annotations {
// change-cause annotation can always be overwritten // change-cause annotation can always be overwritten
if key == kubectl.ChangeCauseAnnotation { if key == kubectl.ChangeCauseAnnotation {
continue continue
} }
if value, found := meta.Annotations[key]; found { if value, found := accessor.GetAnnotations()[key]; found {
if buf.Len() > 0 { if buf.Len() > 0 {
buf.WriteString("; ") buf.WriteString("; ")
} }
@ -332,29 +333,31 @@ func validateNoAnnotationOverwrites(meta *api.ObjectMeta, annotations map[string
// updateAnnotations updates annotations of obj // updateAnnotations updates annotations of obj
func (o AnnotateOptions) updateAnnotations(obj runtime.Object) error { func (o AnnotateOptions) updateAnnotations(obj runtime.Object) error {
meta, err := api.ObjectMetaFor(obj) accessor, err := meta.Accessor(obj)
if err != nil { if err != nil {
return err return err
} }
if !o.overwrite { if !o.overwrite {
if err := validateNoAnnotationOverwrites(meta, o.newAnnotations); err != nil { if err := validateNoAnnotationOverwrites(accessor, o.newAnnotations); err != nil {
return err return err
} }
} }
if meta.Annotations == nil { annotations := accessor.GetAnnotations()
meta.Annotations = make(map[string]string) if annotations == nil {
annotations = make(map[string]string)
} }
for key, value := range o.newAnnotations { for key, value := range o.newAnnotations {
meta.Annotations[key] = value annotations[key] = value
} }
for _, annotation := range o.removeAnnotations { for _, annotation := range o.removeAnnotations {
delete(meta.Annotations, annotation) delete(annotations, annotation)
} }
accessor.SetAnnotations(annotations)
if len(o.resourceVersion) != 0 { if len(o.resourceVersion) != 0 {
meta.ResourceVersion = o.resourceVersion accessor.SetResourceVersion(o.resourceVersion)
} }
return nil return nil
} }

View File

@ -28,6 +28,7 @@ import (
"github.com/spf13/cobra" "github.com/spf13/cobra"
"k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/api/meta"
"k8s.io/kubernetes/pkg/client/unversioned/fake" "k8s.io/kubernetes/pkg/client/unversioned/fake"
"k8s.io/kubernetes/pkg/kubectl" "k8s.io/kubernetes/pkg/kubectl"
cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util"
@ -94,33 +95,36 @@ func readServiceFromFile(t *testing.T, filename string) *api.Service {
} }
func annotateRuntimeObject(t *testing.T, originalObj, currentObj runtime.Object, kind string) (string, []byte) { func annotateRuntimeObject(t *testing.T, originalObj, currentObj runtime.Object, kind string) (string, []byte) {
originalMeta, err := api.ObjectMetaFor(originalObj) originalAccessor, err := meta.Accessor(originalObj)
if err != nil { if err != nil {
t.Fatal(err) t.Fatal(err)
} }
originalMeta.Labels["DELETE_ME"] = "DELETE_ME" originalLabels := originalAccessor.GetLabels()
originalLabels["DELETE_ME"] = "DELETE_ME"
originalAccessor.SetLabels(originalLabels)
original, err := json.Marshal(originalObj) original, err := json.Marshal(originalObj)
if err != nil { if err != nil {
t.Fatal(err) t.Fatal(err)
} }
currentMeta, err := api.ObjectMetaFor(currentObj) currentAccessor, err := meta.Accessor(currentObj)
if err != nil { if err != nil {
t.Fatal(err) t.Fatal(err)
} }
if currentMeta.Annotations == nil { currentAnnotations := currentAccessor.GetAnnotations()
currentMeta.Annotations = map[string]string{} if currentAnnotations == nil {
currentAnnotations = make(map[string]string)
} }
currentAnnotations[kubectl.LastAppliedConfigAnnotation] = string(original)
currentMeta.Annotations[kubectl.LastAppliedConfigAnnotation] = string(original) currentAccessor.SetAnnotations(currentAnnotations)
current, err := json.Marshal(currentObj) current, err := json.Marshal(currentObj)
if err != nil { if err != nil {
t.Fatal(err) t.Fatal(err)
} }
return currentMeta.Name, current return currentAccessor.GetName(), current
} }
func readAndAnnotateReplicationController(t *testing.T, filename string) (string, []byte) { func readAndAnnotateReplicationController(t *testing.T, filename string) (string, []byte) {

View File

@ -26,6 +26,7 @@ import (
"github.com/golang/glog" "github.com/golang/glog"
"github.com/spf13/cobra" "github.com/spf13/cobra"
"k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/api/meta"
"k8s.io/kubernetes/pkg/kubectl" "k8s.io/kubernetes/pkg/kubectl"
cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util"
"k8s.io/kubernetes/pkg/kubectl/resource" "k8s.io/kubernetes/pkg/kubectl/resource"
@ -105,10 +106,10 @@ func NewCmdLabel(f *cmdutil.Factory, out io.Writer) *cobra.Command {
return cmd return cmd
} }
func validateNoOverwrites(meta *api.ObjectMeta, labels map[string]string) error { func validateNoOverwrites(accessor meta.Object, labels map[string]string) error {
allErrs := []error{} allErrs := []error{}
for key := range labels { for key := range labels {
if value, found := meta.Labels[key]; found { if value, found := accessor.GetLabels()[key]; found {
allErrs = append(allErrs, fmt.Errorf("'%s' already has a value (%s), and --overwrite is false", key, value)) allErrs = append(allErrs, fmt.Errorf("'%s' already has a value (%s), and --overwrite is false", key, value))
} }
} }
@ -140,29 +141,31 @@ func parseLabels(spec []string) (map[string]string, []string, error) {
} }
func labelFunc(obj runtime.Object, overwrite bool, resourceVersion string, labels map[string]string, remove []string) error { func labelFunc(obj runtime.Object, overwrite bool, resourceVersion string, labels map[string]string, remove []string) error {
meta, err := api.ObjectMetaFor(obj) accessor, err := meta.Accessor(obj)
if err != nil { if err != nil {
return err return err
} }
if !overwrite { if !overwrite {
if err := validateNoOverwrites(meta, labels); err != nil { if err := validateNoOverwrites(accessor, labels); err != nil {
return err return err
} }
} }
if meta.Labels == nil { objLabels := accessor.GetLabels()
meta.Labels = make(map[string]string) if objLabels == nil {
objLabels = make(map[string]string)
} }
for key, value := range labels { for key, value := range labels {
meta.Labels[key] = value objLabels[key] = value
} }
for _, label := range remove { for _, label := range remove {
delete(meta.Labels, label) delete(objLabels, label)
} }
accessor.SetLabels(objLabels)
if len(resourceVersion) != 0 { if len(resourceVersion) != 0 {
meta.ResourceVersion = resourceVersion accessor.SetResourceVersion(resourceVersion)
} }
return nil return nil
} }
@ -250,9 +253,12 @@ func RunLabel(f *cmdutil.Factory, out io.Writer, cmd *cobra.Command, args []stri
if err != nil { if err != nil {
return err return err
} }
meta, err := api.ObjectMetaFor(obj) accessor, err := meta.Accessor(obj)
if err != nil {
return err
}
for _, label := range remove { for _, label := range remove {
if _, ok := meta.Labels[label]; !ok { if _, ok := accessor.GetLabels()[label]; !ok {
fmt.Fprintf(out, "label %q not found.\n", label) fmt.Fprintf(out, "label %q not found.\n", label)
} }
} }

View File

@ -28,7 +28,6 @@ import (
"strings" "strings"
"time" "time"
"k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/api/errors" "k8s.io/kubernetes/pkg/api/errors"
"k8s.io/kubernetes/pkg/api/meta" "k8s.io/kubernetes/pkg/api/meta"
"k8s.io/kubernetes/pkg/api/unversioned" "k8s.io/kubernetes/pkg/api/unversioned"
@ -476,14 +475,16 @@ func GetRecordFlag(cmd *cobra.Command) bool {
// RecordChangeCause annotate change-cause to input runtime object. // RecordChangeCause annotate change-cause to input runtime object.
func RecordChangeCause(obj runtime.Object, changeCause string) error { func RecordChangeCause(obj runtime.Object, changeCause string) error {
meta, err := api.ObjectMetaFor(obj) accessor, err := meta.Accessor(obj)
if err != nil { if err != nil {
return err return err
} }
if meta.Annotations == nil { annotations := accessor.GetAnnotations()
meta.Annotations = make(map[string]string) if annotations == nil {
annotations = make(map[string]string)
} }
meta.Annotations[kubectl.ChangeCauseAnnotation] = changeCause annotations[kubectl.ChangeCauseAnnotation] = changeCause
accessor.SetAnnotations(annotations)
return nil return nil
} }

View File

@ -23,6 +23,7 @@ import (
"strconv" "strconv"
"k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/api/meta"
"k8s.io/kubernetes/pkg/api/unversioned" "k8s.io/kubernetes/pkg/api/unversioned"
"k8s.io/kubernetes/pkg/apis/extensions" "k8s.io/kubernetes/pkg/apis/extensions"
clientset "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset" clientset "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset"
@ -128,9 +129,9 @@ func PrintRolloutHistory(historyInfo HistoryInfo, resource, name string) (string
// getChangeCause returns the change-cause annotation of the input object // getChangeCause returns the change-cause annotation of the input object
func getChangeCause(obj runtime.Object) string { func getChangeCause(obj runtime.Object) string {
meta, err := api.ObjectMetaFor(obj) accessor, err := meta.Accessor(obj)
if err != nil { if err != nil {
return "" return ""
} }
return meta.Annotations[ChangeCauseAnnotation] return accessor.GetAnnotations()[ChangeCauseAnnotation]
} }

View File

@ -643,17 +643,17 @@ func (e *Etcd) calculateTTL(obj runtime.Object, defaultTTL int64, update bool) (
return ttl, err return ttl, err
} }
func exportObjectMeta(objMeta *api.ObjectMeta, exact bool) { func exportObjectMeta(accessor meta.Object, exact bool) {
objMeta.UID = "" accessor.SetUID("")
if !exact { if !exact {
objMeta.Namespace = "" accessor.SetNamespace("")
} }
objMeta.CreationTimestamp = unversioned.Time{} accessor.SetCreationTimestamp(unversioned.Time{})
objMeta.DeletionTimestamp = nil accessor.SetDeletionTimestamp(nil)
objMeta.ResourceVersion = "" accessor.SetResourceVersion("")
objMeta.SelfLink = "" accessor.SetSelfLink("")
if len(objMeta.GenerateName) > 0 && !exact { if len(accessor.GetGenerateName()) > 0 && !exact {
objMeta.Name = "" accessor.SetName("")
} }
} }
@ -663,8 +663,8 @@ func (e *Etcd) Export(ctx api.Context, name string, opts unversioned.ExportOptio
if err != nil { if err != nil {
return nil, err return nil, err
} }
if meta, err := api.ObjectMetaFor(obj); err == nil { if accessor, err := meta.Accessor(obj); err == nil {
exportObjectMeta(meta, opts.Exact) exportObjectMeta(accessor, opts.Exact)
} else { } else {
glog.V(4).Infof("Object of type %v does not have ObjectMeta: %v", reflect.TypeOf(obj), err) glog.V(4).Infof("Object of type %v does not have ObjectMeta: %v", reflect.TypeOf(obj), err)
} }

View File

@ -22,6 +22,7 @@ import (
"k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/api/errors" "k8s.io/kubernetes/pkg/api/errors"
"k8s.io/kubernetes/pkg/api/meta"
"k8s.io/kubernetes/pkg/api/rest/resttest" "k8s.io/kubernetes/pkg/api/rest/resttest"
"k8s.io/kubernetes/pkg/api/testapi" "k8s.io/kubernetes/pkg/api/testapi"
"k8s.io/kubernetes/pkg/fields" "k8s.io/kubernetes/pkg/fields"
@ -168,12 +169,12 @@ func getCodec(obj runtime.Object) (runtime.Codec, error) {
// Helper functions // Helper functions
func (t *Tester) getObject(ctx api.Context, obj runtime.Object) (runtime.Object, error) { func (t *Tester) getObject(ctx api.Context, obj runtime.Object) (runtime.Object, error) {
meta, err := api.ObjectMetaFor(obj) accessor, err := meta.Accessor(obj)
if err != nil { if err != nil {
return nil, err return nil, err
} }
result, err := t.storage.Get(ctx, meta.Name) result, err := t.storage.Get(ctx, accessor.GetName())
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -181,11 +182,11 @@ func (t *Tester) getObject(ctx api.Context, obj runtime.Object) (runtime.Object,
} }
func (t *Tester) setObject(ctx api.Context, obj runtime.Object) error { func (t *Tester) setObject(ctx api.Context, obj runtime.Object) error {
meta, err := api.ObjectMetaFor(obj) accessor, err := meta.Accessor(obj)
if err != nil { if err != nil {
return err return err
} }
key, err := t.storage.KeyFunc(ctx, meta.Name) key, err := t.storage.KeyFunc(ctx, accessor.GetName())
if err != nil { if err != nil {
return err return err
} }
@ -209,11 +210,11 @@ func (t *Tester) emitObject(obj runtime.Object, action string) error {
case etcdstorage.EtcdCreate: case etcdstorage.EtcdCreate:
err = t.setObject(ctx, obj) err = t.setObject(ctx, obj)
case etcdstorage.EtcdDelete: case etcdstorage.EtcdDelete:
meta, err := api.ObjectMetaFor(obj) accessor, err := meta.Accessor(obj)
if err != nil { if err != nil {
return err return err
} }
_, err = t.storage.Delete(ctx, meta.Name, nil) _, err = t.storage.Delete(ctx, accessor.GetName(), nil)
default: default:
err = fmt.Errorf("unexpected action: %v", action) err = fmt.Errorf("unexpected action: %v", action)
} }

View File

@ -21,6 +21,7 @@ import (
"time" "time"
"k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/api/meta"
"k8s.io/kubernetes/pkg/api/unversioned" "k8s.io/kubernetes/pkg/api/unversioned"
"k8s.io/kubernetes/pkg/runtime" "k8s.io/kubernetes/pkg/runtime"
"k8s.io/kubernetes/pkg/storage" "k8s.io/kubernetes/pkg/storage"
@ -32,18 +33,18 @@ type APIObjectVersioner struct{}
// UpdateObject implements Versioner // UpdateObject implements Versioner
func (a APIObjectVersioner) UpdateObject(obj runtime.Object, expiration *time.Time, resourceVersion uint64) error { func (a APIObjectVersioner) UpdateObject(obj runtime.Object, expiration *time.Time, resourceVersion uint64) error {
objectMeta, err := api.ObjectMetaFor(obj) accessor, err := meta.Accessor(obj)
if err != nil { if err != nil {
return err return err
} }
if expiration != nil { if expiration != nil {
objectMeta.DeletionTimestamp = &unversioned.Time{Time: *expiration} accessor.SetDeletionTimestamp(&unversioned.Time{Time: *expiration})
} }
versionString := "" versionString := ""
if resourceVersion != 0 { if resourceVersion != 0 {
versionString = strconv.FormatUint(resourceVersion, 10) versionString = strconv.FormatUint(resourceVersion, 10)
} }
objectMeta.ResourceVersion = versionString accessor.SetResourceVersion(versionString)
return nil return nil
} }
@ -63,11 +64,11 @@ func (a APIObjectVersioner) UpdateList(obj runtime.Object, resourceVersion uint6
// ObjectResourceVersion implements Versioner // ObjectResourceVersion implements Versioner
func (a APIObjectVersioner) ObjectResourceVersion(obj runtime.Object) (uint64, error) { func (a APIObjectVersioner) ObjectResourceVersion(obj runtime.Object) (uint64, error) {
meta, err := api.ObjectMetaFor(obj) accessor, err := meta.Accessor(obj)
if err != nil { if err != nil {
return 0, err return 0, err
} }
version := meta.ResourceVersion version := accessor.GetResourceVersion()
if len(version) == 0 { if len(version) == 0 {
return 0, nil return 0, nil
} }

View File

@ -30,6 +30,7 @@ import (
"k8s.io/kubernetes/pkg/admission" "k8s.io/kubernetes/pkg/admission"
"k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/api/errors" "k8s.io/kubernetes/pkg/api/errors"
"k8s.io/kubernetes/pkg/api/meta"
"k8s.io/kubernetes/pkg/client/cache" "k8s.io/kubernetes/pkg/client/cache"
"k8s.io/kubernetes/pkg/quota" "k8s.io/kubernetes/pkg/quota"
"k8s.io/kubernetes/pkg/quota/install" "k8s.io/kubernetes/pkg/quota/install"
@ -186,9 +187,9 @@ func (q *quotaAdmission) Admit(a admission.Attributes) (err error) {
// the resource represents a number of unique references to external // the resource represents a number of unique references to external
// resource. In such a case an evaluator needs to process other objects in // resource. In such a case an evaluator needs to process other objects in
// the same namespace which needs to be known. // the same namespace which needs to be known.
if om, err := api.ObjectMetaFor(inputObject); namespace != "" && err == nil { if accessor, err := meta.Accessor(inputObject); namespace != "" && err == nil {
if om.Namespace == "" { if accessor.GetNamespace() == "" {
om.Namespace = namespace accessor.SetNamespace(namespace)
} }
} }