mirror of
https://github.com/argoproj/argo-cd.git
synced 2026-02-20 01:28:45 +01:00
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:
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
})
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user