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 }