From 4c5f95cb33079226fff7d5a706c3f50d1160e965 Mon Sep 17 00:00:00 2001 From: Sanne Raymaekers Date: Wed, 12 Feb 2025 19:02:38 +0100 Subject: [PATCH] v1: fix getting baseurl for content sources upload repos These repositories don't have the `Url` set, only the `LatestSnapshotUrl` is set. --- internal/clients/content_sources/util.go | 18 +++++++++ internal/clients/content_sources/util_test.go | 39 +++++++++++++++++++ internal/v1/handler_compose_image.go | 18 +++++++-- internal/v1/handler_post_compose_test.go | 20 ++++++++++ internal/v1/mocks/content_sources.go | 21 ++++++++++ 5 files changed, 112 insertions(+), 4 deletions(-) create mode 100644 internal/clients/content_sources/util.go create mode 100644 internal/clients/content_sources/util_test.go diff --git a/internal/clients/content_sources/util.go b/internal/clients/content_sources/util.go new file mode 100644 index 000000000..0d889595c --- /dev/null +++ b/internal/clients/content_sources/util.go @@ -0,0 +1,18 @@ +package content_sources + +import ( + "fmt" +) + +func GetBaseURL(repo ApiRepositoryResponse) (string, error) { + if repo.Origin == nil { + return "", fmt.Errorf("unable to read origin from repository %s", *repo.Uuid) + } + switch *repo.Origin { + case "upload": + return *repo.LatestSnapshotUrl, nil + case "external", "red_hat": + return *repo.Url, nil + } + return "", fmt.Errorf("unknown origin on content sources repository %s, origin: %s", *repo.Uuid, *repo.Origin) +} diff --git a/internal/clients/content_sources/util_test.go b/internal/clients/content_sources/util_test.go new file mode 100644 index 000000000..5e4354fa8 --- /dev/null +++ b/internal/clients/content_sources/util_test.go @@ -0,0 +1,39 @@ +package content_sources_test + +import ( + "testing" + + "github.com/stretchr/testify/require" + + "github.com/osbuild/image-builder/internal/clients/content_sources" + "github.com/osbuild/image-builder/internal/common" +) + +func TestGetBaseURL(t *testing.T) { + url, err := content_sources.GetBaseURL(content_sources.ApiRepositoryResponse{ + Url: common.ToPtr("someurl"), + Origin: common.ToPtr("external"), + }) + require.NoError(t, err) + require.Equal(t, "someurl", url) + + url, err = content_sources.GetBaseURL(content_sources.ApiRepositoryResponse{ + Url: common.ToPtr("someurl"), + Origin: common.ToPtr("red_hat"), + }) + require.NoError(t, err) + require.Equal(t, "someurl", url) + + url, err = content_sources.GetBaseURL(content_sources.ApiRepositoryResponse{ + Url: common.ToPtr("someurl"), + LatestSnapshotUrl: common.ToPtr("realurl"), + Origin: common.ToPtr("upload"), + }) + require.NoError(t, err) + require.Equal(t, "realurl", url) + + _, err = content_sources.GetBaseURL(content_sources.ApiRepositoryResponse{ + Uuid: common.ToPtr("d15a0c50-1549-4d04-bcb8-b3553576acd4"), + }) + require.Error(t, err) +} diff --git a/internal/v1/handler_compose_image.go b/internal/v1/handler_compose_image.go index 13c15f374..c03f88b39 100644 --- a/internal/v1/handler_compose_image.go +++ b/internal/v1/handler_compose_image.go @@ -340,8 +340,13 @@ func (h *Handlers) buildPayloadRepositories(ctx echo.Context, payloadRepos []Rep } if pyrepo.Baseurl != nil { res[i].Baseurl = pyrepo.Baseurl - } else if repo.Url != nil { - res[i].Baseurl = repo.Url + } else if repo.Uuid != nil { + // If the repo was found in content sources, its uuid will be set + baseurl, err := content_sources.GetBaseURL(repo) + if err != nil { + return nil, err + } + res[i].Baseurl = common.ToPtr(baseurl) } if pyrepo.CheckGpg != nil { @@ -408,8 +413,13 @@ func (h *Handlers) buildCustomRepositories(ctx echo.Context, custRepos []CustomR if curepo.Baseurl != nil { res[i].Baseurl = curepo.Baseurl - } else if repo.Url != nil { - res[i].Baseurl = common.ToPtr([]string{*repo.Url}) + } else if repo.Uuid != nil { + // If the repo was found in content sources, its uuid will be set + baseurl, err := content_sources.GetBaseURL(repo) + if err != nil { + return nil, err + } + res[i].Baseurl = common.ToPtr([]string{baseurl}) } if curepo.CheckGpg != nil { diff --git a/internal/v1/handler_post_compose_test.go b/internal/v1/handler_post_compose_test.go index fc4451885..f83fc7c31 100644 --- a/internal/v1/handler_post_compose_test.go +++ b/internal/v1/handler_post_compose_test.go @@ -1763,6 +1763,9 @@ func TestComposeCustomizations(t *testing.T) { { Id: common.ToPtr(mocks.RepoPLID3), }, + { + Id: common.ToPtr(mocks.RepoUplID), + }, }, CustomRepositories: &[]v1.CustomRepository{ { @@ -1780,6 +1783,9 @@ func TestComposeCustomizations(t *testing.T) { Gpgkey: &[]string{"some-gpg-key"}, CheckGpg: common.ToPtr(true), }, + { + Id: mocks.RepoUplID, + }, }, }, Distribution: "centos-9", @@ -1811,6 +1817,13 @@ func TestComposeCustomizations(t *testing.T) { CheckRepoGpg: common.ToPtr(false), Rhsm: common.ToPtr(false), }, + { + Baseurl: common.ToPtr("https://upload-latest-snapshot-url.org"), + Gpgkey: common.ToPtr("some-gpg-key"), + CheckGpg: common.ToPtr(true), + CheckRepoGpg: common.ToPtr(false), + Rhsm: common.ToPtr(false), + }, }, CustomRepositories: &[]composer.CustomRepository{ { @@ -1831,6 +1844,13 @@ func TestComposeCustomizations(t *testing.T) { Gpgkey: &[]string{"some-gpg-key"}, CheckGpg: common.ToPtr(true), }, + { + Id: mocks.RepoUplID, + Name: common.ToPtr("upload"), + Baseurl: &[]string{"https://upload-latest-snapshot-url.org"}, + Gpgkey: &[]string{"some-gpg-key"}, + CheckGpg: common.ToPtr(true), + }, }, }, ImageRequest: &composer.ImageRequest{ diff --git a/internal/v1/mocks/content_sources.go b/internal/v1/mocks/content_sources.go index af2dc739e..bd78a57ed 100644 --- a/internal/v1/mocks/content_sources.go +++ b/internal/v1/mocks/content_sources.go @@ -23,6 +23,7 @@ var ( RepoPLID = "a7ec8864-0e3c-4af2-8c06-567891280af5" RepoPLID2 = "c01c2d9c-4624-4558-9ca9-8abcc5eb4437" RepoPLID3 = "d064585d-5d25-4e10-88d0-9ab4d192b21d" + RepoUplID = "7fa07d5a-3df4-4c83-bfe3-79633a0ad27d" ) func rhRepos(ids []string, urls []string) (res []content_sources.ApiRepositoryResponse) { @@ -57,6 +58,7 @@ func extRepos(ids []string, urls []string) (res []content_sources.ApiRepositoryR Url: common.ToPtr("https://some-repo-base-url.org"), Snapshot: common.ToPtr(true), Name: common.ToPtr("payload"), + Origin: common.ToPtr("external"), }) } @@ -66,6 +68,7 @@ func extRepos(ids []string, urls []string) (res []content_sources.ApiRepositoryR Url: common.ToPtr("https://some-repo-base-url2.org"), Snapshot: common.ToPtr(true), Name: common.ToPtr("payload2"), + Origin: common.ToPtr("external"), }) } @@ -76,12 +79,29 @@ func extRepos(ids []string, urls []string) (res []content_sources.ApiRepositoryR Url: common.ToPtr("https://some-repo-base-url3.org"), Snapshot: common.ToPtr(true), Name: common.ToPtr("payload3"), + Origin: common.ToPtr("external"), }) } return res } +func uploadRepos(ids []string, urls []string) (res []content_sources.ApiRepositoryResponse) { + if slices.Contains(urls, "https://upload-latest-snapshot-url.org") || slices.Contains(ids, RepoUplID) { + // upload repositories have an empty URL + res = append(res, content_sources.ApiRepositoryResponse{ + GpgKey: common.ToPtr("some-gpg-key"), + Uuid: common.ToPtr(RepoUplID), + Url: common.ToPtr(""), + LatestSnapshotUrl: common.ToPtr("https://upload-latest-snapshot-url.org"), + Snapshot: common.ToPtr(true), + Name: common.ToPtr("upload"), + Origin: common.ToPtr("upload"), + }) + } + return res +} + func snaps(uuids []string) (res []content_sources.ApiSnapshotForDate) { if slices.Contains(uuids, RepoBaseID) { res = append(res, content_sources.ApiSnapshotForDate{ @@ -205,6 +225,7 @@ func ContentSources(w http.ResponseWriter, r *http.Request) { repos = append(repos, rhRepos(ids, urls)...) case "external,upload": repos = append(repos, extRepos(ids, urls)...) + repos = append(repos, uploadRepos(ids, urls)...) } err := json.NewEncoder(w).Encode(content_sources.ApiRepositoryCollectionResponse{ Data: &repos,