Skip to content

Commit 50ae490

Browse files
authored
Merge pull request #3159 from k8s-infra-cherrypick-robot/cherry-pick-3151-to-release-0.20
[release-0.20] 🐛 Restmapper: Respect preferred version
2 parents bd9c786 + dfd1239 commit 50ae490

File tree

2 files changed

+42
-6
lines changed

2 files changed

+42
-6
lines changed

pkg/client/apiutil/restmapper.go

+14-6
Original file line numberDiff line numberDiff line change
@@ -246,10 +246,18 @@ func (m *mapper) addGroupVersionResourcesToCacheAndReloadLocked(gvr map[schema.G
246246
}
247247

248248
if !found {
249-
groupResources.Group.Versions = append(groupResources.Group.Versions, metav1.GroupVersionForDiscovery{
249+
gv := metav1.GroupVersionForDiscovery{
250250
GroupVersion: metav1.GroupVersion{Group: groupVersion.Group, Version: version}.String(),
251251
Version: version,
252-
})
252+
}
253+
254+
// Prepend if preferred version, else append. The upstream DiscoveryRestMappper assumes
255+
// the first version is the preferred one: https://github.com/kubernetes/kubernetes/blob/ef54ac803b712137871c1a1f8d635d50e69ffa6c/staging/src/k8s.io/apimachinery/pkg/api/meta/restmapper.go#L458-L461
256+
if group, ok := m.apiGroups[groupVersion.Group]; ok && group.PreferredVersion.Version == version {
257+
groupResources.Group.Versions = append([]metav1.GroupVersionForDiscovery{gv}, groupResources.Group.Versions...)
258+
} else {
259+
groupResources.Group.Versions = append(groupResources.Group.Versions, gv)
260+
}
253261
}
254262

255263
// Update data in the cache.
@@ -284,14 +292,14 @@ func (m *mapper) findAPIGroupByNameAndMaybeAggregatedDiscoveryLocked(groupName s
284292
}
285293

286294
m.initialDiscoveryDone = true
287-
if len(maybeResources) > 0 {
288-
didAggregatedDiscovery = true
289-
m.addGroupVersionResourcesToCacheAndReloadLocked(maybeResources)
290-
}
291295
for i := range apiGroups.Groups {
292296
group := &apiGroups.Groups[i]
293297
m.apiGroups[group.Name] = group
294298
}
299+
if len(maybeResources) > 0 {
300+
didAggregatedDiscovery = true
301+
m.addGroupVersionResourcesToCacheAndReloadLocked(maybeResources)
302+
}
295303

296304
// Looking in the cache again.
297305
// Don't return an error here if the API group is not present.

pkg/client/apiutil/restmapper_test.go

+28
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import (
2121
"fmt"
2222
"net/http"
2323
"strconv"
24+
"sync"
2425
"testing"
2526

2627
_ "github.com/onsi/ginkgo/v2"
@@ -735,6 +736,33 @@ func TestLazyRestMapperProvider(t *testing.T) {
735736
g.Expect(err).NotTo(gmg.HaveOccurred())
736737
g.Expect(mapping.Resource.Version).To(gmg.Equal("v1"))
737738
})
739+
740+
t.Run("Restmapper should consistently return the preferred version", func(t *testing.T) {
741+
g := gmg.NewWithT(t)
742+
743+
wg := sync.WaitGroup{}
744+
wg.Add(50)
745+
for i := 0; i < 50; i++ {
746+
go func() {
747+
defer wg.Done()
748+
httpClient, err := rest.HTTPClientFor(restCfg)
749+
g.Expect(err).NotTo(gmg.HaveOccurred())
750+
751+
mapper, err := apiutil.NewDynamicRESTMapper(restCfg, httpClient)
752+
g.Expect(err).NotTo(gmg.HaveOccurred())
753+
754+
mapping, err := mapper.RESTMapping(schema.GroupKind{
755+
Group: "crew.example.com",
756+
Kind: "Driver",
757+
})
758+
g.Expect(err).NotTo(gmg.HaveOccurred())
759+
// APIServer seems to have a heuristic to prefer the higher
760+
// version number.
761+
g.Expect(mapping.GroupVersionKind.Version).To(gmg.Equal("v2"))
762+
}()
763+
}
764+
wg.Wait()
765+
})
738766
})
739767
}
740768
}

0 commit comments

Comments
 (0)