This commit reworks the `newRepoRegistry` func so that its easier to see that it is a variable so that it can be overriden by the tests. In the tests we want to use the `testrepos` we get from images and in the real implementation we want to use the full repo loader with search-paths and extra repos.
92 lines
2.6 KiB
Go
92 lines
2.6 KiB
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"io/fs"
|
|
"net/url"
|
|
|
|
"github.com/osbuild/images/data/repositories"
|
|
"github.com/osbuild/images/pkg/reporegistry"
|
|
"github.com/osbuild/images/pkg/rpmmd"
|
|
)
|
|
|
|
// defaultDataDirs contains the default search paths to look for
|
|
// repository data. They contain a bunch of json files of the form
|
|
// "$distro_$version".json (but that is an implementation detail that
|
|
// the "images" library takes care of).
|
|
var defaultDataDirs = []string{
|
|
"/etc/image-builder/repositories",
|
|
"/usr/share/image-builder/repositories",
|
|
}
|
|
|
|
type repoConfig struct {
|
|
DataDir string
|
|
ExtraRepos []string
|
|
}
|
|
|
|
func parseExtraRepo(extraRepo string) ([]rpmmd.RepoConfig, error) {
|
|
// We want to eventually support more URIs repos here:
|
|
// - config:/path/to/repo.json
|
|
// - copr:@osbuild/osbuild (with full gpg retrival via the copr API)
|
|
// But for now just default to base-urls
|
|
|
|
baseURL, err := url.Parse(extraRepo)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("cannot parse extra repo %w", err)
|
|
}
|
|
if baseURL.Scheme == "" {
|
|
return nil, fmt.Errorf(`scheme missing in %q, please prefix with e.g. file:`, extraRepo)
|
|
}
|
|
|
|
// TODO: to support gpg checking we will need to add signing keys.
|
|
// We will eventually add support for our own "repo.json" format
|
|
// which is rich enough to contain gpg keys (and more).
|
|
checkGPG := false
|
|
return []rpmmd.RepoConfig{
|
|
{
|
|
Id: baseURL.String(),
|
|
Name: baseURL.String(),
|
|
BaseURLs: []string{baseURL.String()},
|
|
CheckGPG: &checkGPG,
|
|
CheckRepoGPG: &checkGPG,
|
|
},
|
|
}, nil
|
|
}
|
|
|
|
func newRepoRegistryImpl(dataDir string, extraRepos []string) (*reporegistry.RepoRegistry, error) {
|
|
var dataDirs []string
|
|
if dataDir != "" {
|
|
dataDirs = []string{dataDir}
|
|
} else {
|
|
dataDirs = defaultDataDirs
|
|
}
|
|
|
|
conf, err := reporegistry.LoadAllRepositories(dataDirs, []fs.FS{repos.FS})
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
// XXX: this should probably go into manifestgen.Options as
|
|
// a new Options.ExtraRepoConf eventually (just like OverrideRepos)
|
|
for _, repo := range extraRepos {
|
|
// XXX: this loads the extra repo unconditionally to all
|
|
// distro/arch versions. we do not know in advance where
|
|
// it belongs to
|
|
extraRepo, err := parseExtraRepo(repo)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
for _, repoArchConfigs := range conf {
|
|
for arch := range repoArchConfigs {
|
|
archCfg := repoArchConfigs[arch]
|
|
archCfg = append(archCfg, extraRepo...)
|
|
repoArchConfigs[arch] = archCfg
|
|
}
|
|
}
|
|
}
|
|
|
|
return reporegistry.NewFromDistrosRepoConfigs(conf), nil
|
|
}
|
|
|
|
// this is a variable to make it overridable in tests
|
|
var newRepoRegistry = newRepoRegistryImpl
|