mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-26 05:03:09 +00:00
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:
commit
f5c93c8ddc
@ -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
|
||||||
|
@ -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 }
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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:
|
||||||
|
@ -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:
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
}
|
}
|
||||||
|
@ -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) {
|
||||||
|
@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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]
|
||||||
}
|
}
|
||||||
|
@ -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)
|
||||||
}
|
}
|
||||||
|
@ -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)
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
}
|
}
|
||||||
|
@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user