diff --git a/cyclops-ctrl/internal/controller/templates.go b/cyclops-ctrl/internal/controller/templates.go index 69c828ed..ed7e5dad 100644 --- a/cyclops-ctrl/internal/controller/templates.go +++ b/cyclops-ctrl/internal/controller/templates.go @@ -212,17 +212,23 @@ func (c *Templates) GetTemplateRevisions(ctx *gin.Context) { ctx.Header("Access-Control-Allow-Origin", "*") repo := ctx.Query("repo") + path := ctx.Query("path") if repo == "" { ctx.JSON(http.StatusOK, []string{}) return } - revisions, err := c.templatesRepo.GetTemplateRevisions(repo) + revisions, err := c.templatesRepo.GetTemplateRevisions(repo, path) if err != nil { ctx.JSON(http.StatusBadRequest, dto.NewError("Error loading template", err.Error())) return } + if revisions == nil { + ctx.JSON(http.StatusOK, []string{}) + return + } + ctx.JSON(http.StatusOK, revisions) } diff --git a/cyclops-ctrl/mocks/ITemplateRepo.go b/cyclops-ctrl/mocks/ITemplateRepo.go index 019ea92f..b72af244 100644 --- a/cyclops-ctrl/mocks/ITemplateRepo.go +++ b/cyclops-ctrl/mocks/ITemplateRepo.go @@ -146,9 +146,9 @@ func (_c *ITemplateRepo_GetTemplateInitialValues_Call) RunAndReturn(run func(str return _c } -// GetTemplateRevisions provides a mock function with given fields: repo -func (_m *ITemplateRepo) GetTemplateRevisions(repo string) ([]string, error) { - ret := _m.Called(repo) +// GetTemplateRevisions provides a mock function with given fields: repo, path +func (_m *ITemplateRepo) GetTemplateRevisions(repo string, path string) ([]string, error) { + ret := _m.Called(repo, path) if len(ret) == 0 { panic("no return value specified for GetTemplateRevisions") @@ -156,19 +156,19 @@ func (_m *ITemplateRepo) GetTemplateRevisions(repo string) ([]string, error) { var r0 []string var r1 error - if rf, ok := ret.Get(0).(func(string) ([]string, error)); ok { - return rf(repo) + if rf, ok := ret.Get(0).(func(string, string) ([]string, error)); ok { + return rf(repo, path) } - if rf, ok := ret.Get(0).(func(string) []string); ok { - r0 = rf(repo) + if rf, ok := ret.Get(0).(func(string, string) []string); ok { + r0 = rf(repo, path) } else { if ret.Get(0) != nil { r0 = ret.Get(0).([]string) } } - if rf, ok := ret.Get(1).(func(string) error); ok { - r1 = rf(repo) + if rf, ok := ret.Get(1).(func(string, string) error); ok { + r1 = rf(repo, path) } else { r1 = ret.Error(1) } @@ -183,13 +183,14 @@ type ITemplateRepo_GetTemplateRevisions_Call struct { // GetTemplateRevisions is a helper method to define mock.On call // - repo string -func (_e *ITemplateRepo_Expecter) GetTemplateRevisions(repo interface{}) *ITemplateRepo_GetTemplateRevisions_Call { - return &ITemplateRepo_GetTemplateRevisions_Call{Call: _e.mock.On("GetTemplateRevisions", repo)} +// - path string +func (_e *ITemplateRepo_Expecter) GetTemplateRevisions(repo interface{}, path interface{}) *ITemplateRepo_GetTemplateRevisions_Call { + return &ITemplateRepo_GetTemplateRevisions_Call{Call: _e.mock.On("GetTemplateRevisions", repo, path)} } -func (_c *ITemplateRepo_GetTemplateRevisions_Call) Run(run func(repo string)) *ITemplateRepo_GetTemplateRevisions_Call { +func (_c *ITemplateRepo_GetTemplateRevisions_Call) Run(run func(repo string, path string)) *ITemplateRepo_GetTemplateRevisions_Call { _c.Call.Run(func(args mock.Arguments) { - run(args[0].(string)) + run(args[0].(string), args[1].(string)) }) return _c } @@ -199,7 +200,7 @@ func (_c *ITemplateRepo_GetTemplateRevisions_Call) Return(_a0 []string, _a1 erro return _c } -func (_c *ITemplateRepo_GetTemplateRevisions_Call) RunAndReturn(run func(string) ([]string, error)) *ITemplateRepo_GetTemplateRevisions_Call { +func (_c *ITemplateRepo_GetTemplateRevisions_Call) RunAndReturn(run func(string, string) ([]string, error)) *ITemplateRepo_GetTemplateRevisions_Call { _c.Call.Return(run) return _c } diff --git a/cyclops-ctrl/pkg/template/oci.go b/cyclops-ctrl/pkg/template/oci.go index 1fc98f28..c4c8de30 100644 --- a/cyclops-ctrl/pkg/template/oci.go +++ b/cyclops-ctrl/pkg/template/oci.go @@ -226,14 +226,23 @@ func fetchDigest(repo, chart, version, token string) (string, error) { } func getOCIStrictVersion(repo, chart, version string) (string, error) { - token, err := authorizeOCITags(repo, chart) + allTags, err := GetOCIChartTags(repo, chart) if err != nil { return "", err } + return resolveSemver(version, allTags) +} + +func GetOCIChartTags(repo, chart string) ([]string, error) { + token, err := authorizeOCITags(repo, chart) + if err != nil { + return nil, err + } + tURL, err := tagsURL(repo, chart) if err != nil { - return "", err + return nil, err } client := &http.Client{} @@ -241,7 +250,7 @@ func getOCIStrictVersion(repo, chart, version string) (string, error) { for { req, err := http.NewRequest(http.MethodGet, tURL.String(), nil) if err != nil { - return "", err + return nil, err } req.Header.Set("User-Agent", "Helm/3.13.3") @@ -251,13 +260,13 @@ func getOCIStrictVersion(repo, chart, version string) (string, error) { resp, err := client.Do(req) if err != nil { - return "", err + return nil, err } defer resp.Body.Close() responseBody, err := ioutil.ReadAll(resp.Body) if err != nil { - return "", err + return nil, err } var tagsResp struct { @@ -265,7 +274,7 @@ func getOCIStrictVersion(repo, chart, version string) (string, error) { } if err := json.Unmarshal(responseBody, &tagsResp); err != nil { - return "", err + return nil, err } allTags = append(allTags, tagsResp.Tags...) @@ -278,7 +287,7 @@ func getOCIStrictVersion(repo, chart, version string) (string, error) { nextURL, err := parseNextLink(linkHeader) if err != nil { - return "", err + return nil, err } if nextURL == "" { @@ -287,11 +296,11 @@ func getOCIStrictVersion(repo, chart, version string) (string, error) { tURL, err = resolveRelativeURL(tURL, nextURL) if err != nil { - return "", err + return nil, err } } - return resolveSemver(version, allTags) + return allTags, err } func authorizeOCI(repo, chart, version string) (string, error) { diff --git a/cyclops-ctrl/pkg/template/template.go b/cyclops-ctrl/pkg/template/template.go index f3114e20..dc84fb81 100644 --- a/cyclops-ctrl/pkg/template/template.go +++ b/cyclops-ctrl/pkg/template/template.go @@ -30,7 +30,7 @@ type ITemplateRepo interface { version string, source cyclopsv1alpha1.TemplateSourceType, ) (map[string]interface{}, error) - GetTemplateRevisions(repo string) ([]string, error) + GetTemplateRevisions(repo, path string) ([]string, error) ReturnCache() *ristretto.Cache } @@ -181,7 +181,11 @@ func (r Repo) assumeTemplateSourceType(repo string) (cyclopsv1alpha1.TemplateSou return cyclopsv1alpha1.TemplateSourceTypeGit, nil } -func (r Repo) GetTemplateRevisions(repo string) ([]string, error) { +func (r Repo) GetTemplateRevisions(repo, path string) ([]string, error) { + if registry.IsOCI(repo) { + return GetOCIChartTags(repo, path) + } + if !gitproviders2.IsGitHubSource(repo) { return nil, nil } diff --git a/cyclops-ui/src/components/pages/TemplateStore/TemplateStore.tsx b/cyclops-ui/src/components/pages/TemplateStore/TemplateStore.tsx index dfa65b73..a214cd9f 100644 --- a/cyclops-ui/src/components/pages/TemplateStore/TemplateStore.tsx +++ b/cyclops-ui/src/components/pages/TemplateStore/TemplateStore.tsx @@ -350,21 +350,29 @@ const TemplateStore = () => { ); }; - const fetchRepoRevisions = (e) => { + const fetchRepoRevisions = () => { + const repo = addForm.getFieldValue(["ref", "repo"]); + const path = addForm.getFieldValue(["ref", "path"]); + axios - .get(`/api/templates/revisions?repo=` + e.target.value) + .get(`/api/templates/revisions?repo=${repo}&path=${path}`) .then((res) => { setRepoRevisions(res.data); + + const filtered = res.data.map((item) => ({ value: item })); + setRepoRevisionOptions(filtered); }) .catch(() => {}); }; - const handleRepoInput = (value) => { + const handleVersionInput = (value) => { if (repoRevisions.length === 0) { setRepoRevisionOptions([]); return; } + console.log(value); + const filtered = repoRevisions .filter((item) => item.toLowerCase().includes(value.toLowerCase())) .map((item) => ({ value: item })); @@ -670,7 +678,7 @@ const TemplateStore = () => { rules={[{ required: true, message: "Path is required" }]} style={{ marginBottom: "12px" }} > - +