Skip to content
This repository was archived by the owner on Jul 16, 2021. It is now read-only.

Commit eaaa13f

Browse files
samifruit514prydonius
authored andcommitted
bug fixes: in memory allCharts map was not updated on chart refresh (#452)
* bug fix: in memory allCharts map was not updated on chart refresh * test for single chart refresh that covers case when a new version is available * missing delete function in charts mock * test mock
1 parent 277e2e3 commit eaaa13f

File tree

5 files changed

+82
-5
lines changed

5 files changed

+82
-5
lines changed

src/api/data/cache/cache.go

Lines changed: 43 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,38 @@ func (c *cachedCharts) Search(params charts.SearchChartsParams) ([]*swaggermodel
129129
return ret, nil
130130
}
131131

132+
// deleteChart is the interface implementation for data.Charts
133+
// It deletes Chart from memory
134+
// NOTE: This method does not delete from filesystem for now. It is used to test single chart refresh
135+
func (c *cachedCharts) DeleteChart(repoName string, chartName string, chartVersion string) error {
136+
137+
db, closer := c.dbSession.DB()
138+
defer closer()
139+
140+
repo, err := models.GetRepo(db, repoName)
141+
if err != nil {
142+
return err
143+
}
144+
145+
c.rwm.Lock()
146+
147+
for k, chart := range c.allCharts[repoName] {
148+
149+
if *chart.Name == chartName && *chart.Version == chartVersion {
150+
log.WithFields(log.Fields{
151+
"path": charthelper.DataDirBase(),
152+
}).Info(chartName + " - " + chartVersion + " deleted")
153+
154+
c.allCharts[repo.Name] = append(c.allCharts[repo.Name][:k], c.allCharts[repo.Name][k+1:]...)
155+
break
156+
}
157+
}
158+
159+
c.rwm.Unlock()
160+
161+
return nil
162+
}
163+
132164
// Refresh is the interface implementation for data.Charts
133165
// It refreshes cached data for a specific repo and chart
134166
func (c *cachedCharts) RefreshChart(repoName string, chartName string) error {
@@ -150,22 +182,29 @@ func (c *cachedCharts) RefreshChart(repoName string, chartName string) error {
150182
}
151183

152184
didUpdate := false
153-
for _, chart := range charts {
154-
if *chart.Name == chartName {
185+
var alreadyExists bool
186+
for _, chartFromIndex := range charts {
187+
if *chartFromIndex.Name == chartName {
155188
didUpdate = true
156189
ch := make(chan chanItem, len(charts))
157190
defer close(ch)
158-
go processChartMetadata(chart, repo.URL, ch)
191+
go processChartMetadata(chartFromIndex, repo.URL, ch)
159192

160193
it := <-ch
161194
if it.err == nil {
162195
c.rwm.Lock()
163196
// find the key
197+
alreadyExists = false
164198
for k, chart := range c.allCharts[repo.Name] {
165-
if chart.Name == it.chart.Name && chart.Version == it.chart.Version {
199+
if *chart.Name == *it.chart.Name && *chart.Version == *it.chart.Version {
166200
c.allCharts[repo.Name][k] = it.chart
201+
alreadyExists = true
202+
break
167203
}
168204
}
205+
if alreadyExists == false {
206+
c.allCharts[repo.Name] = append(c.allCharts[repo.Name], it.chart)
207+
}
169208
c.rwm.Unlock()
170209
} else {
171210
return it.err

src/api/data/cache/cache_test.go

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,29 @@ func TestCachedChartsRefreshChart(t *testing.T) {
107107
assert.NoErr(t, err)
108108
}
109109

110+
func TestCachedChartsRefreshChartAddsNewVersion(t *testing.T) {
111+
// Stubs Download and processing
112+
DownloadAndExtractChartTarballOrig := charthelper.DownloadAndExtractChartTarball
113+
defer func() { charthelper.DownloadAndExtractChartTarball = DownloadAndExtractChartTarballOrig }()
114+
charthelper.DownloadAndExtractChartTarball = func(chart *swaggermodels.ChartPackage, repoURL string) error { return nil }
115+
116+
DownloadAndProcessChartIconOrig := charthelper.DownloadAndProcessChartIcon
117+
defer func() { charthelper.DownloadAndProcessChartIcon = DownloadAndProcessChartIconOrig }()
118+
charthelper.DownloadAndProcessChartIcon = func(chart *swaggermodels.ChartPackage) error { return nil }
119+
120+
chart, err := chartsImplementation.ChartVersionFromRepo("stable", "datadog", "0.1.0")
121+
assert.NoErr(t, err)
122+
123+
err = chartsImplementation.DeleteChart("stable", *chart.Name, *chart.Version)
124+
assert.NoErr(t, err)
125+
126+
_, err = chartsImplementation.ChartVersionFromRepo("stable", *chart.Name, *chart.Version)
127+
assert.Err(t, err, errors.New("didn't find version "+*chart.Version+" of chart "+*chart.Name+"\n"))
128+
129+
err = chartsImplementation.RefreshChart("stable", *chart.Name)
130+
assert.NoErr(t, err)
131+
}
132+
110133
func TestCachedChartsRefreshChartRepoNotFound(t *testing.T) {
111134
// Stubs Download and processing
112135
DownloadAndExtractChartTarballOrig := charthelper.DownloadAndExtractChartTarball

src/api/data/charts.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,5 +21,6 @@ type Charts interface {
2121
Search(params charts.SearchChartsParams) ([]*models.ChartPackage, error)
2222
// Refresh freshens charts data
2323
Refresh() error
24-
RefreshChart(Repo string, ChartName string) error
24+
RefreshChart(Repo string, chartName string) error
25+
DeleteChart(Repo string, chartName string, version string) error
2526
}

src/api/mocks/charts.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ type MockedMethods struct {
1616
All func() ([]*models.ChartPackage, error)
1717
Search func(params chartsapi.SearchChartsParams) ([]*models.ChartPackage, error)
1818
RefreshChart func(repoName string, chartName string) error
19+
DeleteChart func(repoName string, chartName string, version string) error
1920
}
2021

2122
// mockCharts fulfills the data.Charts interface
@@ -146,13 +147,21 @@ func (c *mockCharts) Search(params chartsapi.SearchChartsParams) ([]*models.Char
146147
func (c *mockCharts) Refresh() error {
147148
return nil
148149
}
150+
149151
func (c *mockCharts) RefreshChart(repoName string, chartName string) error {
150152
if c.mockedMethods.RefreshChart != nil {
151153
return c.mockedMethods.RefreshChart(repoName, chartName)
152154
}
153155
return nil
154156
}
155157

158+
func (c *mockCharts) DeleteChart(repoName string, chartName string, version string) error {
159+
if c.mockedMethods.DeleteChart != nil {
160+
return c.mockedMethods.DeleteChart(repoName, chartName, version)
161+
}
162+
return nil
163+
}
164+
156165
// getMockRepo is a convenience that loads a yaml repo from the filesystem
157166
func getMockRepo(repo string) ([]byte, error) {
158167
path, _ := getTestDataWd()

src/api/mocks/charts_test.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,3 +114,8 @@ func TestMockChartsRefreshChart(t *testing.T) {
114114
err := chartsImplementation.RefreshChart(testutil.RepoName, testutil.ChartName)
115115
assert.NoErr(t, err)
116116
}
117+
118+
func TestMockChartsDeleteChart(t *testing.T) {
119+
err := chartsImplementation.DeleteChart(testutil.RepoName, testutil.ChartName, testutil.ChartVersionString)
120+
assert.NoErr(t, err)
121+
}

0 commit comments

Comments
 (0)