Skip to content

Commit 183de45

Browse files
authored
Merge pull request #3151 from alvaroaleman/fix-prefer
🐛 Restmapper: Respect preferred version
2 parents d82dcd8 + d724f7f commit 183de45

File tree

2 files changed

+42
-6
lines changed

2 files changed

+42
-6
lines changed

pkg/client/apiutil/restmapper.go

Lines changed: 14 additions & 6 deletions
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

Lines changed: 28 additions & 0 deletions
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"
@@ -740,6 +741,33 @@ func TestLazyRestMapperProvider(t *testing.T) {
740741
g.Expect(err).NotTo(gmg.HaveOccurred())
741742
g.Expect(mapping.Resource.Version).To(gmg.Equal("v1"))
742743
})
744+
745+
t.Run("Restmapper should consistently return the preferred version", func(t *testing.T) {
746+
g := gmg.NewWithT(t)
747+
748+
wg := sync.WaitGroup{}
749+
wg.Add(50)
750+
for i := 0; i < 50; i++ {
751+
go func() {
752+
defer wg.Done()
753+
httpClient, err := rest.HTTPClientFor(restCfg)
754+
g.Expect(err).NotTo(gmg.HaveOccurred())
755+
756+
mapper, err := apiutil.NewDynamicRESTMapper(restCfg, httpClient)
757+
g.Expect(err).NotTo(gmg.HaveOccurred())
758+
759+
mapping, err := mapper.RESTMapping(schema.GroupKind{
760+
Group: "crew.example.com",
761+
Kind: "Driver",
762+
})
763+
g.Expect(err).NotTo(gmg.HaveOccurred())
764+
// APIServer seems to have a heuristic to prefer the higher
765+
// version number.
766+
g.Expect(mapping.GroupVersionKind.Version).To(gmg.Equal("v2"))
767+
}()
768+
}
769+
wg.Wait()
770+
})
743771
})
744772
}
745773
}

0 commit comments

Comments
 (0)