Unverified Commit a30f4591 authored by Kubernetes Submit Queue's avatar Kubernetes Submit Queue Committed by GitHub

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 ```
parents 62b58e62 9a480667
...@@ -48,7 +48,7 @@ func (gc *GarbageCollector) apiResource(apiVersion, kind string) (*metav1.APIRes ...@@ -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,
} }
......
...@@ -620,7 +620,7 @@ func (a *HorizontalController) shouldScale(hpa *autoscalingv2.HorizontalPodAutos ...@@ -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
......
...@@ -523,7 +523,7 @@ func (tc *testCase) prepareTestClient(t *testing.T) (*fake.Clientset, *metricsfa ...@@ -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]
......
...@@ -161,7 +161,7 @@ func (tc *restClientTestCase) prepareTestClient(t *testing.T) (*metricsfake.Clie ...@@ -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")
......
...@@ -230,7 +230,7 @@ func (tc *replicaCalcTestCase) prepareTestClient(t *testing.T) (*fake.Clientset, ...@@ -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")
......
...@@ -42,6 +42,7 @@ import ( ...@@ -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 ...@@ -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)
} }
......
...@@ -109,7 +109,7 @@ func RunHistory(f cmdutil.Factory, cmd *cobra.Command, out io.Writer, args []str ...@@ -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)
} }
......
...@@ -146,7 +146,11 @@ func (o PauseConfig) RunPause() error { ...@@ -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
} }
......
...@@ -151,7 +151,11 @@ func (o ResumeConfig) RunResume() error { ...@@ -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
} }
......
...@@ -461,7 +461,7 @@ func (o *RunOptions) removeCreatedObjects(f cmdutil.Factory, createdObjects []*R ...@@ -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
......
...@@ -24,6 +24,7 @@ import ( ...@@ -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 { ...@@ -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 { ...@@ -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
} }
} }
......
...@@ -738,11 +738,16 @@ type editResults struct { ...@@ -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 { ...@@ -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)
} }
} }
......
...@@ -576,31 +576,6 @@ func ParsePairs(pairArgs []string, pairType string, supportRemove bool) (newPair ...@@ -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 {
......
...@@ -697,7 +697,7 @@ func (b *Builder) resourceMappings() ([]*meta.RESTMapping, error) { ...@@ -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) ...@@ -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 { ...@@ -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 { ...@@ -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))
......
...@@ -594,7 +594,7 @@ func TestResourceByName(t *testing.T) { ...@@ -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) { ...@@ -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) { ...@@ -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) { ...@@ -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)
} }
} }
......
...@@ -43,7 +43,7 @@ type Helper struct { ...@@ -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,
} }
......
...@@ -24,6 +24,7 @@ import ( ...@@ -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) { ...@@ -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 {
......
...@@ -158,7 +158,7 @@ func (i *Info) Refresh(obj runtime.Object, ignoreError bool) error { ...@@ -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)
} }
......
...@@ -204,7 +204,7 @@ type genericDescriber struct { ...@@ -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,
} }
......
...@@ -186,9 +186,9 @@ func (a *gcPermissionsEnforcement) ownerRefToDeleteAttributeRecords(ref metav1.O ...@@ -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,
......
...@@ -91,9 +91,10 @@ type RESTScope interface { ...@@ -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
......
...@@ -505,7 +505,7 @@ func (m *DefaultRESTMapper) RESTMappings(gk schema.GroupKind, versions ...string ...@@ -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,
}) })
......
...@@ -527,7 +527,7 @@ func TestRESTMapperRESTMapping(t *testing.T) { ...@@ -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) { ...@@ -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) { ...@@ -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) { ...@@ -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) { ...@@ -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) { ...@@ -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) { ...@@ -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"},
},
},
}, },
} }
......
...@@ -104,11 +104,8 @@ func (c *customMetricsClient) qualResourceForKind(groupKind schema.GroupKind) (s ...@@ -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 {
......
...@@ -177,7 +177,7 @@ func TestServerSidePrint(t *testing.T) { ...@@ -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
......
...@@ -588,10 +588,9 @@ func TestEtcdStoragePath(t *testing.T) { ...@@ -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) { ...@@ -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 ...@@ -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 ...@@ -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 {
......
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