Skip to content

Commit ca2d236

Browse files
porridgek8s-infra-cherrypick-robot
authored and
k8s-infra-cherrypick-robot
committed
bug: Return NoResourceMatchError when appropriate for backwards compatibility.
1 parent b40bcb8 commit ca2d236

File tree

3 files changed

+76
-1
lines changed

3 files changed

+76
-1
lines changed

pkg/client/apiutil/errors.go

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
/*
2+
Copyright 2023 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 apiutil
18+
19+
import (
20+
"fmt"
21+
"sort"
22+
"strings"
23+
24+
apierrors "k8s.io/apimachinery/pkg/api/errors"
25+
"k8s.io/apimachinery/pkg/api/meta"
26+
27+
"k8s.io/apimachinery/pkg/runtime/schema"
28+
)
29+
30+
// ErrResourceDiscoveryFailed is returned if the RESTMapper cannot discover supported resources for some GroupVersions.
31+
// It wraps the errors encountered, except "NotFound" errors are replaced with meta.NoResourceMatchError, for
32+
// backwards compatibility with code that uses meta.IsNoMatchError() to check for unsupported APIs.
33+
type ErrResourceDiscoveryFailed map[schema.GroupVersion]error
34+
35+
// Error implements the error interface.
36+
func (e *ErrResourceDiscoveryFailed) Error() string {
37+
subErrors := []string{}
38+
for k, v := range *e {
39+
subErrors = append(subErrors, fmt.Sprintf("%s: %v", k, v))
40+
}
41+
sort.Strings(subErrors)
42+
return fmt.Sprintf("unable to retrieve the complete list of server APIs: %s", strings.Join(subErrors, ", "))
43+
}
44+
45+
func (e *ErrResourceDiscoveryFailed) Unwrap() []error {
46+
subErrors := []error{}
47+
for gv, err := range *e {
48+
if apierrors.IsNotFound(err) {
49+
err = &meta.NoResourceMatchError{PartialResource: gv.WithResource("")}
50+
}
51+
subErrors = append(subErrors, err)
52+
}
53+
return subErrors
54+
}

pkg/client/apiutil/restmapper.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -286,7 +286,8 @@ func (m *mapper) fetchGroupVersionResources(groupName string, versions ...string
286286
}
287287

288288
if len(failedGroups) > 0 {
289-
return nil, &discovery.ErrGroupDiscoveryFailed{Groups: failedGroups}
289+
err := ErrResourceDiscoveryFailed(failedGroups)
290+
return nil, &err
290291
}
291292

292293
return groupVersionResources, nil

pkg/client/apiutil/restmapper_test.go

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ import (
2121
"net/http"
2222
"testing"
2323

24+
"k8s.io/apimachinery/pkg/api/meta"
25+
2426
_ "github.com/onsi/ginkgo/v2"
2527
gmg "github.com/onsi/gomega"
2628

@@ -303,26 +305,32 @@ func TestLazyRestMapperProvider(t *testing.T) {
303305

304306
_, err = lazyRestMapper.RESTMapping(schema.GroupKind{Group: "INVALID1"}, "v1")
305307
g.Expect(err).To(gmg.HaveOccurred())
308+
g.Expect(meta.IsNoMatchError(err)).To(gmg.BeTrue())
306309
g.Expect(crt.GetRequestCount()).To(gmg.Equal(1))
307310

308311
_, err = lazyRestMapper.RESTMappings(schema.GroupKind{Group: "INVALID2"}, "v1")
309312
g.Expect(err).To(gmg.HaveOccurred())
313+
g.Expect(meta.IsNoMatchError(err)).To(gmg.BeTrue())
310314
g.Expect(crt.GetRequestCount()).To(gmg.Equal(2))
311315

312316
_, err = lazyRestMapper.KindFor(schema.GroupVersionResource{Group: "INVALID3", Version: "v1"})
313317
g.Expect(err).To(gmg.HaveOccurred())
318+
g.Expect(meta.IsNoMatchError(err)).To(gmg.BeTrue())
314319
g.Expect(crt.GetRequestCount()).To(gmg.Equal(3))
315320

316321
_, err = lazyRestMapper.KindsFor(schema.GroupVersionResource{Group: "INVALID4", Version: "v1"})
317322
g.Expect(err).To(gmg.HaveOccurred())
323+
g.Expect(meta.IsNoMatchError(err)).To(gmg.BeTrue())
318324
g.Expect(crt.GetRequestCount()).To(gmg.Equal(4))
319325

320326
_, err = lazyRestMapper.ResourceFor(schema.GroupVersionResource{Group: "INVALID5", Version: "v1"})
321327
g.Expect(err).To(gmg.HaveOccurred())
328+
g.Expect(meta.IsNoMatchError(err)).To(gmg.BeTrue())
322329
g.Expect(crt.GetRequestCount()).To(gmg.Equal(5))
323330

324331
_, err = lazyRestMapper.ResourcesFor(schema.GroupVersionResource{Group: "INVALID6", Version: "v1"})
325332
g.Expect(err).To(gmg.HaveOccurred())
333+
g.Expect(meta.IsNoMatchError(err)).To(gmg.BeTrue())
326334
g.Expect(crt.GetRequestCount()).To(gmg.Equal(6))
327335
})
328336

@@ -342,26 +350,32 @@ func TestLazyRestMapperProvider(t *testing.T) {
342350

343351
_, err = lazyRestMapper.RESTMapping(schema.GroupKind{Group: "apps", Kind: "INVALID"}, "v1")
344352
g.Expect(err).To(gmg.HaveOccurred())
353+
g.Expect(meta.IsNoMatchError(err)).To(gmg.BeTrue())
345354
g.Expect(crt.GetRequestCount()).To(gmg.Equal(1))
346355

347356
_, err = lazyRestMapper.RESTMappings(schema.GroupKind{Group: "", Kind: "INVALID"}, "v1")
348357
g.Expect(err).To(gmg.HaveOccurred())
358+
g.Expect(meta.IsNoMatchError(err)).To(gmg.BeTrue())
349359
g.Expect(crt.GetRequestCount()).To(gmg.Equal(2))
350360

351361
_, err = lazyRestMapper.KindFor(schema.GroupVersionResource{Group: "networking.k8s.io", Version: "v1", Resource: "INVALID"})
352362
g.Expect(err).To(gmg.HaveOccurred())
363+
g.Expect(meta.IsNoMatchError(err)).To(gmg.BeTrue())
353364
g.Expect(crt.GetRequestCount()).To(gmg.Equal(3))
354365

355366
_, err = lazyRestMapper.KindsFor(schema.GroupVersionResource{Group: "authentication.k8s.io", Version: "v1", Resource: "INVALID"})
356367
g.Expect(err).To(gmg.HaveOccurred())
368+
g.Expect(meta.IsNoMatchError(err)).To(gmg.BeTrue())
357369
g.Expect(crt.GetRequestCount()).To(gmg.Equal(4))
358370

359371
_, err = lazyRestMapper.ResourceFor(schema.GroupVersionResource{Group: "scheduling.k8s.io", Version: "v1", Resource: "INVALID"})
360372
g.Expect(err).To(gmg.HaveOccurred())
373+
g.Expect(meta.IsNoMatchError(err)).To(gmg.BeTrue())
361374
g.Expect(crt.GetRequestCount()).To(gmg.Equal(5))
362375

363376
_, err = lazyRestMapper.ResourcesFor(schema.GroupVersionResource{Group: "policy", Version: "v1", Resource: "INVALID"})
364377
g.Expect(err).To(gmg.HaveOccurred())
378+
g.Expect(meta.IsNoMatchError(err)).To(gmg.BeTrue())
365379
g.Expect(crt.GetRequestCount()).To(gmg.Equal(6))
366380
})
367381

@@ -381,26 +395,32 @@ func TestLazyRestMapperProvider(t *testing.T) {
381395

382396
_, err = lazyRestMapper.RESTMapping(schema.GroupKind{Group: "apps", Kind: "deployment"}, "INVALID")
383397
g.Expect(err).To(gmg.HaveOccurred())
398+
g.Expect(meta.IsNoMatchError(err)).To(gmg.BeTrue())
384399
g.Expect(crt.GetRequestCount()).To(gmg.Equal(1))
385400

386401
_, err = lazyRestMapper.RESTMappings(schema.GroupKind{Group: "", Kind: "pod"}, "INVALID")
387402
g.Expect(err).To(gmg.HaveOccurred())
403+
g.Expect(meta.IsNoMatchError(err)).To(gmg.BeTrue())
388404
g.Expect(crt.GetRequestCount()).To(gmg.Equal(2))
389405

390406
_, err = lazyRestMapper.KindFor(schema.GroupVersionResource{Group: "networking.k8s.io", Version: "INVALID", Resource: "ingresses"})
391407
g.Expect(err).To(gmg.HaveOccurred())
408+
g.Expect(meta.IsNoMatchError(err)).To(gmg.BeTrue())
392409
g.Expect(crt.GetRequestCount()).To(gmg.Equal(3))
393410

394411
_, err = lazyRestMapper.KindsFor(schema.GroupVersionResource{Group: "authentication.k8s.io", Version: "INVALID", Resource: "tokenreviews"})
395412
g.Expect(err).To(gmg.HaveOccurred())
413+
g.Expect(meta.IsNoMatchError(err)).To(gmg.BeTrue())
396414
g.Expect(crt.GetRequestCount()).To(gmg.Equal(4))
397415

398416
_, err = lazyRestMapper.ResourceFor(schema.GroupVersionResource{Group: "scheduling.k8s.io", Version: "INVALID", Resource: "priorityclasses"})
399417
g.Expect(err).To(gmg.HaveOccurred())
418+
g.Expect(meta.IsNoMatchError(err)).To(gmg.BeTrue())
400419
g.Expect(crt.GetRequestCount()).To(gmg.Equal(5))
401420

402421
_, err = lazyRestMapper.ResourcesFor(schema.GroupVersionResource{Group: "policy", Version: "INVALID", Resource: "poddisruptionbudgets"})
403422
g.Expect(err).To(gmg.HaveOccurred())
423+
g.Expect(meta.IsNoMatchError(err)).To(gmg.BeTrue())
404424
g.Expect(crt.GetRequestCount()).To(gmg.Equal(6))
405425
})
406426

0 commit comments

Comments
 (0)