Skip to content

Commit

Permalink
v1: fix getting baseurl for content sources upload repos
Browse files Browse the repository at this point in the history
These repositories don't have the `Url` set, only the
`LatestSnapshotUrl` is set.
  • Loading branch information
croissanne committed Feb 14, 2025
1 parent 725c4d6 commit 4c5f95c
Show file tree
Hide file tree
Showing 5 changed files with 112 additions and 4 deletions.
18 changes: 18 additions & 0 deletions internal/clients/content_sources/util.go
Original file line number Diff line number Diff line change
@@ -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)
}
39 changes: 39 additions & 0 deletions internal/clients/content_sources/util_test.go
Original file line number Diff line number Diff line change
@@ -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)
}
18 changes: 14 additions & 4 deletions internal/v1/handler_compose_image.go
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down Expand Up @@ -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 {
Expand Down
20 changes: 20 additions & 0 deletions internal/v1/handler_post_compose_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -1763,6 +1763,9 @@ func TestComposeCustomizations(t *testing.T) {
{
Id: common.ToPtr(mocks.RepoPLID3),
},
{
Id: common.ToPtr(mocks.RepoUplID),
},
},
CustomRepositories: &[]v1.CustomRepository{
{
Expand All @@ -1780,6 +1783,9 @@ func TestComposeCustomizations(t *testing.T) {
Gpgkey: &[]string{"some-gpg-key"},
CheckGpg: common.ToPtr(true),
},
{
Id: mocks.RepoUplID,
},
},
},
Distribution: "centos-9",
Expand Down Expand Up @@ -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{
{
Expand All @@ -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{
Expand Down
21 changes: 21 additions & 0 deletions internal/v1/mocks/content_sources.go
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down Expand Up @@ -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"),
})
}

Expand All @@ -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"),
})
}

Expand All @@ -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{
Expand Down Expand Up @@ -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,
Expand Down

0 comments on commit 4c5f95c

Please sign in to comment.