Merge pull request #63335 from deads2k/api-15-mappingtype

Automatic merge from submit-queue. If you want to cherry-pick this change to another branch, please follow the instructions <a href="https://github.com/kubernetes/community/blob/master/contributors/devel/cherry-picks.md">here</a>.

update restmapping to indicate fully qualified resource

The resource of a restmapping is logically fully qualified and we have that value when we construct it.  Update the return value so that callers don't have to synthentically create one.

@kubernetes/sig-api-machinery-pr-reviews 

```release-note
NONE
```
This commit is contained in:
Kubernetes Submit Queue 2018-05-01 18:54:00 -07:00 committed by GitHub
commit a30f459160
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
26 changed files with 82 additions and 87 deletions

View File

@ -48,7 +48,7 @@ func (gc *GarbageCollector) apiResource(apiVersion, kind string) (*metav1.APIRes
} }
glog.V(5).Infof("map kind %s, version %s to resource %s", kind, apiVersion, mapping.Resource) glog.V(5).Infof("map kind %s, version %s to resource %s", kind, apiVersion, mapping.Resource)
resource := metav1.APIResource{ resource := metav1.APIResource{
Name: mapping.Resource, Name: mapping.Resource.Resource,
Namespaced: mapping.Scope == meta.RESTScopeNamespace, Namespaced: mapping.Scope == meta.RESTScopeNamespace,
Kind: kind, Kind: kind,
} }

View File

@ -620,7 +620,7 @@ func (a *HorizontalController) shouldScale(hpa *autoscalingv2.HorizontalPodAutos
func (a *HorizontalController) scaleForResourceMappings(namespace, name string, mappings []*apimeta.RESTMapping) (*autoscalingv1.Scale, schema.GroupResource, error) { func (a *HorizontalController) scaleForResourceMappings(namespace, name string, mappings []*apimeta.RESTMapping) (*autoscalingv1.Scale, schema.GroupResource, error) {
var firstErr error var firstErr error
for i, mapping := range mappings { for i, mapping := range mappings {
targetGR := mapping.GroupVersionKind.GroupVersion().WithResource(mapping.Resource).GroupResource() targetGR := mapping.Resource.GroupResource()
scale, err := a.scaleNamespacer.Scales(namespace).Get(targetGR, name) scale, err := a.scaleNamespacer.Scales(namespace).Get(targetGR, name)
if err == nil { if err == nil {
return scale, targetGR, nil return scale, targetGR, nil

View File

@ -523,7 +523,7 @@ func (tc *testCase) prepareTestClient(t *testing.T) (*fake.Clientset, *metricsfa
t.Logf("unable to get mapping for %s: %v", gk.String(), err) t.Logf("unable to get mapping for %s: %v", gk.String(), err)
continue continue
} }
groupResource := schema.GroupResource{Group: mapping.GroupVersionKind.Group, Resource: mapping.Resource} groupResource := mapping.Resource.GroupResource()
if getForAction.GetResource().Resource == groupResource.String() { if getForAction.GetResource().Resource == groupResource.String() {
matchedTarget = &tc.metricsTarget[i] matchedTarget = &tc.metricsTarget[i]

View File

@ -161,7 +161,7 @@ func (tc *restClientTestCase) prepareTestClient(t *testing.T) (*metricsfake.Clie
if err != nil { if err != nil {
return true, nil, fmt.Errorf("unable to get mapping for %s: %v", gk.String(), err) return true, nil, fmt.Errorf("unable to get mapping for %s: %v", gk.String(), err)
} }
groupResource := schema.GroupResource{Group: mapping.GroupVersionKind.Group, Resource: mapping.Resource} groupResource := mapping.Resource.GroupResource()
assert.Equal(t, groupResource.String(), getForAction.GetResource().Resource, "should have requested metrics for the resource matching the GroupKind passed in") assert.Equal(t, groupResource.String(), getForAction.GetResource().Resource, "should have requested metrics for the resource matching the GroupKind passed in")
assert.Equal(t, tc.singleObject.Name, name, "should have requested metrics for the object matching the name passed in") assert.Equal(t, tc.singleObject.Name, name, "should have requested metrics for the object matching the name passed in")

View File

@ -230,7 +230,7 @@ func (tc *replicaCalcTestCase) prepareTestClient(t *testing.T) (*fake.Clientset,
if err != nil { if err != nil {
return true, nil, fmt.Errorf("unable to get mapping for %s: %v", gk.String(), err) return true, nil, fmt.Errorf("unable to get mapping for %s: %v", gk.String(), err)
} }
groupResource := schema.GroupResource{Group: mapping.GroupVersionKind.Group, Resource: mapping.Resource} groupResource := mapping.Resource.GroupResource()
assert.Equal(t, groupResource.String(), getForAction.GetResource().Resource, "should have requested metrics for the resource matching the GroupKind passed in") assert.Equal(t, groupResource.String(), getForAction.GetResource().Resource, "should have requested metrics for the resource matching the GroupKind passed in")
assert.Equal(t, tc.metric.singleObject.Name, name, "should have requested metrics for the object matching the name passed in") assert.Equal(t, tc.metric.singleObject.Name, name, "should have requested metrics for the object matching the name passed in")

View File

@ -42,6 +42,7 @@ import (
restclient "k8s.io/client-go/rest" restclient "k8s.io/client-go/rest"
"k8s.io/kubernetes/pkg/kubectl/genericclioptions" "k8s.io/kubernetes/pkg/kubectl/genericclioptions"
"k8s.io/apimachinery/pkg/runtime/schema"
"k8s.io/kubernetes/pkg/api/legacyscheme" "k8s.io/kubernetes/pkg/api/legacyscheme"
"k8s.io/kubernetes/pkg/kubectl" "k8s.io/kubernetes/pkg/kubectl"
"k8s.io/kubernetes/pkg/kubectl/cmd/templates" "k8s.io/kubernetes/pkg/kubectl/cmd/templates"
@ -302,7 +303,7 @@ func (o *DrainOptions) Complete(f cmdutil.Factory, cmd *cobra.Command, args []st
if err != nil { if err != nil {
return err return err
} }
if info.Mapping.Resource != "nodes" { if info.Mapping.Resource.GroupResource() != (schema.GroupResource{Group: "", Resource: "nodes"}) {
return fmt.Errorf("error: expected resource of type node, got %q", info.Mapping.Resource) return fmt.Errorf("error: expected resource of type node, got %q", info.Mapping.Resource)
} }

View File

@ -109,7 +109,7 @@ func RunHistory(f cmdutil.Factory, cmd *cobra.Command, out io.Writer, args []str
return err return err
} }
header := fmt.Sprintf("%s %q", mapping.Resource, info.Name) header := fmt.Sprintf("%s %q", mapping.Resource.Resource, info.Name)
if revision > 0 { if revision > 0 {
header = fmt.Sprintf("%s with revision #%d", header, revision) header = fmt.Sprintf("%s with revision #%d", header, revision)
} }

View File

@ -146,7 +146,11 @@ func (o PauseConfig) RunPause() error {
for _, patch := range set.CalculatePatches(o.Infos, cmdutil.InternalVersionJSONEncoder(), o.Pauser) { for _, patch := range set.CalculatePatches(o.Infos, cmdutil.InternalVersionJSONEncoder(), o.Pauser) {
info := patch.Info info := patch.Info
if patch.Err != nil { if patch.Err != nil {
allErrs = append(allErrs, fmt.Errorf("error: %s %q %v", info.Mapping.Resource, info.Name, patch.Err)) resourceString := info.Mapping.Resource.Resource
if len(info.Mapping.Resource.Group) > 0 {
resourceString = resourceString + "." + info.Mapping.Resource.Group
}
allErrs = append(allErrs, fmt.Errorf("error: %s %q %v", resourceString, info.Name, patch.Err))
continue continue
} }

View File

@ -151,7 +151,11 @@ func (o ResumeConfig) RunResume() error {
info := patch.Info info := patch.Info
if patch.Err != nil { if patch.Err != nil {
allErrs = append(allErrs, fmt.Errorf("error: %s %q %v", info.Mapping.Resource, info.Name, patch.Err)) resourceString := info.Mapping.Resource.Resource
if len(info.Mapping.Resource.Group) > 0 {
resourceString = resourceString + "." + info.Mapping.Resource.Group
}
allErrs = append(allErrs, fmt.Errorf("error: %s %q %v", resourceString, info.Name, patch.Err))
continue continue
} }

View File

@ -461,7 +461,7 @@ func (o *RunOptions) removeCreatedObjects(f cmdutil.Factory, createdObjects []*R
Internal(legacyscheme.Scheme). Internal(legacyscheme.Scheme).
ContinueOnError(). ContinueOnError().
NamespaceParam(namespace).DefaultNamespace(). NamespaceParam(namespace).DefaultNamespace().
ResourceNames(obj.Mapping.Resource, name). ResourceNames(obj.Mapping.Resource.Resource+"."+obj.Mapping.Resource.Group, name).
Flatten(). Flatten().
Do() Do()
// Note: we pass in "true" for the "quiet" parameter because // Note: we pass in "true" for the "quiet" parameter because

View File

@ -24,6 +24,7 @@ import (
"github.com/spf13/cobra" "github.com/spf13/cobra"
"k8s.io/apimachinery/pkg/api/meta" "k8s.io/apimachinery/pkg/api/meta"
"k8s.io/apimachinery/pkg/runtime/schema"
"k8s.io/apimachinery/pkg/types" "k8s.io/apimachinery/pkg/types"
"k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset" "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset"
batchclient "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/batch/internalversion" batchclient "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/batch/internalversion"
@ -225,7 +226,7 @@ func (o *ScaleOptions) RunScale() error {
} }
mapping := info.ResourceMapping() mapping := info.ResourceMapping()
if mapping.Resource == "jobs" { if mapping.Resource.GroupResource() == (schema.GroupResource{Group: "batch", Resource: "jobs"}) {
// go down the legacy jobs path. This can be removed in 3.14 For now, contain it. // go down the legacy jobs path. This can be removed in 3.14 For now, contain it.
fmt.Fprintf(o.ErrOut, "%s scale job is DEPRECATED and will be removed in a future version.\n", o.parent) fmt.Fprintf(o.ErrOut, "%s scale job is DEPRECATED and will be removed in a future version.\n", o.parent)
@ -234,8 +235,7 @@ func (o *ScaleOptions) RunScale() error {
} }
} else { } else {
gvk := mapping.GroupVersionKind.GroupVersion().WithResource(mapping.Resource) if err := o.scaler.Scale(info.Namespace, info.Name, uint(o.Replicas), precondition, retry, waitForReplicas, mapping.Resource.GroupResource()); err != nil {
if err := o.scaler.Scale(info.Namespace, info.Name, uint(o.Replicas), precondition, retry, waitForReplicas, gvk.GroupResource()); err != nil {
return err return err
} }
} }

View File

@ -738,11 +738,16 @@ type editResults struct {
} }
func (r *editResults) addError(err error, info *resource.Info) string { func (r *editResults) addError(err error, info *resource.Info) string {
resourceString := info.Mapping.Resource.Resource
if len(info.Mapping.Resource.Group) > 0 {
resourceString = resourceString + "." + info.Mapping.Resource.Group
}
switch { switch {
case apierrors.IsInvalid(err): case apierrors.IsInvalid(err):
r.edit = append(r.edit, info) r.edit = append(r.edit, info)
reason := editReason{ reason := editReason{
head: fmt.Sprintf("%s %q was not valid", info.Mapping.Resource, info.Name), head: fmt.Sprintf("%s %q was not valid", resourceString, info.Name),
} }
if err, ok := err.(apierrors.APIStatus); ok { if err, ok := err.(apierrors.APIStatus); ok {
if details := err.Status().Details; details != nil { if details := err.Status().Details; details != nil {
@ -752,13 +757,13 @@ func (r *editResults) addError(err error, info *resource.Info) string {
} }
} }
r.header.reasons = append(r.header.reasons, reason) r.header.reasons = append(r.header.reasons, reason)
return fmt.Sprintf("error: %s %q is invalid", info.Mapping.Resource, info.Name) return fmt.Sprintf("error: %s %q is invalid", resourceString, info.Name)
case apierrors.IsNotFound(err): case apierrors.IsNotFound(err):
r.notfound++ r.notfound++
return fmt.Sprintf("error: %s %q could not be found on the server", info.Mapping.Resource, info.Name) return fmt.Sprintf("error: %s %q could not be found on the server", resourceString, info.Name)
default: default:
r.retryable++ r.retryable++
return fmt.Sprintf("error: %s %q could not be patched: %v", info.Mapping.Resource, info.Name, err) return fmt.Sprintf("error: %s %q could not be patched: %v", resourceString, info.Name, err)
} }
} }

View File

@ -576,31 +576,6 @@ func ParsePairs(pairArgs []string, pairType string, supportRemove bool) (newPair
return return
} }
// MustPrintWithKinds determines if printer is dealing
// with multiple resource kinds, in which case it will
// return true, indicating resource kind will be
// included as part of printer output
func MustPrintWithKinds(objs []runtime.Object, infos []*resource.Info, sorter *kubectl.RuntimeSort) bool {
var lastMap *meta.RESTMapping
for ix := range objs {
var mapping *meta.RESTMapping
if sorter != nil {
mapping = infos[sorter.OriginalPosition(ix)].Mapping
} else {
mapping = infos[ix].Mapping
}
// display "kind" only if we have mixed resources
if lastMap != nil && mapping.Resource != lastMap.Resource {
return true
}
lastMap = mapping
}
return false
}
// IsSiblingCommandExists receives a pointer to a cobra command and a target string. // IsSiblingCommandExists receives a pointer to a cobra command and a target string.
// Returns true if the target string is found in the list of sibling commands. // Returns true if the target string is found in the list of sibling commands.
func IsSiblingCommandExists(cmd *cobra.Command, targetCmdName string) bool { func IsSiblingCommandExists(cmd *cobra.Command, targetCmdName string) bool {

View File

@ -697,7 +697,7 @@ func (b *Builder) resourceMappings() ([]*meta.RESTMapping, error) {
func (b *Builder) resourceTupleMappings() (map[string]*meta.RESTMapping, error) { func (b *Builder) resourceTupleMappings() (map[string]*meta.RESTMapping, error) {
mappings := make(map[string]*meta.RESTMapping) mappings := make(map[string]*meta.RESTMapping)
canonical := make(map[string]struct{}) canonical := make(map[schema.GroupVersionResource]struct{})
for _, r := range b.resourceTuples { for _, r := range b.resourceTuples {
if _, ok := mappings[r.Resource]; ok { if _, ok := mappings[r.Resource]; ok {
continue continue
@ -707,7 +707,6 @@ func (b *Builder) resourceTupleMappings() (map[string]*meta.RESTMapping, error)
return nil, err return nil, err
} }
mappings[mapping.Resource] = mapping
mappings[r.Resource] = mapping mappings[r.Resource] = mapping
canonical[mapping.Resource] = struct{}{} canonical[mapping.Resource] = struct{}{}
} }
@ -829,7 +828,7 @@ func (b *Builder) visitByResource() *Result {
} }
clients := make(map[string]RESTClient) clients := make(map[string]RESTClient)
for _, mapping := range mappings { for _, mapping := range mappings {
s := fmt.Sprintf("%s/%s", mapping.GroupVersionKind.GroupVersion().String(), mapping.Resource) s := fmt.Sprintf("%s/%s", mapping.GroupVersionKind.GroupVersion().String(), mapping.Resource.Resource)
if _, ok := clients[s]; ok { if _, ok := clients[s]; ok {
continue continue
} }
@ -848,7 +847,7 @@ func (b *Builder) visitByResource() *Result {
if !ok { if !ok {
return result.withError(fmt.Errorf("resource %q is not recognized: %v", tuple.Resource, mappings)) return result.withError(fmt.Errorf("resource %q is not recognized: %v", tuple.Resource, mappings))
} }
s := fmt.Sprintf("%s/%s", mapping.GroupVersionKind.GroupVersion().String(), mapping.Resource) s := fmt.Sprintf("%s/%s", mapping.GroupVersionKind.GroupVersion().String(), mapping.Resource.Resource)
client, ok := clients[s] client, ok := clients[s]
if !ok { if !ok {
return result.withError(fmt.Errorf("could not find a client for resource %q", tuple.Resource)) return result.withError(fmt.Errorf("could not find a client for resource %q", tuple.Resource))

View File

@ -594,7 +594,7 @@ func TestResourceByName(t *testing.T) {
if err != nil { if err != nil {
t.Fatalf("unexpected error: %v", err) t.Fatalf("unexpected error: %v", err)
} }
if mapping.Resource != "pods" { if mapping.Resource != (schema.GroupVersionResource{Group: "", Version: "v1", Resource: "pods"}) {
t.Errorf("unexpected resource mapping: %#v", mapping) t.Errorf("unexpected resource mapping: %#v", mapping)
} }
} }
@ -726,7 +726,7 @@ func TestResourceByNameWithoutRequireObject(t *testing.T) {
if err != nil { if err != nil {
t.Fatalf("unexpected error: %v", err) t.Fatalf("unexpected error: %v", err)
} }
if mapping.GroupVersionKind.Kind != "Pod" || mapping.Resource != "pods" { if mapping.GroupVersionKind.Kind != "Pod" || mapping.Resource != (schema.GroupVersionResource{Group: "", Version: "v1", Resource: "pods"}) {
t.Errorf("unexpected resource mapping: %#v", mapping) t.Errorf("unexpected resource mapping: %#v", mapping)
} }
} }
@ -753,7 +753,7 @@ func TestResourceByNameAndEmptySelector(t *testing.T) {
if err != nil { if err != nil {
t.Fatalf("unexpected error: %v", err) t.Fatalf("unexpected error: %v", err)
} }
if mapping.Resource != "pods" { if mapping.Resource != (schema.GroupVersionResource{Group: "", Version: "v1", Resource: "pods"}) {
t.Errorf("unexpected resource mapping: %#v", mapping) t.Errorf("unexpected resource mapping: %#v", mapping)
} }
} }
@ -1124,7 +1124,7 @@ func TestListObject(t *testing.T) {
if err != nil { if err != nil {
t.Fatalf("unexpected error: %v", err) t.Fatalf("unexpected error: %v", err)
} }
if mapping.Resource != "pods" { if mapping.Resource != (schema.GroupVersionResource{Group: "", Version: "v1", Resource: "pods"}) {
t.Errorf("unexpected resource mapping: %#v", mapping) t.Errorf("unexpected resource mapping: %#v", mapping)
} }
} }

View File

@ -43,7 +43,7 @@ type Helper struct {
// NewHelper creates a Helper from a ResourceMapping // NewHelper creates a Helper from a ResourceMapping
func NewHelper(client RESTClient, mapping *meta.RESTMapping) *Helper { func NewHelper(client RESTClient, mapping *meta.RESTMapping) *Helper {
return &Helper{ return &Helper{
Resource: mapping.Resource, Resource: mapping.Resource.Resource,
RESTClient: client, RESTClient: client,
NamespaceScoped: mapping.Scope.Name() == meta.RESTScopeNameNamespace, NamespaceScoped: mapping.Scope.Name() == meta.RESTScopeNameNamespace,
} }

View File

@ -24,6 +24,7 @@ import (
"k8s.io/apimachinery/pkg/api/meta" "k8s.io/apimachinery/pkg/api/meta"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/runtime/schema"
utilerrors "k8s.io/apimachinery/pkg/util/errors" utilerrors "k8s.io/apimachinery/pkg/util/errors"
"k8s.io/apimachinery/pkg/util/sets" "k8s.io/apimachinery/pkg/util/sets"
"k8s.io/apimachinery/pkg/watch" "k8s.io/apimachinery/pkg/watch"
@ -196,7 +197,7 @@ func (r *Result) ResourceMapping() (*meta.RESTMapping, error) {
if r.err != nil { if r.err != nil {
return nil, r.err return nil, r.err
} }
mappings := map[string]*meta.RESTMapping{} mappings := map[schema.GroupVersionResource]*meta.RESTMapping{}
for i := range r.sources { for i := range r.sources {
m, ok := r.sources[i].(ResourceMapping) m, ok := r.sources[i].(ResourceMapping)
if !ok { if !ok {

View File

@ -158,7 +158,7 @@ func (i *Info) Refresh(obj runtime.Object, ignoreError bool) error {
func (i *Info) String() string { func (i *Info) String() string {
basicInfo := fmt.Sprintf("Name: %q, Namespace: %q\nObject: %+q", i.Name, i.Namespace, i.Object) basicInfo := fmt.Sprintf("Name: %q, Namespace: %q\nObject: %+q", i.Name, i.Namespace, i.Object)
if i.Mapping != nil { if i.Mapping != nil {
mappingInfo := fmt.Sprintf("Resource: %q, GroupVersionKind: %q", i.Mapping.Resource, mappingInfo := fmt.Sprintf("Resource: %q, GroupVersionKind: %q", i.Mapping.Resource.String(),
i.Mapping.GroupVersionKind.String()) i.Mapping.GroupVersionKind.String())
return fmt.Sprint(mappingInfo, "\n", basicInfo) return fmt.Sprint(mappingInfo, "\n", basicInfo)
} }

View File

@ -204,7 +204,7 @@ type genericDescriber struct {
func (g *genericDescriber) Describe(namespace, name string, describerSettings printers.DescriberSettings) (output string, err error) { func (g *genericDescriber) Describe(namespace, name string, describerSettings printers.DescriberSettings) (output string, err error) {
apiResource := &metav1.APIResource{ apiResource := &metav1.APIResource{
Name: g.mapping.Resource, Name: g.mapping.Resource.Resource,
Namespaced: g.mapping.Scope.Name() == meta.RESTScopeNameNamespace, Namespaced: g.mapping.Scope.Name() == meta.RESTScopeNameNamespace,
Kind: g.mapping.GroupVersionKind.Kind, Kind: g.mapping.GroupVersionKind.Kind,
} }

View File

@ -186,9 +186,9 @@ func (a *gcPermissionsEnforcement) ownerRefToDeleteAttributeRecords(ref metav1.O
Verb: "update", Verb: "update",
// ownerReference can only refer to an object in the same namespace, so attributes.GetNamespace() equals to the owner's namespace // ownerReference can only refer to an object in the same namespace, so attributes.GetNamespace() equals to the owner's namespace
Namespace: attributes.GetNamespace(), Namespace: attributes.GetNamespace(),
APIGroup: groupVersion.Group, APIGroup: mapping.Resource.Group,
APIVersion: groupVersion.Version, APIVersion: mapping.Resource.Version,
Resource: mapping.Resource, Resource: mapping.Resource.Resource,
Subresource: "finalizers", Subresource: "finalizers",
Name: ref.Name, Name: ref.Name,
ResourceRequest: true, ResourceRequest: true,

View File

@ -91,9 +91,10 @@ type RESTScope interface {
// RESTMapping contains the information needed to deal with objects of a specific // RESTMapping contains the information needed to deal with objects of a specific
// resource and kind in a RESTful manner. // resource and kind in a RESTful manner.
type RESTMapping struct { type RESTMapping struct {
// Resource is a string representing the name of this resource as a REST client would see it // Resource is the GroupVersionResource (location) for this endpoint
Resource string Resource schema.GroupVersionResource
// GroupVersionKind is the GroupVersionKind (data format) to submit to this endpoint
GroupVersionKind schema.GroupVersionKind GroupVersionKind schema.GroupVersionKind
// Scope contains the information needed to deal with REST Resources that are in a resource hierarchy // Scope contains the information needed to deal with REST Resources that are in a resource hierarchy

View File

@ -505,7 +505,7 @@ func (m *DefaultRESTMapper) RESTMappings(gk schema.GroupKind, versions ...string
} }
mappings = append(mappings, &RESTMapping{ mappings = append(mappings, &RESTMapping{
Resource: res.Resource, Resource: res,
GroupVersionKind: gvk, GroupVersionKind: gvk,
Scope: scope, Scope: scope,
}) })

View File

@ -527,7 +527,7 @@ func TestRESTMapperRESTMapping(t *testing.T) {
APIGroupVersions []schema.GroupVersion APIGroupVersions []schema.GroupVersion
DefaultVersions []schema.GroupVersion DefaultVersions []schema.GroupVersion
Resource string Resource schema.GroupVersionResource
ExpectedGroupVersion *schema.GroupVersion ExpectedGroupVersion *schema.GroupVersion
Err bool Err bool
}{ }{
@ -536,14 +536,14 @@ func TestRESTMapperRESTMapping(t *testing.T) {
{DefaultVersions: []schema.GroupVersion{testGroupVersion}, Kind: "Unknown", Err: true}, {DefaultVersions: []schema.GroupVersion{testGroupVersion}, Kind: "Unknown", Err: true},
{DefaultVersions: []schema.GroupVersion{testGroupVersion}, Kind: "InternalObject", APIGroupVersions: []schema.GroupVersion{{Group: testGroup, Version: "test"}}, Resource: "internalobjects"}, {DefaultVersions: []schema.GroupVersion{testGroupVersion}, Kind: "InternalObject", APIGroupVersions: []schema.GroupVersion{{Group: testGroup, Version: "test"}}, Resource: testGroupVersion.WithResource("internalobjects")},
{DefaultVersions: []schema.GroupVersion{testGroupVersion}, Kind: "InternalObject", APIGroupVersions: []schema.GroupVersion{{Group: testGroup, Version: "test"}}, Resource: "internalobjects"}, {DefaultVersions: []schema.GroupVersion{testGroupVersion}, Kind: "InternalObject", APIGroupVersions: []schema.GroupVersion{{Group: testGroup, Version: "test"}}, Resource: testGroupVersion.WithResource("internalobjects")},
{DefaultVersions: []schema.GroupVersion{testGroupVersion}, Kind: "InternalObject", APIGroupVersions: []schema.GroupVersion{{Group: testGroup, Version: "test"}}, Resource: "internalobjects"}, {DefaultVersions: []schema.GroupVersion{testGroupVersion}, Kind: "InternalObject", APIGroupVersions: []schema.GroupVersion{{Group: testGroup, Version: "test"}}, Resource: testGroupVersion.WithResource("internalobjects")},
{DefaultVersions: []schema.GroupVersion{testGroupVersion}, Kind: "InternalObject", APIGroupVersions: []schema.GroupVersion{}, Resource: "internalobjects", ExpectedGroupVersion: &schema.GroupVersion{Group: testGroup, Version: "test"}}, {DefaultVersions: []schema.GroupVersion{testGroupVersion}, Kind: "InternalObject", APIGroupVersions: []schema.GroupVersion{}, Resource: internalGroupVersion.WithResource("internalobjects"), ExpectedGroupVersion: &schema.GroupVersion{Group: testGroup, Version: "test"}},
{DefaultVersions: []schema.GroupVersion{testGroupVersion}, Kind: "InternalObject", APIGroupVersions: []schema.GroupVersion{{Group: testGroup, Version: "test"}}, Resource: "internalobjects"}, {DefaultVersions: []schema.GroupVersion{testGroupVersion}, Kind: "InternalObject", APIGroupVersions: []schema.GroupVersion{{Group: testGroup, Version: "test"}}, Resource: testGroupVersion.WithResource("internalobjects")},
// TODO: add test for a resource that exists in one version but not another // TODO: add test for a resource that exists in one version but not another
} }
@ -596,7 +596,7 @@ func TestRESTMapperRESTMappingSelectsVersion(t *testing.T) {
if err != nil { if err != nil {
t.Fatalf("unexpected error: %v", err) t.Fatalf("unexpected error: %v", err)
} }
if mapping.Resource != "otherobjects" || mapping.GroupVersionKind.GroupVersion() != expectedGroupVersion2 { if mapping.Resource != expectedGroupVersion2.WithResource("otherobjects") || mapping.GroupVersionKind.GroupVersion() != expectedGroupVersion2 {
t.Errorf("unexpected mapping: %#v", mapping) t.Errorf("unexpected mapping: %#v", mapping)
} }
@ -604,7 +604,7 @@ func TestRESTMapperRESTMappingSelectsVersion(t *testing.T) {
if err != nil { if err != nil {
t.Fatalf("unexpected error: %v", err) t.Fatalf("unexpected error: %v", err)
} }
if mapping.Resource != "internalobjects" || mapping.GroupVersionKind.GroupVersion() != expectedGroupVersion1 { if mapping.Resource != expectedGroupVersion1.WithResource("internalobjects") || mapping.GroupVersionKind.GroupVersion() != expectedGroupVersion1 {
t.Errorf("unexpected mapping: %#v", mapping) t.Errorf("unexpected mapping: %#v", mapping)
} }
@ -634,7 +634,7 @@ func TestRESTMapperRESTMappingSelectsVersion(t *testing.T) {
if err != nil { if err != nil {
t.Fatalf("unexpected error: %v", err) t.Fatalf("unexpected error: %v", err)
} }
if mapping.Resource != "otherobjects" || mapping.GroupVersionKind.GroupVersion() != expectedGroupVersion2 { if mapping.Resource != expectedGroupVersion2.WithResource("otherobjects") || mapping.GroupVersionKind.GroupVersion() != expectedGroupVersion2 {
t.Errorf("unexpected mapping: %#v", mapping) t.Errorf("unexpected mapping: %#v", mapping)
} }
} }
@ -666,7 +666,7 @@ func TestRESTMapperRESTMappings(t *testing.T) {
Kind: "InternalObject", Kind: "InternalObject",
APIGroupVersions: []schema.GroupVersion{{Group: testGroup, Version: "v2"}}, APIGroupVersions: []schema.GroupVersion{{Group: testGroup, Version: "v2"}},
AddGroupVersionKind: []schema.GroupVersionKind{schema.GroupVersion{Group: testGroup, Version: "v2"}.WithKind("InternalObject")}, AddGroupVersionKind: []schema.GroupVersionKind{schema.GroupVersion{Group: testGroup, Version: "v2"}.WithKind("InternalObject")},
ExpectedRESTMappings: []*RESTMapping{{Resource: "internalobjects", GroupVersionKind: schema.GroupVersionKind{Group: testGroup, Version: "v2", Kind: "InternalObject"}}}, ExpectedRESTMappings: []*RESTMapping{{Resource: schema.GroupVersionResource{Group: testGroup, Version: "v2", Resource: "internalobjects"}, GroupVersionKind: schema.GroupVersionKind{Group: testGroup, Version: "v2", Kind: "InternalObject"}}},
}, },
// ask for specific versions - only one available - check ExpectedRESTMappings // ask for specific versions - only one available - check ExpectedRESTMappings
@ -675,15 +675,24 @@ func TestRESTMapperRESTMappings(t *testing.T) {
Kind: "InternalObject", Kind: "InternalObject",
APIGroupVersions: []schema.GroupVersion{{Group: testGroup, Version: "v3"}, {Group: testGroup, Version: "v2"}}, APIGroupVersions: []schema.GroupVersion{{Group: testGroup, Version: "v3"}, {Group: testGroup, Version: "v2"}},
AddGroupVersionKind: []schema.GroupVersionKind{schema.GroupVersion{Group: testGroup, Version: "v2"}.WithKind("InternalObject")}, AddGroupVersionKind: []schema.GroupVersionKind{schema.GroupVersion{Group: testGroup, Version: "v2"}.WithKind("InternalObject")},
ExpectedRESTMappings: []*RESTMapping{{Resource: "internalobjects", GroupVersionKind: schema.GroupVersionKind{Group: testGroup, Version: "v2", Kind: "InternalObject"}}}, ExpectedRESTMappings: []*RESTMapping{{Resource: schema.GroupVersionResource{Group: testGroup, Version: "v2", Resource: "internalobjects"}, GroupVersionKind: schema.GroupVersionKind{Group: testGroup, Version: "v2", Kind: "InternalObject"}}},
}, },
// do not ask for specific version - search through default versions - check ExpectedRESTMappings // do not ask for specific version - search through default versions - check ExpectedRESTMappings
{ {
DefaultVersions: []schema.GroupVersion{testGroupVersion, {Group: testGroup, Version: "v2"}}, DefaultVersions: []schema.GroupVersion{testGroupVersion, {Group: testGroup, Version: "v2"}},
Kind: "InternalObject", Kind: "InternalObject",
AddGroupVersionKind: []schema.GroupVersionKind{schema.GroupVersion{Group: testGroup, Version: "v1"}.WithKind("InternalObject"), schema.GroupVersion{Group: testGroup, Version: "v2"}.WithKind("InternalObject")}, AddGroupVersionKind: []schema.GroupVersionKind{schema.GroupVersion{Group: testGroup, Version: "v1"}.WithKind("InternalObject"), schema.GroupVersion{Group: testGroup, Version: "v2"}.WithKind("InternalObject")},
ExpectedRESTMappings: []*RESTMapping{{Resource: "internalobjects", GroupVersionKind: schema.GroupVersionKind{Group: testGroup, Version: "v1", Kind: "InternalObject"}}, {Resource: "internalobjects", GroupVersionKind: schema.GroupVersionKind{Group: testGroup, Version: "v2", Kind: "InternalObject"}}}, ExpectedRESTMappings: []*RESTMapping{
{
Resource: schema.GroupVersionResource{Group: testGroup, Version: "v1", Resource: "internalobjects"},
GroupVersionKind: schema.GroupVersionKind{Group: testGroup, Version: "v1", Kind: "InternalObject"},
},
{
Resource: schema.GroupVersionResource{Group: testGroup, Version: "v2", Resource: "internalobjects"},
GroupVersionKind: schema.GroupVersionKind{Group: testGroup, Version: "v2", Kind: "InternalObject"},
},
},
}, },
} }

View File

@ -104,11 +104,8 @@ func (c *customMetricsClient) qualResourceForKind(groupKind schema.GroupKind) (s
return "", fmt.Errorf("unable to map kind %s to resource: %v", groupKind.String(), err) return "", fmt.Errorf("unable to map kind %s to resource: %v", groupKind.String(), err)
} }
groupResource := schema.GroupResource{ gr := mapping.Resource.GroupResource()
Group: mapping.GroupVersionKind.Group, return gr.String(), nil
Resource: mapping.Resource,
}
return groupResource.String(), nil
} }
type rootScopedMetrics struct { type rootScopedMetrics struct {

View File

@ -177,7 +177,7 @@ func TestServerSidePrint(t *testing.T) {
if mapping.Scope.Name() == meta.RESTScopeNameNamespace { if mapping.Scope.Name() == meta.RESTScopeNameNamespace {
req = req.Namespace(ns.Name) req = req.Namespace(ns.Name)
} }
body, err := req.Resource(mapping.Resource).SetHeader("Accept", tableParam).Do().Raw() body, err := req.Resource(mapping.Resource.Resource).SetHeader("Accept", tableParam).Do().Raw()
if err != nil { if err != nil {
t.Errorf("unexpected error getting %s: %v", gvk, err) t.Errorf("unexpected error getting %s: %v", gvk, err)
continue continue

View File

@ -588,10 +588,9 @@ func TestEtcdStoragePath(t *testing.T) {
continue continue
} }
gvResource := gvk.GroupVersion().WithResource(mapping.Resource) etcdSeen[mapping.Resource] = empty{}
etcdSeen[gvResource] = empty{}
testData, hasTest := etcdStorageData[gvResource] testData, hasTest := etcdStorageData[mapping.Resource]
if !hasTest { if !hasTest {
t.Errorf("no test data for %s from %s. Please add a test for your new type to etcdStorageData.", kind, pkgPath) t.Errorf("no test data for %s from %s. Please add a test for your new type to etcdStorageData.", kind, pkgPath)
@ -659,7 +658,7 @@ func TestEtcdStoragePath(t *testing.T) {
} }
addGVKToEtcdBucket(cohabitatingResources, actualGVK, getEtcdBucket(testData.expectedEtcdPath)) addGVKToEtcdBucket(cohabitatingResources, actualGVK, getEtcdBucket(testData.expectedEtcdPath))
pathSeen[testData.expectedEtcdPath] = append(pathSeen[testData.expectedEtcdPath], gvResource) pathSeen[testData.expectedEtcdPath] = append(pathSeen[testData.expectedEtcdPath], mapping.Resource)
}() }()
} }
@ -955,7 +954,7 @@ func (c *allClient) create(stub, ns string, mapping *meta.RESTMapping, all *[]cl
return err return err
} }
namespaced := mapping.Scope.Name() == meta.RESTScopeNameNamespace namespaced := mapping.Scope.Name() == meta.RESTScopeNameNamespace
output, err := req.NamespaceIfScoped(ns, namespaced).Resource(mapping.Resource).Body(strings.NewReader(stub)).Do().Get() output, err := req.NamespaceIfScoped(ns, namespaced).Resource(mapping.Resource.Resource).Body(strings.NewReader(stub)).Do().Get()
if err != nil { if err != nil {
return err return err
} }
@ -977,7 +976,7 @@ func (c *allClient) destroy(obj runtime.Object, mapping *meta.RESTMapping) error
if err != nil { if err != nil {
return err return err
} }
return req.NamespaceIfScoped(ns, namespaced).Resource(mapping.Resource).Name(name).Do().Error() return req.NamespaceIfScoped(ns, namespaced).Resource(mapping.Resource.Resource).Name(name).Do().Error()
} }
func (c *allClient) cleanup(all *[]cleanupData) error { func (c *allClient) cleanup(all *[]cleanupData) error {