fix: helm GetTags cache writing (#23865)

Signed-off-by: Matthew Clarke <mclarke@spotify.com>
Co-authored-by: Linghao Su <linghao.su@daocloud.io>
This commit is contained in:
Matthew Clarke
2025-07-26 22:02:46 +00:00
committed by GitHub
parent 5d0a4f0dd3
commit 041122c6df
2 changed files with 97 additions and 1 deletions

View File

@@ -485,7 +485,11 @@ func (c *nativeHelmChart) GetTags(chart string, noCache bool) (*TagsList, error)
).Info("took to get tags")
if c.indexCache != nil {
if err := c.indexCache.SetHelmIndex(tagsURL, data); err != nil {
cacheData, err := json.Marshal(entries)
if err != nil {
return nil, fmt.Errorf("failed to encode tags: %w", err)
}
if err := c.indexCache.SetHelmIndex(tagsURL, cacheData); err != nil {
log.Warnf("Failed to store tags list cache for repo: %s: %v", tagsURL, err)
}
}

View File

@@ -373,3 +373,95 @@ func TestGetTagsFromURLEnvironmentAuthentication(t *testing.T) {
})
}
}
func TestGetTagsCaching(t *testing.T) {
requestCount := 0
server := httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
requestCount++
t.Logf("request %d called %s", requestCount, r.URL.Path)
responseTags := fakeTagsList{
Tags: []string{
"1.0.0",
"1.1.0",
"2.0.0_beta",
},
}
w.Header().Set("Content-Type", "application/json")
w.WriteHeader(http.StatusOK)
require.NoError(t, json.NewEncoder(w).Encode(responseTags))
}))
t.Cleanup(server.Close)
serverURL, err := url.Parse(server.URL)
require.NoError(t, err)
t.Run("should cache tags correctly", func(t *testing.T) {
cache := &fakeIndexCache{}
client := NewClient(serverURL.Host, HelmCreds{
InsecureSkipVerify: true,
}, true, "", "", WithIndexCache(cache))
tags1, err := client.GetTags("mychart", false)
require.NoError(t, err)
assert.ElementsMatch(t, tags1, []string{
"1.0.0",
"1.1.0",
"2.0.0+beta",
})
assert.Equal(t, 1, requestCount)
requestCount = 0
tags2, err := client.GetTags("mychart", false)
require.NoError(t, err)
assert.ElementsMatch(t, tags2, []string{
"1.0.0",
"1.1.0",
"2.0.0+beta",
})
assert.Equal(t, 0, requestCount)
assert.NotEmpty(t, cache.data)
type entriesStruct struct {
Tags []string
}
var entries entriesStruct
err = json.Unmarshal(cache.data, &entries)
require.NoError(t, err)
assert.ElementsMatch(t, entries.Tags, []string{
"1.0.0",
"1.1.0",
"2.0.0+beta",
})
})
t.Run("should bypass cache when noCache is true", func(t *testing.T) {
cache := &fakeIndexCache{}
client := NewClient(serverURL.Host, HelmCreds{
InsecureSkipVerify: true,
}, true, "", "", WithIndexCache(cache))
requestCount = 0
tags1, err := client.GetTags("mychart", true)
require.NoError(t, err)
assert.ElementsMatch(t, tags1, []string{
"1.0.0",
"1.1.0",
"2.0.0+beta",
})
assert.Equal(t, 1, requestCount)
tags2, err := client.GetTags("mychart", true)
require.NoError(t, err)
assert.ElementsMatch(t, tags2, []string{
"1.0.0",
"1.1.0",
"2.0.0+beta",
})
assert.Equal(t, 2, requestCount)
})
}