Modify composer to use RepoRegistry, instead of loading the host repositories, when initializing WeldrAPI. Modify WeldrAPI to use RepoRegistry, instead of a map of repository definitions. Make sure that the RepoRegistry method specific to image type is used in Welder where appropriate. Specifically when depsolving a Blueprint, which is used to build a specific image type. Update Weldr API unit tests to reflect the change. Add a new method to RepoRegistry, allowing to get list of repositories, which should be used for building an image for a given architecture, without specifying the exact image type. Add relevant unit tests. Signed-off-by: Tomas Hozza <thozza@redhat.com>
404 lines
10 KiB
Go
404 lines
10 KiB
Go
package reporegistry
|
|
|
|
import (
|
|
"reflect"
|
|
"testing"
|
|
|
|
"github.com/osbuild/osbuild-composer/internal/distro"
|
|
"github.com/osbuild/osbuild-composer/internal/distro/test_distro"
|
|
"github.com/osbuild/osbuild-composer/internal/rpmmd"
|
|
"github.com/stretchr/testify/assert"
|
|
)
|
|
|
|
func getTestingRepoRegistry() *RepoRegistry {
|
|
return &RepoRegistry{
|
|
map[string]map[string][]rpmmd.RepoConfig{
|
|
test_distro.TestDistroName: {
|
|
test_distro.TestArchName: {
|
|
{
|
|
Name: "baseos",
|
|
BaseURL: "https://cdn.redhat.com/content/dist/rhel8/8/x86_64/baseos/os",
|
|
},
|
|
{
|
|
Name: "appstream",
|
|
BaseURL: "https://cdn.redhat.com/content/dist/rhel8/8/x86_64/appstream/os",
|
|
},
|
|
},
|
|
test_distro.TestArch2Name: {
|
|
{
|
|
Name: "baseos",
|
|
BaseURL: "https://cdn.redhat.com/content/dist/rhel8/8/aarch64/baseos/os",
|
|
},
|
|
{
|
|
Name: "appstream",
|
|
BaseURL: "https://cdn.redhat.com/content/dist/rhel8/8/aarch64/appstream/os",
|
|
ImageTypeTags: []string{},
|
|
},
|
|
{
|
|
Name: "google-compute-engine",
|
|
BaseURL: "https://packages.cloud.google.com/yum/repos/google-compute-engine-el8-x86_64-stable",
|
|
ImageTypeTags: []string{test_distro.TestImageType2Name},
|
|
},
|
|
{
|
|
Name: "google-cloud-sdk",
|
|
BaseURL: "https://packages.cloud.google.com/yum/repos/cloud-sdk-el8-x86_64",
|
|
ImageTypeTags: []string{test_distro.TestImageType2Name},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
}
|
|
}
|
|
|
|
func TestReposByImageType_reposByImageTypeName(t *testing.T) {
|
|
rr := getTestingRepoRegistry()
|
|
testDistro := test_distro.New()
|
|
|
|
ta, _ := testDistro.GetArch(test_distro.TestArchName)
|
|
ta2, _ := testDistro.GetArch(test_distro.TestArch2Name)
|
|
|
|
ta_it, _ := ta.GetImageType(test_distro.TestImageTypeName)
|
|
|
|
ta2_it, _ := ta2.GetImageType(test_distro.TestImageTypeName)
|
|
ta2_it2, _ := ta2.GetImageType(test_distro.TestImageType2Name)
|
|
|
|
type args struct {
|
|
input distro.ImageType
|
|
}
|
|
tests := []struct {
|
|
name string
|
|
args args
|
|
want []string
|
|
}{
|
|
{
|
|
name: "NoAdditionalReposNeeded_NoAdditionalReposDefined",
|
|
args: args{
|
|
input: ta_it,
|
|
},
|
|
want: []string{"baseos", "appstream"},
|
|
},
|
|
{
|
|
name: "NoAdditionalReposNeeded_AdditionalReposDefined",
|
|
args: args{
|
|
input: ta2_it,
|
|
},
|
|
want: []string{"baseos", "appstream"},
|
|
},
|
|
{
|
|
name: "AdditionalReposNeeded_AdditionalReposDefined",
|
|
args: args{
|
|
input: ta2_it2,
|
|
},
|
|
want: []string{"baseos", "appstream", "google-compute-engine", "google-cloud-sdk"},
|
|
},
|
|
}
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
got, err := rr.ReposByImageType(tt.args.input)
|
|
assert.Nil(t, err)
|
|
|
|
var gotNames []string
|
|
for _, r := range got {
|
|
gotNames = append(gotNames, r.Name)
|
|
}
|
|
|
|
if !reflect.DeepEqual(gotNames, tt.want) {
|
|
t.Errorf("ReposByImageType() =\n got: %#v\n want: %#v", gotNames, tt.want)
|
|
}
|
|
|
|
got, err = rr.reposByImageTypeName(tt.args.input.Arch().Distro().Name(), tt.args.input.Arch().Name(), tt.args.input.Name())
|
|
assert.Nil(t, err)
|
|
gotNames = []string{}
|
|
for _, r := range got {
|
|
gotNames = append(gotNames, r.Name)
|
|
}
|
|
|
|
if !reflect.DeepEqual(gotNames, tt.want) {
|
|
t.Errorf("reposByImageTypeName() =\n got: %#v\n want: %#v", gotNames, tt.want)
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
// TestInvalidReposByImageType tests return values from ReposByImageType
|
|
// for invalid values
|
|
func TestInvalidReposByImageType(t *testing.T) {
|
|
rr := getTestingRepoRegistry()
|
|
|
|
ti := test_distro.TestImageType{}
|
|
|
|
repos, err := rr.ReposByImageType(&ti)
|
|
assert.Nil(t, repos)
|
|
assert.NotNil(t, err)
|
|
}
|
|
|
|
// TestInvalidReposByImageTypeName tests return values from reposByImageTypeName
|
|
// for invalid distro name, arch and image type
|
|
func TestInvalidReposByImageTypeName(t *testing.T) {
|
|
rr := getTestingRepoRegistry()
|
|
|
|
type args struct {
|
|
distro string
|
|
arch string
|
|
imageType string
|
|
}
|
|
tests := []struct {
|
|
name string
|
|
args args
|
|
want func(repos []rpmmd.RepoConfig, err error) bool
|
|
}{
|
|
{
|
|
name: "invalid distro, valid arch and image type",
|
|
args: args{
|
|
distro: test_distro.TestDistroName + "-invalid",
|
|
arch: test_distro.TestArchName,
|
|
imageType: test_distro.TestImageTypeName,
|
|
},
|
|
want: func(repos []rpmmd.RepoConfig, err error) bool {
|
|
// the list of repos should be nil and an error should be returned
|
|
if repos != nil || err == nil {
|
|
return false
|
|
}
|
|
return true
|
|
},
|
|
},
|
|
{
|
|
name: "invalid arch, valid distro and image type",
|
|
args: args{
|
|
distro: test_distro.TestDistroName,
|
|
arch: test_distro.TestArchName + "-invalid",
|
|
imageType: test_distro.TestImageTypeName,
|
|
},
|
|
want: func(repos []rpmmd.RepoConfig, err error) bool {
|
|
// the list of repos should be nil and an error should be returned
|
|
if repos != nil || err == nil {
|
|
return false
|
|
}
|
|
return true
|
|
},
|
|
},
|
|
{
|
|
name: "invalid image type, valid distro and arch, without tagged repos",
|
|
args: args{
|
|
distro: test_distro.TestDistroName,
|
|
arch: test_distro.TestArchName,
|
|
imageType: test_distro.TestImageTypeName + "-invalid",
|
|
},
|
|
want: func(repos []rpmmd.RepoConfig, err error) bool {
|
|
// a non-empty list of repos should be returned without an error
|
|
if repos == nil || err != nil {
|
|
return false
|
|
}
|
|
// only the list of common distro-arch repos should be returned
|
|
// these are repos without any explicit imageType tag
|
|
if len(repos) != 2 {
|
|
return false
|
|
}
|
|
return true
|
|
},
|
|
},
|
|
{
|
|
name: "invalid image type, valid distro and arch, with tagged repos",
|
|
args: args{
|
|
distro: test_distro.TestDistroName,
|
|
arch: test_distro.TestArch2Name,
|
|
imageType: test_distro.TestImageTypeName + "-invalid",
|
|
},
|
|
want: func(repos []rpmmd.RepoConfig, err error) bool {
|
|
// a non-empty list of repos should be returned without an error
|
|
if repos == nil || err != nil {
|
|
return false
|
|
}
|
|
// only the list of common distro-arch repos should be returned
|
|
// these are repos without any explicit imageType tag
|
|
if len(repos) != 2 {
|
|
return false
|
|
}
|
|
return true
|
|
},
|
|
},
|
|
}
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
got, err := rr.reposByImageTypeName(tt.args.distro, tt.args.arch, tt.args.imageType)
|
|
assert.True(t, tt.want(got, err))
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestReposByArch(t *testing.T) {
|
|
rr := getTestingRepoRegistry()
|
|
testDistro := test_distro.New()
|
|
|
|
ta, _ := testDistro.GetArch(test_distro.TestArchName)
|
|
ta2, _ := testDistro.GetArch(test_distro.TestArch2Name)
|
|
|
|
type args struct {
|
|
arch distro.Arch
|
|
taggedRepos bool
|
|
}
|
|
tests := []struct {
|
|
name string
|
|
args args
|
|
want []string
|
|
}{
|
|
{
|
|
name: "Test Arch 1, without tagged repos",
|
|
args: args{
|
|
arch: ta,
|
|
taggedRepos: false,
|
|
},
|
|
want: []string{"baseos", "appstream"},
|
|
},
|
|
{
|
|
name: "Test Arch 1, with tagged repos",
|
|
args: args{
|
|
arch: ta,
|
|
taggedRepos: true,
|
|
},
|
|
want: []string{"baseos", "appstream"},
|
|
},
|
|
{
|
|
name: "Test Arch 2, without tagged repos",
|
|
args: args{
|
|
arch: ta2,
|
|
taggedRepos: false,
|
|
},
|
|
want: []string{"baseos", "appstream"},
|
|
},
|
|
{
|
|
name: "Test Arch 2, with tagged repos",
|
|
args: args{
|
|
arch: ta2,
|
|
taggedRepos: true,
|
|
},
|
|
want: []string{"baseos", "appstream", "google-compute-engine", "google-cloud-sdk"},
|
|
},
|
|
}
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
got, err := rr.ReposByArch(tt.args.arch, tt.args.taggedRepos)
|
|
assert.Nil(t, err)
|
|
|
|
var gotNames []string
|
|
for _, r := range got {
|
|
gotNames = append(gotNames, r.Name)
|
|
}
|
|
|
|
if !reflect.DeepEqual(gotNames, tt.want) {
|
|
t.Errorf("ReposByArch() =\n got: %#v\n want: %#v", gotNames, tt.want)
|
|
}
|
|
|
|
got, err = rr.reposByArchName(tt.args.arch.Distro().Name(), tt.args.arch.Name(), tt.args.taggedRepos)
|
|
assert.Nil(t, err)
|
|
gotNames = []string{}
|
|
for _, r := range got {
|
|
gotNames = append(gotNames, r.Name)
|
|
}
|
|
|
|
if !reflect.DeepEqual(gotNames, tt.want) {
|
|
t.Errorf("reposByArchName() =\n got: %#v\n want: %#v", gotNames, tt.want)
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
// TestInvalidReposByArch tests return values from ReposByArch
|
|
// for invalid arch value
|
|
func TestInvalidReposByArch(t *testing.T) {
|
|
rr := getTestingRepoRegistry()
|
|
|
|
ta := test_distro.TestArch{}
|
|
|
|
repos, err := rr.ReposByArch(&ta, false)
|
|
assert.Nil(t, repos)
|
|
assert.NotNil(t, err)
|
|
|
|
repos, err = rr.ReposByArch(&ta, true)
|
|
assert.Nil(t, repos)
|
|
assert.NotNil(t, err)
|
|
}
|
|
|
|
// TestInvalidReposByArchName tests return values from reposByArchName
|
|
// for invalid distro name and arch
|
|
func TestInvalidReposByArchName(t *testing.T) {
|
|
rr := getTestingRepoRegistry()
|
|
|
|
type args struct {
|
|
distro string
|
|
arch string
|
|
taggedRepos bool
|
|
}
|
|
tests := []struct {
|
|
name string
|
|
args args
|
|
want func(repos []rpmmd.RepoConfig, err error) bool
|
|
}{
|
|
{
|
|
name: "invalid distro, valid arch, without tagged repos",
|
|
args: args{
|
|
distro: test_distro.TestDistroName + "-invalid",
|
|
arch: test_distro.TestArch2Name,
|
|
taggedRepos: false,
|
|
},
|
|
want: func(repos []rpmmd.RepoConfig, err error) bool {
|
|
// the list of repos should be nil and an error should be returned
|
|
if repos != nil || err == nil {
|
|
return false
|
|
}
|
|
return true
|
|
},
|
|
},
|
|
{
|
|
name: "invalid distro, valid arch, with tagged repos",
|
|
args: args{
|
|
distro: test_distro.TestDistroName + "-invalid",
|
|
arch: test_distro.TestArch2Name,
|
|
taggedRepos: true,
|
|
},
|
|
want: func(repos []rpmmd.RepoConfig, err error) bool {
|
|
// the list of repos should be nil and an error should be returned
|
|
if repos != nil || err == nil {
|
|
return false
|
|
}
|
|
return true
|
|
},
|
|
},
|
|
{
|
|
name: "invalid arch, valid distro, without tagged repos",
|
|
args: args{
|
|
distro: test_distro.TestDistroName,
|
|
arch: test_distro.TestArch2Name + "-invalid",
|
|
taggedRepos: false,
|
|
},
|
|
want: func(repos []rpmmd.RepoConfig, err error) bool {
|
|
// the list of repos should be nil and an error should be returned
|
|
if repos != nil || err == nil {
|
|
return false
|
|
}
|
|
return true
|
|
},
|
|
},
|
|
{
|
|
name: "invalid arch, valid distro, with tagged repos",
|
|
args: args{
|
|
distro: test_distro.TestDistroName,
|
|
arch: test_distro.TestArch2Name + "-invalid",
|
|
taggedRepos: true,
|
|
},
|
|
want: func(repos []rpmmd.RepoConfig, err error) bool {
|
|
// the list of repos should be nil and an error should be returned
|
|
if repos != nil || err == nil {
|
|
return false
|
|
}
|
|
return true
|
|
},
|
|
},
|
|
}
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
got, err := rr.reposByArchName(tt.args.distro, tt.args.arch, tt.args.taggedRepos)
|
|
assert.True(t, tt.want(got, err))
|
|
})
|
|
}
|
|
}
|