k8s.io/client-go@v0.22.2/restmapper/shortcut_test.go (about)

     1  /*
     2  Copyright 2016 The Kubernetes Authors.
     3  
     4  Licensed under the Apache License, Version 2.0 (the "License");
     5  you may not use this file except in compliance with the License.
     6  You may obtain a copy of the License at
     7  
     8      http://www.apache.org/licenses/LICENSE-2.0
     9  
    10  Unless required by applicable law or agreed to in writing, software
    11  distributed under the License is distributed on an "AS IS" BASIS,
    12  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    13  See the License for the specific language governing permissions and
    14  limitations under the License.
    15  */
    16  
    17  package restmapper
    18  
    19  import (
    20  	"testing"
    21  
    22  	openapi_v2 "github.com/googleapis/gnostic/openapiv2"
    23  
    24  	"k8s.io/apimachinery/pkg/api/errors"
    25  	"k8s.io/apimachinery/pkg/api/meta"
    26  	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
    27  	"k8s.io/apimachinery/pkg/runtime/schema"
    28  	"k8s.io/apimachinery/pkg/version"
    29  	"k8s.io/client-go/discovery"
    30  	restclient "k8s.io/client-go/rest"
    31  	"k8s.io/client-go/rest/fake"
    32  )
    33  
    34  func TestReplaceAliases(t *testing.T) {
    35  	tests := []struct {
    36  		name     string
    37  		arg      string
    38  		expected schema.GroupVersionResource
    39  		srvRes   []*metav1.APIResourceList
    40  	}{
    41  		{
    42  			name:     "storageclasses-no-replacement",
    43  			arg:      "storageclasses",
    44  			expected: schema.GroupVersionResource{Resource: "storageclasses"},
    45  			srvRes:   []*metav1.APIResourceList{},
    46  		},
    47  		{
    48  			name:     "hpa-priority",
    49  			arg:      "hpa",
    50  			expected: schema.GroupVersionResource{Resource: "superhorizontalpodautoscalers", Group: "autoscaling"},
    51  			srvRes: []*metav1.APIResourceList{
    52  				{
    53  					GroupVersion: "autoscaling/v1",
    54  					APIResources: []metav1.APIResource{
    55  						{
    56  							Name:       "superhorizontalpodautoscalers",
    57  							ShortNames: []string{"hpa"},
    58  						},
    59  					},
    60  				},
    61  				{
    62  					GroupVersion: "autoscaling/v1",
    63  					APIResources: []metav1.APIResource{
    64  						{
    65  							Name:       "horizontalpodautoscalers",
    66  							ShortNames: []string{"hpa"},
    67  						},
    68  					},
    69  				},
    70  			},
    71  		},
    72  		{
    73  			name:     "resource-override",
    74  			arg:      "dpl",
    75  			expected: schema.GroupVersionResource{Resource: "deployments", Group: "foo"},
    76  			srvRes: []*metav1.APIResourceList{
    77  				{
    78  					GroupVersion: "foo/v1",
    79  					APIResources: []metav1.APIResource{
    80  						{
    81  							Name:       "deployments",
    82  							ShortNames: []string{"dpl"},
    83  						},
    84  					},
    85  				},
    86  				{
    87  					GroupVersion: "extension/v1beta1",
    88  					APIResources: []metav1.APIResource{
    89  						{
    90  							Name:       "deployments",
    91  							ShortNames: []string{"deploy"},
    92  						},
    93  					},
    94  				},
    95  			},
    96  		},
    97  		{
    98  			name:     "resource-match-preferred",
    99  			arg:      "pods",
   100  			expected: schema.GroupVersionResource{Resource: "pods", Group: ""},
   101  			srvRes: []*metav1.APIResourceList{
   102  				{
   103  					GroupVersion: "v1",
   104  					APIResources: []metav1.APIResource{{Name: "pods", SingularName: "pod"}},
   105  				},
   106  				{
   107  					GroupVersion: "acme.com/v1",
   108  					APIResources: []metav1.APIResource{{Name: "poddlers", ShortNames: []string{"pods", "pod"}}},
   109  				},
   110  			},
   111  		},
   112  		{
   113  			name:     "resource-match-singular-preferred",
   114  			arg:      "pod",
   115  			expected: schema.GroupVersionResource{Resource: "pod", Group: ""},
   116  			srvRes: []*metav1.APIResourceList{
   117  				{
   118  					GroupVersion: "v1",
   119  					APIResources: []metav1.APIResource{{Name: "pods", SingularName: "pod"}},
   120  				},
   121  				{
   122  					GroupVersion: "acme.com/v1",
   123  					APIResources: []metav1.APIResource{{Name: "poddlers", ShortNames: []string{"pods", "pod"}}},
   124  				},
   125  			},
   126  		},
   127  	}
   128  
   129  	for _, test := range tests {
   130  		ds := &fakeDiscoveryClient{}
   131  		ds.serverResourcesHandler = func() ([]*metav1.APIResourceList, error) {
   132  			return test.srvRes, nil
   133  		}
   134  		mapper := NewShortcutExpander(&fakeRESTMapper{}, ds).(shortcutExpander)
   135  
   136  		actual := mapper.expandResourceShortcut(schema.GroupVersionResource{Resource: test.arg})
   137  		if actual != test.expected {
   138  			t.Errorf("%s: unexpected argument: expected %s, got %s", test.name, test.expected, actual)
   139  		}
   140  	}
   141  }
   142  
   143  func TestKindFor(t *testing.T) {
   144  	tests := []struct {
   145  		in       schema.GroupVersionResource
   146  		expected schema.GroupVersionResource
   147  		srvRes   []*metav1.APIResourceList
   148  	}{
   149  		{
   150  			in:       schema.GroupVersionResource{Group: "storage.k8s.io", Version: "", Resource: "sc"},
   151  			expected: schema.GroupVersionResource{Group: "storage.k8s.io", Version: "", Resource: "storageclasses"},
   152  			srvRes: []*metav1.APIResourceList{
   153  				{
   154  					GroupVersion: "storage.k8s.io/v1",
   155  					APIResources: []metav1.APIResource{
   156  						{
   157  							Name:       "storageclasses",
   158  							ShortNames: []string{"sc"},
   159  						},
   160  					},
   161  				},
   162  			},
   163  		},
   164  		{
   165  			in:       schema.GroupVersionResource{Group: "", Version: "", Resource: "sc"},
   166  			expected: schema.GroupVersionResource{Group: "storage.k8s.io", Version: "", Resource: "storageclasses"},
   167  			srvRes: []*metav1.APIResourceList{
   168  				{
   169  					GroupVersion: "storage.k8s.io/v1",
   170  					APIResources: []metav1.APIResource{
   171  						{
   172  							Name:       "storageclasses",
   173  							ShortNames: []string{"sc"},
   174  						},
   175  					},
   176  				},
   177  			},
   178  		},
   179  	}
   180  
   181  	for i, test := range tests {
   182  		ds := &fakeDiscoveryClient{}
   183  		ds.serverResourcesHandler = func() ([]*metav1.APIResourceList, error) {
   184  			return test.srvRes, nil
   185  		}
   186  
   187  		delegate := &fakeRESTMapper{}
   188  		mapper := NewShortcutExpander(delegate, ds)
   189  
   190  		mapper.KindFor(test.in)
   191  		if delegate.kindForInput != test.expected {
   192  			t.Errorf("%d: unexpected data returned %#v, expected %#v", i, delegate.kindForInput, test.expected)
   193  		}
   194  	}
   195  }
   196  
   197  type fakeRESTMapper struct {
   198  	kindForInput schema.GroupVersionResource
   199  }
   200  
   201  func (f *fakeRESTMapper) KindFor(resource schema.GroupVersionResource) (schema.GroupVersionKind, error) {
   202  	f.kindForInput = resource
   203  	return schema.GroupVersionKind{}, nil
   204  }
   205  
   206  func (f *fakeRESTMapper) KindsFor(resource schema.GroupVersionResource) ([]schema.GroupVersionKind, error) {
   207  	return nil, nil
   208  }
   209  
   210  func (f *fakeRESTMapper) ResourceFor(input schema.GroupVersionResource) (schema.GroupVersionResource, error) {
   211  	return schema.GroupVersionResource{}, nil
   212  }
   213  
   214  func (f *fakeRESTMapper) ResourcesFor(input schema.GroupVersionResource) ([]schema.GroupVersionResource, error) {
   215  	return nil, nil
   216  }
   217  
   218  func (f *fakeRESTMapper) RESTMapping(gk schema.GroupKind, versions ...string) (*meta.RESTMapping, error) {
   219  	return nil, nil
   220  }
   221  
   222  func (f *fakeRESTMapper) RESTMappings(gk schema.GroupKind, versions ...string) ([]*meta.RESTMapping, error) {
   223  	return nil, nil
   224  }
   225  
   226  func (f *fakeRESTMapper) ResourceSingularizer(resource string) (singular string, err error) {
   227  	return "", nil
   228  }
   229  
   230  type fakeDiscoveryClient struct {
   231  	serverResourcesHandler func() ([]*metav1.APIResourceList, error)
   232  }
   233  
   234  var _ discovery.DiscoveryInterface = &fakeDiscoveryClient{}
   235  
   236  func (c *fakeDiscoveryClient) RESTClient() restclient.Interface {
   237  	return &fake.RESTClient{}
   238  }
   239  
   240  func (c *fakeDiscoveryClient) ServerGroups() (*metav1.APIGroupList, error) {
   241  	return &metav1.APIGroupList{
   242  		Groups: []metav1.APIGroup{
   243  			{
   244  				Name: "a",
   245  				Versions: []metav1.GroupVersionForDiscovery{
   246  					{
   247  						GroupVersion: "a/v1",
   248  						Version:      "v1",
   249  					},
   250  				},
   251  				PreferredVersion: metav1.GroupVersionForDiscovery{
   252  					GroupVersion: "a/v1",
   253  					Version:      "v1",
   254  				},
   255  			},
   256  		},
   257  	}, nil
   258  }
   259  
   260  func (c *fakeDiscoveryClient) ServerResourcesForGroupVersion(groupVersion string) (*metav1.APIResourceList, error) {
   261  	if groupVersion == "a/v1" {
   262  		return &metav1.APIResourceList{APIResources: []metav1.APIResource{{Name: "widgets", Kind: "Widget"}}}, nil
   263  	}
   264  
   265  	return nil, errors.NewNotFound(schema.GroupResource{}, "")
   266  }
   267  
   268  // Deprecated: use ServerGroupsAndResources instead.
   269  func (c *fakeDiscoveryClient) ServerResources() ([]*metav1.APIResourceList, error) {
   270  	_, rs, err := c.ServerGroupsAndResources()
   271  	return rs, err
   272  }
   273  
   274  func (c *fakeDiscoveryClient) ServerGroupsAndResources() ([]*metav1.APIGroup, []*metav1.APIResourceList, error) {
   275  	sgs, err := c.ServerGroups()
   276  	if err != nil {
   277  		return nil, nil, err
   278  	}
   279  	resultGroups := []*metav1.APIGroup{}
   280  	for i := range sgs.Groups {
   281  		resultGroups = append(resultGroups, &sgs.Groups[i])
   282  	}
   283  	if c.serverResourcesHandler != nil {
   284  		rs, err := c.serverResourcesHandler()
   285  		return resultGroups, rs, err
   286  	}
   287  	return resultGroups, []*metav1.APIResourceList{}, nil
   288  }
   289  
   290  func (c *fakeDiscoveryClient) ServerPreferredResources() ([]*metav1.APIResourceList, error) {
   291  	return nil, nil
   292  }
   293  
   294  func (c *fakeDiscoveryClient) ServerPreferredNamespacedResources() ([]*metav1.APIResourceList, error) {
   295  	return nil, nil
   296  }
   297  
   298  func (c *fakeDiscoveryClient) ServerVersion() (*version.Info, error) {
   299  	return &version.Info{}, nil
   300  }
   301  
   302  func (c *fakeDiscoveryClient) OpenAPISchema() (*openapi_v2.Document, error) {
   303  	return &openapi_v2.Document{}, nil
   304  }