Commit 08c2cba2 authored by Abhi Shah's avatar Abhi Shah

Merge pull request #18874 from ArtfulCoder/revert18442

Reverting 18442
parents cbcb3c04 6f638751
...@@ -78,7 +78,7 @@ func TestRESTMapper(t *testing.T) { ...@@ -78,7 +78,7 @@ func TestRESTMapper(t *testing.T) {
rcGVK := gv.WithKind("ReplicationController") rcGVK := gv.WithKind("ReplicationController")
podTemplateGVK := gv.WithKind("PodTemplate") podTemplateGVK := gv.WithKind("PodTemplate")
if gvk, err := latest.GroupOrDie(internal.GroupName).RESTMapper.KindFor(internal.SchemeGroupVersion.WithResource("replicationcontrollers")); err != nil || gvk != rcGVK { if gvk, err := latest.GroupOrDie(internal.GroupName).RESTMapper.KindFor("replicationcontrollers"); err != nil || gvk != rcGVK {
t.Errorf("unexpected version mapping: %v %v", gvk, err) t.Errorf("unexpected version mapping: %v %v", gvk, err)
} }
......
...@@ -158,23 +158,12 @@ type RESTMapping struct { ...@@ -158,23 +158,12 @@ type RESTMapping struct {
// TODO(caesarxuchao): Add proper multi-group support so that kinds & resources are // TODO(caesarxuchao): Add proper multi-group support so that kinds & resources are
// scoped to groups. See http://issues.k8s.io/12413 and http://issues.k8s.io/10009. // scoped to groups. See http://issues.k8s.io/12413 and http://issues.k8s.io/10009.
type RESTMapper interface { type RESTMapper interface {
// KindFor takes a partial resource and returns back the single match. Returns an error if there are multiple matches // KindFor takes a resource and returns back the unambiguous Kind (GroupVersionKind)
KindFor(resource unversioned.GroupVersionResource) (unversioned.GroupVersionKind, error) KindFor(resource string) (unversioned.GroupVersionKind, error)
// KindsFor takes a partial resource and returns back the list of potential kinds in priority order
KindsFor(resource unversioned.GroupVersionResource) ([]unversioned.GroupVersionKind, error)
// ResourceFor takes a partial resource and returns back the single match. Returns an error if there are multiple matches
ResourceFor(input unversioned.GroupVersionResource) (unversioned.GroupVersionResource, error)
// ResourcesFor takes a partial resource and returns back the list of potential resource in priority order
ResourcesFor(input unversioned.GroupVersionResource) ([]unversioned.GroupVersionResource, error)
RESTMapping(gk unversioned.GroupKind, versions ...string) (*RESTMapping, error) RESTMapping(gk unversioned.GroupKind, versions ...string) (*RESTMapping, error)
AliasesForResource(resource string) ([]string, bool) AliasesForResource(resource string) ([]string, bool)
ResourceSingularizer(resource string) (singular string, err error) ResourceSingularizer(resource string) (singular string, err error)
ResourceIsValid(resource string) bool
// ResourceIsValid takes a partial resource and returns back whether or not the resource matches at least one kind
ResourceIsValid(resource unversioned.GroupVersionResource) bool
} }
...@@ -29,10 +29,6 @@ type GroupResource struct { ...@@ -29,10 +29,6 @@ type GroupResource struct {
Resource string Resource string
} }
func (gr GroupResource) WithVersion(version string) GroupVersionResource {
return GroupVersionResource{Group: gr.Group, Version: version, Resource: gr.Resource}
}
func (gr GroupResource) IsEmpty() bool { func (gr GroupResource) IsEmpty() bool {
return len(gr.Group) == 0 && len(gr.Resource) == 0 return len(gr.Group) == 0 && len(gr.Resource) == 0
} }
......
...@@ -57,7 +57,7 @@ func TestRESTMapper(t *testing.T) { ...@@ -57,7 +57,7 @@ func TestRESTMapper(t *testing.T) {
gv := unversioned.GroupVersion{Group: componentconfig.GroupName, Version: "v1alpha1"} gv := unversioned.GroupVersion{Group: componentconfig.GroupName, Version: "v1alpha1"}
proxyGVK := gv.WithKind("KubeProxyConfiguration") proxyGVK := gv.WithKind("KubeProxyConfiguration")
if gvk, err := latest.GroupOrDie(componentconfig.GroupName).RESTMapper.KindFor(gv.WithResource("kubeproxyconfiguration")); err != nil || gvk != proxyGVK { if gvk, err := latest.GroupOrDie(componentconfig.GroupName).RESTMapper.KindFor("kubeproxyconfiguration"); err != nil || gvk != proxyGVK {
t.Errorf("unexpected version mapping: %v %v", gvk, err) t.Errorf("unexpected version mapping: %v %v", gvk, err)
} }
......
...@@ -80,7 +80,7 @@ func TestRESTMapper(t *testing.T) { ...@@ -80,7 +80,7 @@ func TestRESTMapper(t *testing.T) {
hpaGVK := gv.WithKind("HorizontalPodAutoscaler") hpaGVK := gv.WithKind("HorizontalPodAutoscaler")
daemonSetGVK := gv.WithKind("DaemonSet") daemonSetGVK := gv.WithKind("DaemonSet")
if gvk, err := latest.GroupOrDie(extensions.GroupName).RESTMapper.KindFor(gv.WithResource("horizontalpodautoscalers")); err != nil || gvk != hpaGVK { if gvk, err := latest.GroupOrDie(extensions.GroupName).RESTMapper.KindFor("horizontalpodautoscalers"); err != nil || gvk != hpaGVK {
t.Errorf("unexpected version mapping: %v %v", gvk, err) t.Errorf("unexpected version mapping: %v %v", gvk, err)
} }
......
...@@ -18,7 +18,6 @@ package unversioned ...@@ -18,7 +18,6 @@ package unversioned
import ( import (
"k8s.io/kubernetes/pkg/api/meta" "k8s.io/kubernetes/pkg/api/meta"
"k8s.io/kubernetes/pkg/api/unversioned"
"k8s.io/kubernetes/pkg/apis/extensions" "k8s.io/kubernetes/pkg/apis/extensions"
) )
...@@ -49,25 +48,17 @@ func newScales(c *ExtensionsClient, namespace string) *scales { ...@@ -49,25 +48,17 @@ func newScales(c *ExtensionsClient, namespace string) *scales {
// Get takes the reference to scale subresource and returns the subresource or error, if one occurs. // Get takes the reference to scale subresource and returns the subresource or error, if one occurs.
func (c *scales) Get(kind string, name string) (result *extensions.Scale, err error) { func (c *scales) Get(kind string, name string) (result *extensions.Scale, err error) {
result = &extensions.Scale{} result = &extensions.Scale{}
resource, _ := meta.KindToResource(kind, false)
// TODO this method needs to take a proper unambiguous kind err = c.client.Get().Namespace(c.ns).Resource(resource).Name(name).SubResource("scale").Do().Into(result)
fullyQualifiedKind := unversioned.GroupVersionKind{Kind: kind}
resource, _ := meta.KindToResource(fullyQualifiedKind, false)
err = c.client.Get().Namespace(c.ns).Resource(resource.Resource).Name(name).SubResource("scale").Do().Into(result)
return return
} }
func (c *scales) Update(kind string, scale *extensions.Scale) (result *extensions.Scale, err error) { func (c *scales) Update(kind string, scale *extensions.Scale) (result *extensions.Scale, err error) {
result = &extensions.Scale{} result = &extensions.Scale{}
resource, _ := meta.KindToResource(kind, false)
// TODO this method needs to take a proper unambiguous kind
fullyQualifiedKind := unversioned.GroupVersionKind{Kind: kind}
resource, _ := meta.KindToResource(fullyQualifiedKind, false)
err = c.client.Put(). err = c.client.Put().
Namespace(scale.Namespace). Namespace(scale.Namespace).
Resource(resource.Resource). Resource(resource).
Name(scale.Name). Name(scale.Name).
SubResource("scale"). SubResource("scale").
Body(scale). Body(scale).
......
...@@ -59,7 +59,7 @@ type ObjectScheme interface { ...@@ -59,7 +59,7 @@ type ObjectScheme interface {
func ObjectReaction(o ObjectRetriever, mapper meta.RESTMapper) ReactionFunc { func ObjectReaction(o ObjectRetriever, mapper meta.RESTMapper) ReactionFunc {
return func(action Action) (bool, runtime.Object, error) { return func(action Action) (bool, runtime.Object, error) {
kind, err := mapper.KindFor(unversioned.GroupVersionResource{Resource: action.GetResource()}) gvk, err := mapper.KindFor(action.GetResource())
if err != nil { if err != nil {
return false, nil, fmt.Errorf("unrecognized action %s: %v", action.GetResource(), err) return false, nil, fmt.Errorf("unrecognized action %s: %v", action.GetResource(), err)
} }
...@@ -67,16 +67,16 @@ func ObjectReaction(o ObjectRetriever, mapper meta.RESTMapper) ReactionFunc { ...@@ -67,16 +67,16 @@ func ObjectReaction(o ObjectRetriever, mapper meta.RESTMapper) ReactionFunc {
// TODO: have mapper return a Kind for a subresource? // TODO: have mapper return a Kind for a subresource?
switch castAction := action.(type) { switch castAction := action.(type) {
case ListAction: case ListAction:
kind.Kind += "List" gvk.Kind += "List"
resource, err := o.Kind(kind, "") resource, err := o.Kind(gvk, "")
return true, resource, err return true, resource, err
case GetAction: case GetAction:
resource, err := o.Kind(kind, castAction.GetName()) resource, err := o.Kind(gvk, castAction.GetName())
return true, resource, err return true, resource, err
case DeleteAction: case DeleteAction:
resource, err := o.Kind(kind, castAction.GetName()) resource, err := o.Kind(gvk, castAction.GetName())
return true, resource, err return true, resource, err
case CreateAction: case CreateAction:
...@@ -84,7 +84,7 @@ func ObjectReaction(o ObjectRetriever, mapper meta.RESTMapper) ReactionFunc { ...@@ -84,7 +84,7 @@ func ObjectReaction(o ObjectRetriever, mapper meta.RESTMapper) ReactionFunc {
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(gvk, meta.Name)
return true, resource, err return true, resource, err
case UpdateAction: case UpdateAction:
...@@ -92,7 +92,7 @@ func ObjectReaction(o ObjectRetriever, mapper meta.RESTMapper) ReactionFunc { ...@@ -92,7 +92,7 @@ func ObjectReaction(o ObjectRetriever, mapper meta.RESTMapper) ReactionFunc {
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(gvk, meta.Name)
return true, resource, err return true, resource, err
default: default:
......
...@@ -84,7 +84,7 @@ func RunExplain(f *cmdutil.Factory, out io.Writer, cmd *cobra.Command, args []st ...@@ -84,7 +84,7 @@ func RunExplain(f *cmdutil.Factory, out io.Writer, cmd *cobra.Command, args []st
} }
// TODO: We should deduce the group for a resource by discovering the supported resources at server. // TODO: We should deduce the group for a resource by discovering the supported resources at server.
gvk, err := mapper.KindFor(unversioned.GroupVersionResource{Resource: inModel}) gvk, err := mapper.KindFor(inModel)
if err != nil { if err != nil {
return err return err
} }
......
...@@ -360,12 +360,12 @@ func RunRollingUpdate(f *cmdutil.Factory, out io.Writer, cmd *cobra.Command, arg ...@@ -360,12 +360,12 @@ func RunRollingUpdate(f *cmdutil.Factory, out io.Writer, cmd *cobra.Command, arg
if outputFormat != "" { if outputFormat != "" {
return f.PrintObject(cmd, newRc, out) return f.PrintObject(cmd, newRc, out)
} }
kind, err := api.Scheme.ObjectKind(newRc) gvk, err := api.Scheme.ObjectKind(newRc)
if err != nil { if err != nil {
return err return err
} }
_, res := meta.KindToResource(kind, false) _, res := meta.KindToResource(gvk.Kind, false)
cmdutil.PrintSuccess(mapper, false, out, res.Resource, oldName, message) cmdutil.PrintSuccess(mapper, false, out, res, oldName, message)
return nil return nil
} }
......
...@@ -175,12 +175,16 @@ func NewFactory(optionalClientConfig clientcmd.ClientConfig) *Factory { ...@@ -175,12 +175,16 @@ func NewFactory(optionalClientConfig clientcmd.ClientConfig) *Factory {
return clients.ClientConfigForVersion(nil) return clients.ClientConfigForVersion(nil)
}, },
RESTClient: func(mapping *meta.RESTMapping) (resource.RESTClient, error) { RESTClient: func(mapping *meta.RESTMapping) (resource.RESTClient, error) {
gvk, err := api.RESTMapper.KindFor(mapping.Resource)
if err != nil {
return nil, err
}
mappingVersion := mapping.GroupVersionKind.GroupVersion() mappingVersion := mapping.GroupVersionKind.GroupVersion()
client, err := clients.ClientForVersion(&mappingVersion) client, err := clients.ClientForVersion(&mappingVersion)
if err != nil { if err != nil {
return nil, err return nil, err
} }
switch mapping.GroupVersionKind.Group { switch gvk.Group {
case api.GroupName: case api.GroupName:
return client.RESTClient, nil return client.RESTClient, nil
case extensions.GroupName: case extensions.GroupName:
......
...@@ -44,7 +44,7 @@ func GetSwaggerSchema(version unversioned.GroupVersion, kubeClient client.Interf ...@@ -44,7 +44,7 @@ func GetSwaggerSchema(version unversioned.GroupVersion, kubeClient client.Interf
// SplitAndParseResourceRequest separates the users input into a model and fields // SplitAndParseResourceRequest separates the users input into a model and fields
func SplitAndParseResourceRequest(inResource string, mapper meta.RESTMapper) (string, []string, error) { func SplitAndParseResourceRequest(inResource string, mapper meta.RESTMapper) (string, []string, error) {
inResource, fieldsPath := splitDotNotation(inResource) inResource, fieldsPath := splitDotNotation(inResource)
inResource, _ = mapper.ResourceSingularizer(expandResourceShortcut(unversioned.GroupVersionResource{Resource: inResource}).Resource) inResource, _ = mapper.ResourceSingularizer(expandResourceShortcut(inResource))
return inResource, fieldsPath, nil return inResource, fieldsPath, nil
} }
......
...@@ -23,7 +23,6 @@ import ( ...@@ -23,7 +23,6 @@ import (
"k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/api/meta" "k8s.io/kubernetes/pkg/api/meta"
"k8s.io/kubernetes/pkg/api/unversioned" "k8s.io/kubernetes/pkg/api/unversioned"
"k8s.io/kubernetes/pkg/apis/extensions"
) )
const kubectlAnnotationPrefix = "kubectl.kubernetes.io/" const kubectlAnnotationPrefix = "kubectl.kubernetes.io/"
...@@ -81,40 +80,40 @@ var _ meta.RESTMapper = &ShortcutExpander{} ...@@ -81,40 +80,40 @@ var _ meta.RESTMapper = &ShortcutExpander{}
// KindFor implements meta.RESTMapper. It expands the resource first, then invokes the wrapped // KindFor implements meta.RESTMapper. It expands the resource first, then invokes the wrapped
// mapper. // mapper.
func (e ShortcutExpander) KindFor(resource unversioned.GroupVersionResource) (unversioned.GroupVersionKind, error) { func (e ShortcutExpander) KindFor(resource string) (unversioned.GroupVersionKind, error) {
resource = expandResourceShortcut(resource) resource = expandResourceShortcut(resource)
return e.RESTMapper.KindFor(resource) return e.RESTMapper.KindFor(resource)
} }
// ResourceIsValid takes a string (kind) and checks if it's a valid resource. // ResourceIsValid takes a string (kind) and checks if it's a valid resource.
// It expands the resource first, then invokes the wrapped mapper. // It expands the resource first, then invokes the wrapped mapper.
func (e ShortcutExpander) ResourceIsValid(resource unversioned.GroupVersionResource) bool { func (e ShortcutExpander) ResourceIsValid(resource string) bool {
return e.RESTMapper.ResourceIsValid(expandResourceShortcut(resource)) return e.RESTMapper.ResourceIsValid(expandResourceShortcut(resource))
} }
// expandResourceShortcut will return the expanded version of resource // expandResourceShortcut will return the expanded version of resource
// (something that a pkg/api/meta.RESTMapper can understand), if it is // (something that a pkg/api/meta.RESTMapper can understand), if it is
// indeed a shortcut. Otherwise, will return resource unmodified. // indeed a shortcut. Otherwise, will return resource unmodified.
func expandResourceShortcut(resource unversioned.GroupVersionResource) unversioned.GroupVersionResource { func expandResourceShortcut(resource string) string {
shortForms := map[string]unversioned.GroupVersionResource{ shortForms := map[string]string{
// Please keep this alphabetized // Please keep this alphabetized
"cs": api.SchemeGroupVersion.WithResource("componentstatuses"), "cs": "componentstatuses",
"ds": extensions.SchemeGroupVersion.WithResource("daemonsets"), "ds": "daemonsets",
"ep": api.SchemeGroupVersion.WithResource("endpoints"), "ep": "endpoints",
"ev": api.SchemeGroupVersion.WithResource("events"), "ev": "events",
"hpa": extensions.SchemeGroupVersion.WithResource("horizontalpodautoscalers"), "hpa": "horizontalpodautoscalers",
"ing": extensions.SchemeGroupVersion.WithResource("ingresses"), "ing": "ingresses",
"limits": api.SchemeGroupVersion.WithResource("limitranges"), "limits": "limitranges",
"no": api.SchemeGroupVersion.WithResource("nodes"), "no": "nodes",
"ns": api.SchemeGroupVersion.WithResource("namespaces"), "ns": "namespaces",
"po": api.SchemeGroupVersion.WithResource("pods"), "po": "pods",
"pvc": api.SchemeGroupVersion.WithResource("persistentvolumeclaims"), "pvc": "persistentvolumeclaims",
"pv": api.SchemeGroupVersion.WithResource("persistentvolumes"), "pv": "persistentvolumes",
"quota": api.SchemeGroupVersion.WithResource("resourcequotas"), "quota": "resourcequotas",
"rc": api.SchemeGroupVersion.WithResource("replicationcontrollers"), "rc": "replicationcontrollers",
"svc": api.SchemeGroupVersion.WithResource("services"), "svc": "services",
} }
if expanded, ok := shortForms[resource.Resource]; ok { if expanded, ok := shortForms[resource]; ok {
return expanded return expanded
} }
return resource return resource
......
...@@ -25,7 +25,6 @@ import ( ...@@ -25,7 +25,6 @@ import (
"k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/api/meta" "k8s.io/kubernetes/pkg/api/meta"
"k8s.io/kubernetes/pkg/api/unversioned"
"k8s.io/kubernetes/pkg/api/validation" "k8s.io/kubernetes/pkg/api/validation"
"k8s.io/kubernetes/pkg/labels" "k8s.io/kubernetes/pkg/labels"
"k8s.io/kubernetes/pkg/runtime" "k8s.io/kubernetes/pkg/runtime"
...@@ -427,7 +426,7 @@ func (b *Builder) resourceMappings() ([]*meta.RESTMapping, error) { ...@@ -427,7 +426,7 @@ func (b *Builder) resourceMappings() ([]*meta.RESTMapping, error) {
} }
mappings := []*meta.RESTMapping{} mappings := []*meta.RESTMapping{}
for _, r := range b.resources { for _, r := range b.resources {
gvk, err := b.mapper.KindFor(unversioned.GroupVersionResource{Resource: r}) gvk, err := b.mapper.KindFor(r)
if err != nil { if err != nil {
return nil, err return nil, err
} }
...@@ -447,7 +446,7 @@ func (b *Builder) resourceTupleMappings() (map[string]*meta.RESTMapping, error) ...@@ -447,7 +446,7 @@ func (b *Builder) resourceTupleMappings() (map[string]*meta.RESTMapping, error)
if _, ok := mappings[r.Resource]; ok { if _, ok := mappings[r.Resource]; ok {
continue continue
} }
gvk, err := b.mapper.KindFor(unversioned.GroupVersionResource{Resource: r.Resource}) gvk, err := b.mapper.KindFor(r.Resource)
if err != nil { if err != nil {
return nil, err return nil, err
} }
......
...@@ -203,24 +203,11 @@ type NamePrinter struct { ...@@ -203,24 +203,11 @@ type NamePrinter struct {
// and print "resource/name" pair. If the object is a List, print all items in it. // and print "resource/name" pair. If the object is a List, print all items in it.
func (p *NamePrinter) PrintObj(obj runtime.Object, w io.Writer) error { func (p *NamePrinter) PrintObj(obj runtime.Object, w io.Writer) error {
objvalue := reflect.ValueOf(obj).Elem() objvalue := reflect.ValueOf(obj).Elem()
kindString := objvalue.FieldByName("Kind") kind := objvalue.FieldByName("Kind")
groupVersionString := objvalue.FieldByName("APIVersion") if !kind.IsValid() {
kind := unversioned.GroupVersionKind{} kind = reflect.ValueOf("<unknown>")
if !kindString.IsValid() {
kindString = reflect.ValueOf("<unknown>")
} }
kind.Kind = kindString.String() if kind.String() == "List" {
if !groupVersionString.IsValid() {
groupVersionString = reflect.ValueOf("<unknown>/<unknown>")
}
gv, err := unversioned.ParseGroupVersion(groupVersionString.String())
if err != nil {
kind.Group = gv.Group
kind.Version = gv.Version
}
if kind.Kind == "List" {
items := objvalue.FieldByName("Items") items := objvalue.FieldByName("Items")
if items.Type().String() == "[]runtime.RawExtension" { if items.Type().String() == "[]runtime.RawExtension" {
for i := 0; i < items.Len(); i++ { for i := 0; i < items.Len(); i++ {
...@@ -250,9 +237,9 @@ func (p *NamePrinter) PrintObj(obj runtime.Object, w io.Writer) error { ...@@ -250,9 +237,9 @@ func (p *NamePrinter) PrintObj(obj runtime.Object, w io.Writer) error {
if !name.IsValid() { if !name.IsValid() {
name = reflect.ValueOf("<unknown>") name = reflect.ValueOf("<unknown>")
} }
_, resource := meta.KindToResource(kind, false) _, resource := meta.KindToResource(kind.String(), false)
fmt.Fprintf(w, "%s/%s\n", resource.Resource, name) fmt.Fprintf(w, "%s/%s\n", resource, name)
} }
return nil return nil
......
...@@ -41,55 +41,14 @@ type thirdPartyResourceDataMapper struct { ...@@ -41,55 +41,14 @@ type thirdPartyResourceDataMapper struct {
var _ meta.RESTMapper = &thirdPartyResourceDataMapper{} var _ meta.RESTMapper = &thirdPartyResourceDataMapper{}
func (t *thirdPartyResourceDataMapper) getResource() unversioned.GroupVersionResource { func (t *thirdPartyResourceDataMapper) isThirdPartyResource(resource string) bool {
plural, _ := meta.KindToResource(t.getKind(), false) plural, _ := meta.KindToResource(t.kind, false)
return resource == plural
return plural
}
func (t *thirdPartyResourceDataMapper) getKind() unversioned.GroupVersionKind {
return unversioned.GroupVersionKind{Group: t.group, Version: t.version, Kind: t.kind}
}
func (t *thirdPartyResourceDataMapper) isThirdPartyResource(partialResource unversioned.GroupVersionResource) bool {
actualResource := t.getResource()
if strings.ToLower(partialResource.Resource) != strings.ToLower(actualResource.Resource) {
return false
}
if len(partialResource.Group) != 0 && partialResource.Group != actualResource.Group {
return false
}
if len(partialResource.Version) != 0 && partialResource.Version != actualResource.Version {
return false
}
return true
}
func (t *thirdPartyResourceDataMapper) ResourcesFor(resource unversioned.GroupVersionResource) ([]unversioned.GroupVersionResource, error) {
if t.isThirdPartyResource(resource) {
return []unversioned.GroupVersionResource{t.getResource()}, nil
}
return t.mapper.ResourcesFor(resource)
}
func (t *thirdPartyResourceDataMapper) KindsFor(resource unversioned.GroupVersionResource) ([]unversioned.GroupVersionKind, error) {
if t.isThirdPartyResource(resource) {
return []unversioned.GroupVersionKind{t.getKind()}, nil
}
return t.mapper.KindsFor(resource)
}
func (t *thirdPartyResourceDataMapper) ResourceFor(resource unversioned.GroupVersionResource) (unversioned.GroupVersionResource, error) {
if t.isThirdPartyResource(resource) {
return t.getResource(), nil
}
return t.mapper.ResourceFor(resource)
} }
func (t *thirdPartyResourceDataMapper) KindFor(resource unversioned.GroupVersionResource) (unversioned.GroupVersionKind, error) { func (t *thirdPartyResourceDataMapper) KindFor(resource string) (unversioned.GroupVersionKind, error) {
if t.isThirdPartyResource(resource) { if t.isThirdPartyResource(resource) {
return t.getKind(), nil return unversioned.GroupVersionKind{Group: t.group, Version: t.version, Kind: t.kind}, nil
} }
return t.mapper.KindFor(resource) return t.mapper.KindFor(resource)
} }
...@@ -127,7 +86,8 @@ func (t *thirdPartyResourceDataMapper) ResourceSingularizer(resource string) (si ...@@ -127,7 +86,8 @@ func (t *thirdPartyResourceDataMapper) ResourceSingularizer(resource string) (si
return t.mapper.ResourceSingularizer(resource) return t.mapper.ResourceSingularizer(resource)
} }
func (t *thirdPartyResourceDataMapper) ResourceIsValid(resource unversioned.GroupVersionResource) bool { // ResourceIsValid takes a string (kind) and checks if it's a valid resource
func (t *thirdPartyResourceDataMapper) ResourceIsValid(resource string) bool {
return t.isThirdPartyResource(resource) || t.mapper.ResourceIsValid(resource) return t.isThirdPartyResource(resource) || t.mapper.ResourceIsValid(resource)
} }
......
...@@ -212,9 +212,9 @@ func TestResourceIsValid(t *testing.T) { ...@@ -212,9 +212,9 @@ func TestResourceIsValid(t *testing.T) {
for _, test := range tests { for _, test := range tests {
mapper := &thirdPartyResourceDataMapper{kind: test.kind} mapper := &thirdPartyResourceDataMapper{kind: test.kind}
mapper.mapper = api.RESTMapper mapper.mapper = api.RESTMapper
valid := mapper.ResourceIsValid(unversioned.GroupVersionResource{Resource: test.resource}) valid := mapper.ResourceIsValid(test.resource)
if valid != test.valid { if valid != test.valid {
t.Errorf("%s: expected: %v, actual: %v", test.name, test.valid, valid) t.Errorf("expected: %v, saw: %v for %s", test.valid, valid, test.name)
} }
} }
} }
...@@ -45,11 +45,11 @@ type provision struct { ...@@ -45,11 +45,11 @@ type provision struct {
} }
func (p *provision) Admit(a admission.Attributes) (err error) { func (p *provision) Admit(a admission.Attributes) (err error) {
kind, err := api.RESTMapper.KindFor(a.GetResource().WithVersion("")) gvk, err := api.RESTMapper.KindFor(a.GetResource().Resource)
if err != nil { if err != nil {
return admission.NewForbidden(a, err) return admission.NewForbidden(a, err)
} }
mapping, err := api.RESTMapper.RESTMapping(kind.GroupKind(), kind.Version) mapping, err := api.RESTMapper.RESTMapping(gvk.GroupKind(), gvk.Version)
if err != nil { if err != nil {
return admission.NewForbidden(a, err) return admission.NewForbidden(a, err)
} }
......
...@@ -46,11 +46,11 @@ type exists struct { ...@@ -46,11 +46,11 @@ type exists struct {
} }
func (e *exists) Admit(a admission.Attributes) (err error) { func (e *exists) Admit(a admission.Attributes) (err error) {
kind, err := api.RESTMapper.KindFor(a.GetResource().WithVersion("")) gvk, err := api.RESTMapper.KindFor(a.GetResource().Resource)
if err != nil { if err != nil {
return errors.NewInternalError(err) return errors.NewInternalError(err)
} }
mapping, err := api.RESTMapper.RESTMapping(kind.GroupKind(), kind.Version) mapping, err := api.RESTMapper.RESTMapping(gvk.GroupKind(), gvk.Version)
if err != nil { if err != nil {
return errors.NewInternalError(err) return errors.NewInternalError(err)
} }
......
...@@ -48,16 +48,17 @@ type lifecycle struct { ...@@ -48,16 +48,17 @@ type lifecycle struct {
} }
func (l *lifecycle) Admit(a admission.Attributes) (err error) { func (l *lifecycle) Admit(a admission.Attributes) (err error) {
// prevent deletion of immortal namespaces // prevent deletion of immortal namespaces
if a.GetOperation() == admission.Delete && a.GetKind() == api.Kind("Namespace") && l.immortalNamespaces.Has(a.GetName()) { if a.GetOperation() == admission.Delete && a.GetKind() == api.Kind("Namespace") && l.immortalNamespaces.Has(a.GetName()) {
return errors.NewForbidden(a.GetResource(), a.GetName(), fmt.Errorf("this namespace may not be deleted")) return errors.NewForbidden(a.GetResource(), a.GetName(), fmt.Errorf("this namespace may not be deleted"))
} }
kind, err := api.RESTMapper.KindFor(a.GetResource().WithVersion("")) gvk, err := api.RESTMapper.KindFor(a.GetResource().Resource)
if err != nil { if err != nil {
return errors.NewInternalError(err) return errors.NewInternalError(err)
} }
mapping, err := api.RESTMapper.RESTMapping(kind.GroupKind(), kind.Version) mapping, err := api.RESTMapper.RESTMapping(gvk.GroupKind(), gvk.Version)
if err != nil { if err != nil {
return errors.NewInternalError(err) return errors.NewInternalError(err)
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment